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 accessmode( upath, &ma, dir );
151 extern struct dir *curdir;
153 * cmd | 0 | vid | did | pathtype | pathname | 0 | acl
155 afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen )
158 int ibuflen, *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 = dirsearch( vol, did )) == NULL ) {
181 return( AFPERR_NOOBJ );
184 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
186 return( AFPERR_NOOBJ );
188 if ( *path != '\0' ) {
190 return( 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 afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen )
227 int ibuflen, *rbuflen;
229 char name[ MAXKTCNAMELEN ], instance[ MAXKTCNAMELEN ];
230 char realm[ MAXKTCREALMLEN ];
231 char oldpw[ 9 ], newpw[ 9 ];
234 struct ktc_encryptionKey oldkey, newkey;
235 struct ktc_token adtok;
236 struct ubik_client *conn;
240 len = (unsigned char) *ibuf++;
242 *name = *instance = *realm = '\0';
243 ka_ParseLoginName( ibuf, name, instance, realm );
245 if ( *realm == '\0' ) {
246 if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
247 syslog( LOG_ERR, "krb_get_lrealm failed" );
248 return( AFPERR_BADUAM );
252 if ( strlen( name ) < 2 || strlen( name ) > 18 ) {
253 return( AFPERR_PARAM );
257 memcpy( &clen, ibuf, sizeof( clen ));
258 clen = ntohs( clen );
259 if ( clen % 8 != 0 ) {
260 return( AFPERR_PARAM );
263 ibuf += sizeof( short );
264 pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf,
265 clen, seskeysched, seskey, DES_DECRYPT );
267 len = (unsigned char) *ibuf++;
269 return( AFPERR_PARAM );
271 memset( oldpw, 0, sizeof( oldpw ));
272 memcpy( oldpw, ibuf, len );
276 len = (unsigned char) *ibuf++;
278 return( AFPERR_PARAM );
280 memset( newpw, 0, sizeof( newpw ));
281 memcpy( newpw, ibuf, len );
286 "changing password for <%s>.<%s>@<%s>", name, instance, realm );
288 ka_StringToKey( oldpw, realm, &oldkey );
289 memset( oldpw, 0, sizeof( oldpw ));
290 ka_StringToKey( newpw, realm, &newkey );
291 memset( newpw, 0, sizeof( newpw ));
293 rc = ka_GetAdminToken( name, instance, realm, &oldkey, 60, &adtok, 0 );
294 memset( &oldkey, 0, sizeof( oldkey ));
299 memset( &newkey, 0, sizeof( newkey ));
300 return( AFPERR_NOTAUTH );
302 memset( &newkey, 0, sizeof( newkey ));
303 return( AFPERR_BADUAM );
305 if ( ka_AuthServerConn( realm, KA_MAINTENANCE_SERVICE, &adtok, &conn )
307 memset( &newkey, 0, sizeof( newkey ));
308 return( AFPERR_BADUAM );
311 rc = ka_ChangePassword( name, instance, conn, 0, &newkey );
312 memset( &newkey, 0, sizeof( newkey ));
314 return( AFPERR_BADUAM );
317 syslog( LOG_DEBUG, "password changed succeeded" );