X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fafs.c;h=f11d77eb22995a400ff43247cf7ddd4441babdbb;hb=d2da4b77412a33dc2d62c7877e7b331285dadab6;hp=169804f1cdbd370f701ab9caee2a9fc865bac2b6;hpb=6c1f3cff882955229cb9e0b94eca5e725817633b;p=netatalk.git diff --git a/etc/afpd/afs.c b/etc/afpd/afs.c index 169804f1..f11d77eb 100644 --- a/etc/afpd/afs.c +++ b/etc/afpd/afs.c @@ -1,5 +1,5 @@ /* - * $Id: afs.c,v 1.4 2001-06-20 18:33:04 rufustfirefly Exp $ + * $Id: afs.c,v 1.18 2009-10-15 10:43:13 didg Exp $ * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. */ @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include #include @@ -21,16 +21,15 @@ #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ +#include #include "globals.h" #include "directory.h" #include "volume.h" #include "misc.h" +#include "unix.h" -afs_getvolspace( vol, bfree, btotal, bsize ) - struct vol *vol; - VolSpace *bfree, *btotal; - u_int32_t *bsize; +int afs_getvolspace(struct vol *vol, VolSpace *bfree, VolSpace *btotal, uint32_t *bsize) { struct ViceIoctl vi; struct VolumeStatus *vs; @@ -41,26 +40,29 @@ afs_getvolspace( vol, bfree, btotal, bsize ) vi.out_size = sizeof( venuspace ); vi.out = venuspace; if ( pioctl( vol->v_path, VIOCGETVOLSTAT, &vi, 1 ) < 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } vs = (struct VolumeStatus *)venuspace; if ( vs->PartBlocksAvail > 0 ) { - if ( vs->MaxQuota != 0 ) { + if ( vs->MaxQuota != 0 ) { +#ifdef min +#undef min +#endif #define min(x,y) (((x)<(y))?(x):(y)) - free = min( vs->MaxQuota - vs->BlocksInUse, vs->PartBlocksAvail ); - } else { - free = vs->PartBlocksAvail; - } + free = min( vs->MaxQuota - vs->BlocksInUse, vs->PartBlocksAvail ); + } else { + free = vs->PartBlocksAvail; + } } else { - free = 0; + free = 0; } if ( vs->MaxQuota != 0 ) { - total = free + vs->BlocksInUse; + total = free + vs->BlocksInUse; } else { - total = vs->PartMaxBlocks; + total = vs->PartMaxBlocks; } *bsize = 1024; @@ -70,48 +72,45 @@ afs_getvolspace( vol, bfree, btotal, bsize ) return( AFP_OK ); } -afp_getdiracl(obj, ibuf, ibuflen, rbuf, rbuflen ) - AFPObj *obj; - char *ibuf, *rbuf; - int ibuflen, *rbuflen; +int afp_getdiracl(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) { struct ViceIoctl vi; struct vol *vol; struct dir *dir; - char *path; - u_int32_t did; - u_int16_t vid; + struct path *path; + uint32_t did; + uint16_t vid; ibuf += 2; memcpy( &vid, ibuf, sizeof( vid )); ibuf += sizeof( short ); if (( vol = getvolbyvid( vid )) == NULL ) { - *rbuflen = 0; - return( AFPERR_PARAM ); + *rbuflen = 0; + return( AFPERR_PARAM ); } memcpy( &did, ibuf, sizeof( did )); ibuf += sizeof( int ); - if (( dir = dirsearch( vol, did )) == NULL ) { - *rbuflen = 0; - return( AFPERR_NOOBJ ); + if (( dir = dirlookup( vol, did )) == NULL ) { + *rbuflen = 0; + return afp_errno; } if (( path = cname( vol, dir, &ibuf )) == NULL ) { - *rbuflen = 0; - return( AFPERR_NOOBJ ); + *rbuflen = 0; + return get_afp_errno(AFPERR_PARAM); } - if ( *path != '\0' ) { - *rbuflen = 0; - return( AFPERR_BITMAP ); + if ( *path->m_name != '\0' ) { + *rbuflen = 0; + return (path_isadir( path))? afp_errno: AFPERR_BITMAP; } vi.in_size = 0; vi.out_size = *rbuflen; vi.out = rbuf; if ( pioctl( ".", VIOCGETAL, &vi, 1 ) < 0 ) { - *rbuflen = 0; - return( AFPERR_PARAM ); + *rbuflen = 0; + return( AFPERR_PARAM ); } *rbuflen = strlen( vi.out ) + 1; return( AFP_OK ); @@ -123,30 +122,31 @@ afp_getdiracl(obj, ibuf, ibuflen, rbuf, rbuflen ) * VIOCGETAL. If the directory is on AFS, use access() calls to * estimate permission, a la mdw. */ -afsmode( path, ma, dir ) - char *path; - struct maccess *ma; - struct dir *dir; +#ifdef accessmode + #undef accessmode +#endif + +void afsmode(const struct volume *vol, char *path, struct maccess *ma, struct dir *dir, struct stat *st) { struct ViceIoctl vi; char buf[ 1024 ]; if (( dir->d_flags & DIRF_FSMASK ) == DIRF_NOFS ) { - vi.in_size = 0; - vi.out_size = sizeof( buf ); - vi.out = buf; - if ( pioctl( path, VIOCGETAL, &vi, 1 ) < 0 ) { - dir->d_flags |= DIRF_UFS; - } else { - dir->d_flags |= DIRF_AFS; - } + vi.in_size = 0; + vi.out_size = sizeof( buf ); + vi.out = buf; + if ( pioctl( path, VIOCGETAL, &vi, 1 ) < 0 ) { + dir->d_flags |= DIRF_UFS; + } else { + dir->d_flags |= DIRF_AFS; + } } if (( dir->d_flags & DIRF_FSMASK ) != DIRF_AFS ) { - return; + return; } - accessmode( upath, &ma, dir ); + accessmode(vol, path, ma, dir, st ); return; } @@ -155,17 +155,15 @@ extern struct dir *curdir; /* * cmd | 0 | vid | did | pathtype | pathname | 0 | acl */ -afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen ) - AFPObj *obj; - char *ibuf, *rbuf; - int ibuflen, *rbuflen; +int afp_setdiracl(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) { struct ViceIoctl vi; struct vol *vol; struct dir *dir; - char *path, *iend; - u_int32_t did; - u_int16_t vid; + char *iend; + struct path *path; + uint32_t did; + uint16_t vid; *rbuflen = 0; iend = ibuf + ibuflen; @@ -173,28 +171,28 @@ afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen ) memcpy( &vid, ibuf, sizeof( vid )); ibuf += sizeof( short ); if (( vol = getvolbyvid( vid )) == NULL ) { - *rbuflen = 0; - return( AFPERR_PARAM ); + *rbuflen = 0; + return( AFPERR_PARAM ); } memcpy( &did, ibuf, sizeof( did )); ibuf += sizeof( int ); - if (( dir = dirsearch( vol, did )) == NULL ) { - *rbuflen = 0; - return( AFPERR_NOOBJ ); + if (( dir = dirlookup( vol, did )) == NULL ) { + *rbuflen = 0; + return afp_errno; } if (( path = cname( vol, dir, &ibuf )) == NULL ) { - *rbuflen = 0; - return( AFPERR_NOOBJ ); + *rbuflen = 0; + return get_afp_errno(AFPERR_PARAM); } - if ( *path != '\0' ) { - *rbuflen = 0; - return( AFPERR_BITMAP ); + if ( *path->m_name != '\0' ) { + *rbuflen = 0; + return (path_isadir( path))? afp_errno: AFPERR_BITMAP; } if ((int)ibuf & 1 ) { - ibuf++; + ibuf++; } vi.in_size = iend - ibuf; @@ -202,12 +200,12 @@ afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen ) vi.out_size = 0; if ( pioctl( ".", VIOCSETAL, &vi, 1 ) < 0 ) { - *rbuflen = 0; - return( AFPERR_PARAM ); + *rbuflen = 0; + return( AFPERR_PARAM ); } pioctl( ".AppleDouble", VIOCSETAL, &vi, 1 ); if ( curdir->d_did == DIRDID_ROOT ) { - pioctl( ".AppleDesktop", VIOCSETAL, &vi, 1 ); + pioctl( ".AppleDesktop", VIOCSETAL, &vi, 1 ); } return( AFP_OK ); @@ -224,16 +222,13 @@ afp_setdiracl(obj, ibuf, ibuflen, rbuf, rbuflen ) extern C_Block seskey; extern Key_schedule seskeysched; -afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen ) - AFPObj *obj; - char *ibuf, *rbuf; - int ibuflen, *rbuflen; +int afp_afschangepw(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) { char name[ MAXKTCNAMELEN ], instance[ MAXKTCNAMELEN ]; char realm[ MAXKTCREALMLEN ]; char oldpw[ 9 ], newpw[ 9 ]; int len, rc; - u_int16_t clen; + uint16_t clen; struct ktc_encryptionKey oldkey, newkey; struct ktc_token adtok; struct ubik_client *conn; @@ -246,30 +241,30 @@ afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen ) ka_ParseLoginName( ibuf, name, instance, realm ); ucase( realm ); if ( *realm == '\0' ) { - if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) { - syslog( LOG_ERR, "krb_get_lrealm failed" ); - return( AFPERR_BADUAM ); - } + if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) { + LOG(log_error, logtype_afpd, "krb_get_lrealm failed" ); + return( AFPERR_BADUAM ); + } } if ( strlen( name ) < 2 || strlen( name ) > 18 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } ibuf += len; memcpy( &clen, ibuf, sizeof( clen )); clen = ntohs( clen ); if ( clen % 8 != 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } ibuf += sizeof( short ); pcbc_encrypt((C_Block *)ibuf, (C_Block *)ibuf, - clen, seskeysched, seskey, DES_DECRYPT ); + clen, seskeysched, seskey, DES_DECRYPT ); len = (unsigned char) *ibuf++; if ( len > 8 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } memset( oldpw, 0, sizeof( oldpw )); memcpy( oldpw, ibuf, len ); @@ -278,15 +273,15 @@ afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen ) len = (unsigned char) *ibuf++; if ( len > 8 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } memset( newpw, 0, sizeof( newpw )); memcpy( newpw, ibuf, len ); ibuf += len; newpw[ len ] = '\0'; - syslog( LOG_INFO, - "changing password for <%s>.<%s>@<%s>", name, instance, realm ); + LOG(log_info, logtype_afpd, + "changing password for <%s>.<%s>@<%s>", name, instance, realm ); ka_StringToKey( oldpw, realm, &oldkey ); memset( oldpw, 0, sizeof( oldpw )); @@ -296,28 +291,28 @@ afp_afschangepw(obj, ibuf, ibuflen, rbuf, rbuflen ) rc = ka_GetAdminToken( name, instance, realm, &oldkey, 60, &adtok, 0 ); memset( &oldkey, 0, sizeof( oldkey )); switch ( rc ) { - case 0: - break; - case KABADREQUEST: - memset( &newkey, 0, sizeof( newkey )); - return( AFPERR_NOTAUTH ); - default: - memset( &newkey, 0, sizeof( newkey )); - return( AFPERR_BADUAM ); + case 0: + break; + case KABADREQUEST: + memset( &newkey, 0, sizeof( newkey )); + return( AFPERR_NOTAUTH ); + default: + memset( &newkey, 0, sizeof( newkey )); + return( AFPERR_BADUAM ); } if ( ka_AuthServerConn( realm, KA_MAINTENANCE_SERVICE, &adtok, &conn ) - != 0 ) { - memset( &newkey, 0, sizeof( newkey )); - return( AFPERR_BADUAM ); + != 0 ) { + memset( &newkey, 0, sizeof( newkey )); + return( AFPERR_BADUAM ); } rc = ka_ChangePassword( name, instance, conn, 0, &newkey ); memset( &newkey, 0, sizeof( newkey )); if ( rc != 0 ) { - return( AFPERR_BADUAM ); + return( AFPERR_BADUAM ); } - syslog( LOG_DEBUG, "password changed succeeded" ); + LOG(log_debug, logtype_afpd, "password changed succeeded" ); return( AFP_OK ); }