2 * Copyright (c) 1990,1993 Regents of The University of Michigan.
3 * All Rights Reserved. See COPYRIGHT.
10 #include <sys/syslog.h>
11 #include <netatalk/endian.h>
12 #include <netinet/in.h>
13 #include <afs/venus.h>
14 #include <afs/afsint.h>
15 #include <atalk/afp.h>
19 #include "directory.h"
23 afs_getvolspace( vol, bfree, btotal, bsize )
25 VolSpace *bfree, *btotal;
29 struct VolumeStatus *vs;
30 char venuspace[ sizeof( struct VolumeStatus ) + 3 ];
34 vi.out_size = sizeof( venuspace );
36 if ( pioctl( vol->v_path, VIOCGETVOLSTAT, &vi, 1 ) < 0 ) {
37 return( AFPERR_PARAM );
40 vs = (struct VolumeStatus *)venuspace;
42 if ( vs->PartBlocksAvail > 0 ) {
43 if ( vs->MaxQuota != 0 ) {
44 #define min(x,y) (((x)<(y))?(x):(y))
45 free = min( vs->MaxQuota - vs->BlocksInUse, vs->PartBlocksAvail );
47 free = vs->PartBlocksAvail;
53 if ( vs->MaxQuota != 0 ) {
54 total = free + vs->BlocksInUse;
56 total = vs->PartMaxBlocks;
60 *bfree = (VolSpace) free * 1024;
61 *btotal = (VolSpace) total * 1024;
66 afp_getdiracl(obj, ibuf, ibuflen, rbuf, rbuflen )
69 int ibuflen, *rbuflen;
79 memcpy( &vid, ibuf, sizeof( vid ));
80 ibuf += sizeof( short );
81 if (( vol = getvolbyvid( vid )) == NULL ) {
83 return( AFPERR_PARAM );
86 memcpy( &did, ibuf, sizeof( did ));
87 ibuf += sizeof( int );
88 if (( dir = dirsearch( vol, did )) == NULL ) {
90 return( AFPERR_NOOBJ );
93 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
95 return( AFPERR_NOOBJ );
97 if ( *path != '\0' ) {
99 return( AFPERR_BITMAP );
103 vi.out_size = *rbuflen;
105 if ( pioctl( ".", VIOCGETAL, &vi, 1 ) < 0 ) {
107 return( AFPERR_PARAM );
109 *rbuflen = strlen( vi.out ) + 1;
114 * Calculate the mode for a directory in AFS. First, make sure the
115 * directory is in AFS. Could probably use something less heavy than
116 * VIOCGETAL. If the directory is on AFS, use access() calls to
117 * estimate permission, a la mdw.
119 afsmode( path, ma, dir )
127 if (( dir->d_flags & DIRF_FSMASK ) == DIRF_NOFS ) {
129 vi.out_size = sizeof( buf );
131 if ( pioctl( path, VIOCGETAL, &vi, 1 ) < 0 ) {
132 dir->d_flags |= DIRF_UFS;
134 dir->d_flags |= DIRF_AFS;
138 if (( dir->d_flags & DIRF_FSMASK ) != DIRF_AFS ) {
142 if ( access( path, R_OK|W_OK|X_OK ) == 0 ) {
143 ma->ma_user = AR_UREAD|AR_UWRITE|AR_USEARCH|AR_UOWN;
144 ma->ma_owner = AR_UREAD|AR_UWRITE|AR_USEARCH;
145 } else if ( access( path, R_OK|X_OK ) == 0 ) {
146 ma->ma_user = AR_UREAD|AR_USEARCH;
147 ma->ma_owner = AR_UREAD|AR_USEARCH;
149 ma->ma_user = ma->ma_owner = 0;
150 if ( access( path, R_OK ) == 0 ) {
151 ma->ma_user |= AR_UREAD;
152 ma->ma_owner |= AR_UREAD;
154 if ( access( path, X_OK ) == 0 ) {
155 ma->ma_user |= AR_USEARCH;
156 ma->ma_owner |= AR_USEARCH;
158 if ( access( path, W_OK ) == 0 ) {
159 ma->ma_user |= AR_UWRITE|AR_UOWN;
160 ma->ma_owner |= AR_UWRITE;
167 extern struct dir *curdir;
169 * cmd | 0 | vid | did | pathtype | pathname | 0 | acl
171 afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen )
174 int ibuflen, *rbuflen;
184 iend = ibuf + ibuflen;
186 memcpy( &vid, ibuf, sizeof( vid ));
187 ibuf += sizeof( short );
188 if (( vol = getvolbyvid( vid )) == NULL ) {
190 return( AFPERR_PARAM );
193 memcpy( &did, ibuf, sizeof( did ));
194 ibuf += sizeof( int );
195 if (( dir = dirsearch( vol, did )) == NULL ) {
197 return( AFPERR_NOOBJ );
200 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
202 return( AFPERR_NOOBJ );
204 if ( *path != '\0' ) {
206 return( AFPERR_BITMAP );
209 if ((int)ibuf & 1 ) {
213 vi.in_size = iend - ibuf;
217 if ( pioctl( ".", VIOCSETAL, &vi, 1 ) < 0 ) {
219 return( AFPERR_PARAM );
221 pioctl( ".AppleDouble", VIOCSETAL, &vi, 1 );
222 if ( curdir->d_did == DIRDID_ROOT ) {
223 pioctl( ".AppleDesktop", VIOCSETAL, &vi, 1 );
234 #include <afs/kauth.h>
235 #include <afs/kautils.h>
237 extern C_Block seskey;
238 extern Key_schedule seskeysched;
240 afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen )
243 int ibuflen, *rbuflen;
245 char name[ MAXKTCNAMELEN ], instance[ MAXKTCNAMELEN ];
246 char realm[ MAXKTCREALMLEN ];
247 char oldpw[ 9 ], newpw[ 9 ];
250 struct ktc_encryptionKey oldkey, newkey;
251 struct ktc_token adtok;
252 struct ubik_client *conn;
256 len = (unsigned char) *ibuf++;
258 *name = *instance = *realm = '\0';
259 ka_ParseLoginName( ibuf, name, instance, realm );
261 if ( *realm == '\0' ) {
262 if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
263 syslog( LOG_ERR, "krb_get_lrealm failed" );
264 return( AFPERR_BADUAM );
268 if ( strlen( name ) < 2 || strlen( name ) > 18 ) {
269 return( AFPERR_PARAM );
273 memcpy( &clen, ibuf, sizeof( clen ));
274 clen = ntohs( clen );
275 if ( clen % 8 != 0 ) {
276 return( AFPERR_PARAM );
279 ibuf += sizeof( short );
280 pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf,
281 clen, seskeysched, seskey, DES_DECRYPT );
283 len = (unsigned char) *ibuf++;
285 return( AFPERR_PARAM );
287 memset( oldpw, 0, sizeof( oldpw ));
288 memcpy( oldpw, ibuf, len );
292 len = (unsigned char) *ibuf++;
294 return( AFPERR_PARAM );
296 memset( newpw, 0, sizeof( newpw ));
297 memcpy( newpw, ibuf, len );
302 "changing password for <%s>.<%s>@<%s>", name, instance, realm );
304 ka_StringToKey( oldpw, realm, &oldkey );
305 memset( oldpw, 0, sizeof( oldpw ));
306 ka_StringToKey( newpw, realm, &newkey );
307 memset( newpw, 0, sizeof( newpw ));
309 rc = ka_GetAdminToken( name, instance, realm, &oldkey, 60, &adtok, 0 );
310 memset( &oldkey, 0, sizeof( oldkey ));
315 memset( &newkey, 0, sizeof( newkey ));
316 return( AFPERR_NOTAUTH );
318 memset( &newkey, 0, sizeof( newkey ));
319 return( AFPERR_BADUAM );
321 if ( ka_AuthServerConn( realm, KA_MAINTENANCE_SERVICE, &adtok, &conn )
323 memset( &newkey, 0, sizeof( newkey ));
324 return( AFPERR_BADUAM );
327 rc = ka_ChangePassword( name, instance, conn, 0, &newkey );
328 memset( &newkey, 0, sizeof( newkey ));
330 return( AFPERR_BADUAM );
333 syslog( LOG_DEBUG, "password changed succeeded" );