2 * $Id: afs.c,v 1.18 2009-10-15 10:43:13 didg 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 */
27 #include "directory.h"
32 int afs_getvolspace( vol, bfree, btotal, bsize )
34 VolSpace *bfree, *btotal;
38 struct VolumeStatus *vs;
39 char venuspace[ sizeof( struct VolumeStatus ) + 3 ];
43 vi.out_size = sizeof( venuspace );
45 if ( pioctl( vol->v_path, VIOCGETVOLSTAT, &vi, 1 ) < 0 ) {
46 return( AFPERR_PARAM );
49 vs = (struct VolumeStatus *)venuspace;
51 if ( vs->PartBlocksAvail > 0 ) {
52 if ( vs->MaxQuota != 0 ) {
56 #define min(x,y) (((x)<(y))?(x):(y))
57 free = min( vs->MaxQuota - vs->BlocksInUse, vs->PartBlocksAvail );
59 free = vs->PartBlocksAvail;
65 if ( vs->MaxQuota != 0 ) {
66 total = free + vs->BlocksInUse;
68 total = vs->PartMaxBlocks;
72 *bfree = (VolSpace) free * 1024;
73 *btotal = (VolSpace) total * 1024;
78 int afp_getdiracl(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen)
88 memcpy( &vid, ibuf, sizeof( vid ));
89 ibuf += sizeof( short );
90 if (( vol = getvolbyvid( vid )) == NULL ) {
92 return( AFPERR_PARAM );
95 memcpy( &did, ibuf, sizeof( did ));
96 ibuf += sizeof( int );
97 if (( dir = dirlookup( vol, did )) == NULL ) {
102 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
104 return get_afp_errno(AFPERR_PARAM);
106 if ( *path->m_name != '\0' ) {
108 return (path_isadir( path))? afp_errno: AFPERR_BITMAP;
112 vi.out_size = *rbuflen;
114 if ( pioctl( ".", VIOCGETAL, &vi, 1 ) < 0 ) {
116 return( AFPERR_PARAM );
118 *rbuflen = strlen( vi.out ) + 1;
123 * Calculate the mode for a directory in AFS. First, make sure the
124 * directory is in AFS. Could probably use something less heavy than
125 * VIOCGETAL. If the directory is on AFS, use access() calls to
126 * estimate permission, a la mdw.
132 void afsmode( path, ma, dir, st )
141 if (( dir->d_flags & DIRF_FSMASK ) == DIRF_NOFS ) {
143 vi.out_size = sizeof( buf );
145 if ( pioctl( path, VIOCGETAL, &vi, 1 ) < 0 ) {
146 dir->d_flags |= DIRF_UFS;
148 dir->d_flags |= DIRF_AFS;
152 if (( dir->d_flags & DIRF_FSMASK ) != DIRF_AFS ) {
156 accessmode( path, ma, dir, st );
161 extern struct dir *curdir;
163 * cmd | 0 | vid | did | pathtype | pathname | 0 | acl
165 int afp_setdiracl(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen)
176 iend = ibuf + ibuflen;
178 memcpy( &vid, ibuf, sizeof( vid ));
179 ibuf += sizeof( short );
180 if (( vol = getvolbyvid( vid )) == NULL ) {
182 return( AFPERR_PARAM );
185 memcpy( &did, ibuf, sizeof( did ));
186 ibuf += sizeof( int );
187 if (( dir = dirlookup( vol, did )) == NULL ) {
192 if (( path = cname( vol, dir, &ibuf )) == NULL ) {
194 return get_afp_errno(AFPERR_PARAM);
196 if ( *path->m_name != '\0' ) {
198 return (path_isadir( path))? afp_errno: AFPERR_BITMAP;
201 if ((int)ibuf & 1 ) {
205 vi.in_size = iend - ibuf;
209 if ( pioctl( ".", VIOCSETAL, &vi, 1 ) < 0 ) {
211 return( AFPERR_PARAM );
213 pioctl( ".AppleDouble", VIOCSETAL, &vi, 1 );
214 if ( curdir->d_did == DIRDID_ROOT ) {
215 pioctl( ".AppleDesktop", VIOCSETAL, &vi, 1 );
226 #include <afs/kauth.h>
227 #include <afs/kautils.h>
229 extern C_Block seskey;
230 extern Key_schedule seskeysched;
232 int afp_afschangepw(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen)
234 char name[ MAXKTCNAMELEN ], instance[ MAXKTCNAMELEN ];
235 char realm[ MAXKTCREALMLEN ];
236 char oldpw[ 9 ], newpw[ 9 ];
239 struct ktc_encryptionKey oldkey, newkey;
240 struct ktc_token adtok;
241 struct ubik_client *conn;
245 len = (unsigned char) *ibuf++;
247 *name = *instance = *realm = '\0';
248 ka_ParseLoginName( ibuf, name, instance, realm );
250 if ( *realm == '\0' ) {
251 if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
252 LOG(log_error, logtype_afpd, "krb_get_lrealm failed" );
253 return( AFPERR_BADUAM );
257 if ( strlen( name ) < 2 || strlen( name ) > 18 ) {
258 return( AFPERR_PARAM );
262 memcpy( &clen, ibuf, sizeof( clen ));
263 clen = ntohs( clen );
264 if ( clen % 8 != 0 ) {
265 return( AFPERR_PARAM );
268 ibuf += sizeof( short );
269 pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf,
270 clen, seskeysched, seskey, DES_DECRYPT );
272 len = (unsigned char) *ibuf++;
274 return( AFPERR_PARAM );
276 memset( oldpw, 0, sizeof( oldpw ));
277 memcpy( oldpw, ibuf, len );
281 len = (unsigned char) *ibuf++;
283 return( AFPERR_PARAM );
285 memset( newpw, 0, sizeof( newpw ));
286 memcpy( newpw, ibuf, len );
290 LOG(log_info, logtype_afpd,
291 "changing password for <%s>.<%s>@<%s>", name, instance, realm );
293 ka_StringToKey( oldpw, realm, &oldkey );
294 memset( oldpw, 0, sizeof( oldpw ));
295 ka_StringToKey( newpw, realm, &newkey );
296 memset( newpw, 0, sizeof( newpw ));
298 rc = ka_GetAdminToken( name, instance, realm, &oldkey, 60, &adtok, 0 );
299 memset( &oldkey, 0, sizeof( oldkey ));
304 memset( &newkey, 0, sizeof( newkey ));
305 return( AFPERR_NOTAUTH );
307 memset( &newkey, 0, sizeof( newkey ));
308 return( AFPERR_BADUAM );
310 if ( ka_AuthServerConn( realm, KA_MAINTENANCE_SERVICE, &adtok, &conn )
312 memset( &newkey, 0, sizeof( newkey ));
313 return( AFPERR_BADUAM );
316 rc = ka_ChangePassword( name, instance, conn, 0, &newkey );
317 memset( &newkey, 0, sizeof( newkey ));
319 return( AFPERR_BADUAM );
322 LOG(log_debug, logtype_afpd, "password changed succeeded" );
326 #endif /* UAM_AFSKRB */