2 * Copyright (c) 1990,1993 Regents of The University of Michigan.
3 * All Rights Reserved. See COPYRIGHT.
8 #endif /* HAVE_CONFIG_H */
13 #include <sys/types.h>
14 #include <atalk/logger.h>
15 #include <netatalk/endian.h>
16 #include <netinet/in.h>
17 #include <afs/venus.h>
18 #include <afs/afsint.h>
19 #include <atalk/afp.h>
22 #endif /* HAVE_UNISTD_H */
26 #include "directory.h"
31 int afs_getvolspace(struct vol *vol, VolSpace *bfree, VolSpace *btotal, uint32_t *bsize)
34 struct VolumeStatus *vs;
35 char venuspace[ sizeof( struct VolumeStatus ) + 3 ];
39 vi.out_size = sizeof( venuspace );
41 if ( pioctl( vol->v_path, VIOCGETVOLSTAT, &vi, 1 ) < 0 ) {
42 return( AFPERR_PARAM );
45 vs = (struct VolumeStatus *)venuspace;
47 if ( vs->PartBlocksAvail > 0 ) {
48 if ( vs->MaxQuota != 0 ) {
52 #define min(x,y) (((x)<(y))?(x):(y))
53 free = min( vs->MaxQuota - vs->BlocksInUse, vs->PartBlocksAvail );
55 free = vs->PartBlocksAvail;
61 if ( vs->MaxQuota != 0 ) {
62 total = free + vs->BlocksInUse;
64 total = vs->PartMaxBlocks;
68 *bfree = (VolSpace) free * 1024;
69 *btotal = (VolSpace) total * 1024;
74 int afp_getdiracl(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen)
84 memcpy( &vid, ibuf, sizeof( vid ));
85 ibuf += sizeof( short );
86 if (( vol = getvolbyvid( vid )) == NULL ) {
88 return( AFPERR_PARAM );
91 memcpy( &did, ibuf, sizeof( did ));
92 ibuf += sizeof( int );
93 if (( dir = dirlookup( vol, did )) == NULL ) {
98 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
100 return get_afp_errno(AFPERR_PARAM);
102 if ( *path->m_name != '\0' ) {
104 return (path_isadir( path))? afp_errno: AFPERR_BITMAP;
108 vi.out_size = *rbuflen;
110 if ( pioctl( ".", VIOCGETAL, &vi, 1 ) < 0 ) {
112 return( AFPERR_PARAM );
114 *rbuflen = strlen( vi.out ) + 1;
119 * Calculate the mode for a directory in AFS. First, make sure the
120 * directory is in AFS. Could probably use something less heavy than
121 * VIOCGETAL. If the directory is on AFS, use access() calls to
122 * estimate permission, a la mdw.
128 void afsmode(const struct volume *vol, char *path, struct maccess *ma, struct dir *dir, struct stat *st)
133 if (( dir->d_flags & DIRF_FSMASK ) == DIRF_NOFS ) {
135 vi.out_size = sizeof( buf );
137 if ( pioctl( path, VIOCGETAL, &vi, 1 ) < 0 ) {
138 dir->d_flags |= DIRF_UFS;
140 dir->d_flags |= DIRF_AFS;
144 if (( dir->d_flags & DIRF_FSMASK ) != DIRF_AFS ) {
148 accessmode(vol, path, ma, dir, st );
153 extern struct dir *curdir;
155 * cmd | 0 | vid | did | pathtype | pathname | 0 | acl
157 int afp_setdiracl(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen)
168 iend = ibuf + ibuflen;
170 memcpy( &vid, ibuf, sizeof( vid ));
171 ibuf += sizeof( short );
172 if (( vol = getvolbyvid( vid )) == NULL ) {
174 return( AFPERR_PARAM );
177 memcpy( &did, ibuf, sizeof( did ));
178 ibuf += sizeof( int );
179 if (( dir = dirlookup( vol, did )) == NULL ) {
184 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
186 return get_afp_errno(AFPERR_PARAM);
188 if ( *path->m_name != '\0' ) {
190 return (path_isadir( path))? afp_errno: AFPERR_BITMAP;
193 if ((int)ibuf & 1 ) {
197 vi.in_size = iend - ibuf;
201 if ( pioctl( ".", VIOCSETAL, &vi, 1 ) < 0 ) {
203 return( AFPERR_PARAM );
205 pioctl( ".AppleDouble", VIOCSETAL, &vi, 1 );
206 if ( curdir->d_did == DIRDID_ROOT ) {
207 pioctl( ".AppleDesktop", VIOCSETAL, &vi, 1 );
218 #include <afs/kauth.h>
219 #include <afs/kautils.h>
221 extern C_Block seskey;
222 extern Key_schedule seskeysched;
224 int afp_afschangepw(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen)
226 char name[ MAXKTCNAMELEN ], instance[ MAXKTCNAMELEN ];
227 char realm[ MAXKTCREALMLEN ];
228 char oldpw[ 9 ], newpw[ 9 ];
231 struct ktc_encryptionKey oldkey, newkey;
232 struct ktc_token adtok;
233 struct ubik_client *conn;
237 len = (unsigned char) *ibuf++;
239 *name = *instance = *realm = '\0';
240 ka_ParseLoginName( ibuf, name, instance, realm );
242 if ( *realm == '\0' ) {
243 if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
244 LOG(log_error, logtype_afpd, "krb_get_lrealm failed" );
245 return( AFPERR_BADUAM );
249 if ( strlen( name ) < 2 || strlen( name ) > 18 ) {
250 return( AFPERR_PARAM );
254 memcpy( &clen, ibuf, sizeof( clen ));
255 clen = ntohs( clen );
256 if ( clen % 8 != 0 ) {
257 return( AFPERR_PARAM );
260 ibuf += sizeof( short );
261 pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf,
262 clen, seskeysched, seskey, DES_DECRYPT );
264 len = (unsigned char) *ibuf++;
266 return( AFPERR_PARAM );
268 memset( oldpw, 0, sizeof( oldpw ));
269 memcpy( oldpw, ibuf, len );
273 len = (unsigned char) *ibuf++;
275 return( AFPERR_PARAM );
277 memset( newpw, 0, sizeof( newpw ));
278 memcpy( newpw, ibuf, len );
282 LOG(log_info, logtype_afpd,
283 "changing password for <%s>.<%s>@<%s>", name, instance, realm );
285 ka_StringToKey( oldpw, realm, &oldkey );
286 memset( oldpw, 0, sizeof( oldpw ));
287 ka_StringToKey( newpw, realm, &newkey );
288 memset( newpw, 0, sizeof( newpw ));
290 rc = ka_GetAdminToken( name, instance, realm, &oldkey, 60, &adtok, 0 );
291 memset( &oldkey, 0, sizeof( oldkey ));
296 memset( &newkey, 0, sizeof( newkey ));
297 return( AFPERR_NOTAUTH );
299 memset( &newkey, 0, sizeof( newkey ));
300 return( AFPERR_BADUAM );
302 if ( ka_AuthServerConn( realm, KA_MAINTENANCE_SERVICE, &adtok, &conn )
304 memset( &newkey, 0, sizeof( newkey ));
305 return( AFPERR_BADUAM );
308 rc = ka_ChangePassword( name, instance, conn, 0, &newkey );
309 memset( &newkey, 0, sizeof( newkey ));
311 return( AFPERR_BADUAM );
314 LOG(log_debug, logtype_afpd, "password changed succeeded" );
318 #endif /* UAM_AFSKRB */