2 * $Id: afs.c,v 1.10 2002-03-24 01:23:40 sibaz Exp $
3 * Copyright (c) 1990,1993 Regents of The University of Michigan.
4 * All Rights Reserved. See COPYRIGHT.
9 #endif /* HAVE_CONFIG_H */
14 #include <sys/types.h>
15 #include <atalk/logger.h>
16 #include <netatalk/endian.h>
17 #include <netinet/in.h>
18 #include <afs/venus.h>
19 #include <afs/afsint.h>
20 #include <atalk/afp.h>
23 #endif /* HAVE_UNISTD_H */
26 #include "directory.h"
30 afs_getvolspace( vol, bfree, btotal, bsize )
32 VolSpace *bfree, *btotal;
36 struct VolumeStatus *vs;
37 char venuspace[ sizeof( struct VolumeStatus ) + 3 ];
41 vi.out_size = sizeof( venuspace );
43 if ( pioctl( vol->v_path, VIOCGETVOLSTAT, &vi, 1 ) < 0 ) {
44 return( AFPERR_PARAM );
47 vs = (struct VolumeStatus *)venuspace;
49 if ( vs->PartBlocksAvail > 0 ) {
50 if ( vs->MaxQuota != 0 ) {
51 #define min(x,y) (((x)<(y))?(x):(y))
52 free = min( vs->MaxQuota - vs->BlocksInUse, vs->PartBlocksAvail );
54 free = vs->PartBlocksAvail;
60 if ( vs->MaxQuota != 0 ) {
61 total = free + vs->BlocksInUse;
63 total = vs->PartMaxBlocks;
67 *bfree = (VolSpace) free * 1024;
68 *btotal = (VolSpace) total * 1024;
73 afp_getdiracl(obj, ibuf, ibuflen, rbuf, rbuflen )
76 int ibuflen, *rbuflen;
86 memcpy( &vid, ibuf, sizeof( vid ));
87 ibuf += sizeof( short );
88 if (( vol = getvolbyvid( vid )) == NULL ) {
90 return( AFPERR_PARAM );
93 memcpy( &did, ibuf, sizeof( did ));
94 ibuf += sizeof( int );
95 if (( dir = dirsearch( vol, did )) == NULL ) {
97 return( AFPERR_NOOBJ );
100 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
102 return( AFPERR_NOOBJ );
104 if ( *path != '\0' ) {
106 return( AFPERR_BITMAP );
110 vi.out_size = *rbuflen;
112 if ( pioctl( ".", VIOCGETAL, &vi, 1 ) < 0 ) {
114 return( AFPERR_PARAM );
116 *rbuflen = strlen( vi.out ) + 1;
121 * Calculate the mode for a directory in AFS. First, make sure the
122 * directory is in AFS. Could probably use something less heavy than
123 * VIOCGETAL. If the directory is on AFS, use access() calls to
124 * estimate permission, a la mdw.
126 afsmode( path, ma, dir )
134 if (( dir->d_flags & DIRF_FSMASK ) == DIRF_NOFS ) {
136 vi.out_size = sizeof( buf );
138 if ( pioctl( path, VIOCGETAL, &vi, 1 ) < 0 ) {
139 dir->d_flags |= DIRF_UFS;
141 dir->d_flags |= DIRF_AFS;
145 if (( dir->d_flags & DIRF_FSMASK ) != DIRF_AFS ) {
149 accessmode( path, &ma, dir );
154 extern struct dir *curdir;
156 * cmd | 0 | vid | did | pathtype | pathname | 0 | acl
158 afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen )
161 int ibuflen, *rbuflen;
171 iend = ibuf + ibuflen;
173 memcpy( &vid, ibuf, sizeof( vid ));
174 ibuf += sizeof( short );
175 if (( vol = getvolbyvid( vid )) == NULL ) {
177 return( AFPERR_PARAM );
180 memcpy( &did, ibuf, sizeof( did ));
181 ibuf += sizeof( int );
182 if (( dir = dirsearch( vol, did )) == NULL ) {
184 return( AFPERR_NOOBJ );
187 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
189 return( AFPERR_NOOBJ );
191 if ( *path != '\0' ) {
193 return( AFPERR_BITMAP );
196 if ((int)ibuf & 1 ) {
200 vi.in_size = iend - ibuf;
204 if ( pioctl( ".", VIOCSETAL, &vi, 1 ) < 0 ) {
206 return( AFPERR_PARAM );
208 pioctl( ".AppleDouble", VIOCSETAL, &vi, 1 );
209 if ( curdir->d_did == DIRDID_ROOT ) {
210 pioctl( ".AppleDesktop", VIOCSETAL, &vi, 1 );
221 #include <afs/kauth.h>
222 #include <afs/kautils.h>
224 extern C_Block seskey;
225 extern Key_schedule seskeysched;
227 afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen )
230 int ibuflen, *rbuflen;
232 char name[ MAXKTCNAMELEN ], instance[ MAXKTCNAMELEN ];
233 char realm[ MAXKTCREALMLEN ];
234 char oldpw[ 9 ], newpw[ 9 ];
237 struct ktc_encryptionKey oldkey, newkey;
238 struct ktc_token adtok;
239 struct ubik_client *conn;
243 len = (unsigned char) *ibuf++;
245 *name = *instance = *realm = '\0';
246 ka_ParseLoginName( ibuf, name, instance, realm );
248 if ( *realm == '\0' ) {
249 if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
250 LOG(log_error, logtype_afpd, "krb_get_lrealm failed" );
251 return( AFPERR_BADUAM );
255 if ( strlen( name ) < 2 || strlen( name ) > 18 ) {
256 return( AFPERR_PARAM );
260 memcpy( &clen, ibuf, sizeof( clen ));
261 clen = ntohs( clen );
262 if ( clen % 8 != 0 ) {
263 return( AFPERR_PARAM );
266 ibuf += sizeof( short );
267 pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf,
268 clen, seskeysched, seskey, DES_DECRYPT );
270 len = (unsigned char) *ibuf++;
272 return( AFPERR_PARAM );
274 memset( oldpw, 0, sizeof( oldpw ));
275 memcpy( oldpw, ibuf, len );
279 len = (unsigned char) *ibuf++;
281 return( AFPERR_PARAM );
283 memset( newpw, 0, sizeof( newpw ));
284 memcpy( newpw, ibuf, len );
288 LOG(log_info, logtype_afpd,
289 "changing password for <%s>.<%s>@<%s>", name, instance, realm );
291 ka_StringToKey( oldpw, realm, &oldkey );
292 memset( oldpw, 0, sizeof( oldpw ));
293 ka_StringToKey( newpw, realm, &newkey );
294 memset( newpw, 0, sizeof( newpw ));
296 rc = ka_GetAdminToken( name, instance, realm, &oldkey, 60, &adtok, 0 );
297 memset( &oldkey, 0, sizeof( oldkey ));
302 memset( &newkey, 0, sizeof( newkey ));
303 return( AFPERR_NOTAUTH );
305 memset( &newkey, 0, sizeof( newkey ));
306 return( AFPERR_BADUAM );
308 if ( ka_AuthServerConn( realm, KA_MAINTENANCE_SERVICE, &adtok, &conn )
310 memset( &newkey, 0, sizeof( newkey ));
311 return( AFPERR_BADUAM );
314 rc = ka_ChangePassword( name, instance, conn, 0, &newkey );
315 memset( &newkey, 0, sizeof( newkey ));
317 return( AFPERR_BADUAM );
320 LOG(log_debug, logtype_afpd, "password changed succeeded" );
324 #endif /* UAM_AFSKRB */