2 * Copyright (c) 1990,1993 Regents of The University of Michigan.
3 * All Rights Reserved. See COPYRIGHT.
13 #include <sys/types.h>
14 #include <sys/syslog.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>
23 #include "directory.h"
27 afs_getvolspace( vol, bfree, btotal, bsize )
29 VolSpace *bfree, *btotal;
33 struct VolumeStatus *vs;
34 char venuspace[ sizeof( struct VolumeStatus ) + 3 ];
38 vi.out_size = sizeof( venuspace );
40 if ( pioctl( vol->v_path, VIOCGETVOLSTAT, &vi, 1 ) < 0 ) {
41 return( AFPERR_PARAM );
44 vs = (struct VolumeStatus *)venuspace;
46 if ( vs->PartBlocksAvail > 0 ) {
47 if ( vs->MaxQuota != 0 ) {
48 #define min(x,y) (((x)<(y))?(x):(y))
49 free = min( vs->MaxQuota - vs->BlocksInUse, vs->PartBlocksAvail );
51 free = vs->PartBlocksAvail;
57 if ( vs->MaxQuota != 0 ) {
58 total = free + vs->BlocksInUse;
60 total = vs->PartMaxBlocks;
64 *bfree = (VolSpace) free * 1024;
65 *btotal = (VolSpace) total * 1024;
70 afp_getdiracl(obj, ibuf, ibuflen, rbuf, rbuflen )
73 int ibuflen, *rbuflen;
83 memcpy( &vid, ibuf, sizeof( vid ));
84 ibuf += sizeof( short );
85 if (( vol = getvolbyvid( vid )) == NULL ) {
87 return( AFPERR_PARAM );
90 memcpy( &did, ibuf, sizeof( did ));
91 ibuf += sizeof( int );
92 if (( dir = dirsearch( vol, did )) == NULL ) {
94 return( AFPERR_NOOBJ );
97 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
99 return( AFPERR_NOOBJ );
101 if ( *path != '\0' ) {
103 return( AFPERR_BITMAP );
107 vi.out_size = *rbuflen;
109 if ( pioctl( ".", VIOCGETAL, &vi, 1 ) < 0 ) {
111 return( AFPERR_PARAM );
113 *rbuflen = strlen( vi.out ) + 1;
118 * Calculate the mode for a directory in AFS. First, make sure the
119 * directory is in AFS. Could probably use something less heavy than
120 * VIOCGETAL. If the directory is on AFS, use access() calls to
121 * estimate permission, a la mdw.
123 afsmode( path, ma, dir )
131 if (( dir->d_flags & DIRF_FSMASK ) == DIRF_NOFS ) {
133 vi.out_size = sizeof( buf );
135 if ( pioctl( path, VIOCGETAL, &vi, 1 ) < 0 ) {
136 dir->d_flags |= DIRF_UFS;
138 dir->d_flags |= DIRF_AFS;
142 if (( dir->d_flags & DIRF_FSMASK ) != DIRF_AFS ) {
146 if ( access( path, R_OK|W_OK|X_OK ) == 0 ) {
147 ma->ma_user = AR_UREAD|AR_UWRITE|AR_USEARCH|AR_UOWN;
148 ma->ma_owner = AR_UREAD|AR_UWRITE|AR_USEARCH;
149 } else if ( access( path, R_OK|X_OK ) == 0 ) {
150 ma->ma_user = AR_UREAD|AR_USEARCH;
151 ma->ma_owner = AR_UREAD|AR_USEARCH;
153 ma->ma_user = ma->ma_owner = 0;
154 if ( access( path, R_OK ) == 0 ) {
155 ma->ma_user |= AR_UREAD;
156 ma->ma_owner |= AR_UREAD;
158 if ( access( path, X_OK ) == 0 ) {
159 ma->ma_user |= AR_USEARCH;
160 ma->ma_owner |= AR_USEARCH;
162 if ( access( path, W_OK ) == 0 ) {
163 ma->ma_user |= AR_UWRITE|AR_UOWN;
164 ma->ma_owner |= AR_UWRITE;
171 extern struct dir *curdir;
173 * cmd | 0 | vid | did | pathtype | pathname | 0 | acl
175 afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen )
178 int ibuflen, *rbuflen;
188 iend = ibuf + ibuflen;
190 memcpy( &vid, ibuf, sizeof( vid ));
191 ibuf += sizeof( short );
192 if (( vol = getvolbyvid( vid )) == NULL ) {
194 return( AFPERR_PARAM );
197 memcpy( &did, ibuf, sizeof( did ));
198 ibuf += sizeof( int );
199 if (( dir = dirsearch( vol, did )) == NULL ) {
201 return( AFPERR_NOOBJ );
204 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
206 return( AFPERR_NOOBJ );
208 if ( *path != '\0' ) {
210 return( AFPERR_BITMAP );
213 if ((int)ibuf & 1 ) {
217 vi.in_size = iend - ibuf;
221 if ( pioctl( ".", VIOCSETAL, &vi, 1 ) < 0 ) {
223 return( AFPERR_PARAM );
225 pioctl( ".AppleDouble", VIOCSETAL, &vi, 1 );
226 if ( curdir->d_did == DIRDID_ROOT ) {
227 pioctl( ".AppleDesktop", VIOCSETAL, &vi, 1 );
238 #include <afs/kauth.h>
239 #include <afs/kautils.h>
241 extern C_Block seskey;
242 extern Key_schedule seskeysched;
244 afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen )
247 int ibuflen, *rbuflen;
249 char name[ MAXKTCNAMELEN ], instance[ MAXKTCNAMELEN ];
250 char realm[ MAXKTCREALMLEN ];
251 char oldpw[ 9 ], newpw[ 9 ];
254 struct ktc_encryptionKey oldkey, newkey;
255 struct ktc_token adtok;
256 struct ubik_client *conn;
260 len = (unsigned char) *ibuf++;
262 *name = *instance = *realm = '\0';
263 ka_ParseLoginName( ibuf, name, instance, realm );
265 if ( *realm == '\0' ) {
266 if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
267 syslog( LOG_ERR, "krb_get_lrealm failed" );
268 return( AFPERR_BADUAM );
272 if ( strlen( name ) < 2 || strlen( name ) > 18 ) {
273 return( AFPERR_PARAM );
277 memcpy( &clen, ibuf, sizeof( clen ));
278 clen = ntohs( clen );
279 if ( clen % 8 != 0 ) {
280 return( AFPERR_PARAM );
283 ibuf += sizeof( short );
284 pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf,
285 clen, seskeysched, seskey, DES_DECRYPT );
287 len = (unsigned char) *ibuf++;
289 return( AFPERR_PARAM );
291 memset( oldpw, 0, sizeof( oldpw ));
292 memcpy( oldpw, ibuf, len );
296 len = (unsigned char) *ibuf++;
298 return( AFPERR_PARAM );
300 memset( newpw, 0, sizeof( newpw ));
301 memcpy( newpw, ibuf, len );
306 "changing password for <%s>.<%s>@<%s>", name, instance, realm );
308 ka_StringToKey( oldpw, realm, &oldkey );
309 memset( oldpw, 0, sizeof( oldpw ));
310 ka_StringToKey( newpw, realm, &newkey );
311 memset( newpw, 0, sizeof( newpw ));
313 rc = ka_GetAdminToken( name, instance, realm, &oldkey, 60, &adtok, 0 );
314 memset( &oldkey, 0, sizeof( oldkey ));
319 memset( &newkey, 0, sizeof( newkey ));
320 return( AFPERR_NOTAUTH );
322 memset( &newkey, 0, sizeof( newkey ));
323 return( AFPERR_BADUAM );
325 if ( ka_AuthServerConn( realm, KA_MAINTENANCE_SERVICE, &adtok, &conn )
327 memset( &newkey, 0, sizeof( newkey ));
328 return( AFPERR_BADUAM );
331 rc = ka_ChangePassword( name, instance, conn, 0, &newkey );
332 memset( &newkey, 0, sizeof( newkey ));
334 return( AFPERR_BADUAM );
337 syslog( LOG_DEBUG, "password changed succeeded" );