X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fappl.c;h=51b64ef283b97d48e3ef826fd25d20a6c3b7a7ed;hb=465246e257d9aff9855e3e35d8fd5983db932b45;hp=dcefdaff142a2ef884d96b1d8d0c9741d7161de0;hpb=31843674b7bd32eabcce3a1ad6159b4f94921f79;p=netatalk.git diff --git a/etc/afpd/appl.c b/etc/afpd/appl.c index dcefdaff..51b64ef2 100644 --- a/etc/afpd/appl.c +++ b/etc/afpd/appl.c @@ -1,80 +1,78 @@ /* + * $Id: appl.c,v 1.18.4.1 2010-02-01 10:56:08 franklahm Exp $ + * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + #include #include #include #include -#include -#include -#include -#include + #include -#include +#include #include -#include #include #include +#include +#include +#include #include "volume.h" -#include "globals.h" #include "directory.h" #include "file.h" #include "desktop.h" -static struct savedt sa = { { 0, 0, 0, 0 }, -1, 0 }; +static struct savedt sa = { { 0, 0, 0, 0 }, -1, 0, 0}; -static __inline__ int pathcmp( p, plen, q, qlen ) - char *p; - int plen; - char *q; - int qlen; +static int pathcmp(char *p, int plen, char *q, int qlen) { return (( plen == qlen && memcmp( p, q, plen ) == 0 ) ? 0 : 1 ); } -static int applopen( vol, creator, flags, mode ) - struct vol *vol; - u_char creator[ 4 ]; +static int applopen(struct vol *vol, u_char creator[ 4 ], int flags, int mode) { char *dtf, *adt, *adts; if ( sa.sdt_fd != -1 ) { - if ( !(flags & ( O_RDWR | O_WRONLY )) && - memcmp( sa.sdt_creator, creator, sizeof( CreatorType )) == 0 && - sa.sdt_vid == vol->v_vid ) { - return( AFP_OK ); - } - close( sa.sdt_fd ); - sa.sdt_fd = -1; + if ( !(flags & ( O_RDWR | O_WRONLY )) && + memcmp( sa.sdt_creator, creator, sizeof( CreatorType )) == 0 && + sa.sdt_vid == vol->v_vid ) { + return( AFP_OK ); + } + close( sa.sdt_fd ); + sa.sdt_fd = -1; } dtf = dtfile( vol, creator, ".appl" ); if (( sa.sdt_fd = open( dtf, flags, ad_mode( dtf, mode ))) < 0 ) { - if ( errno == ENOENT && ( flags & O_CREAT )) { - if (( adts = strrchr( dtf, '/' )) == NULL ) { - return( AFPERR_PARAM ); - } - *adts = '\0'; - if (( adt = strrchr( dtf, '/' )) == NULL ) { - return( AFPERR_PARAM ); - } - *adt = '\0'; - (void) ad_mkdir( dtf, DIRBITS | 0777 ); - *adt = '/'; - (void) ad_mkdir( dtf, DIRBITS | 0777 ); - *adts = '/'; - - if (( sa.sdt_fd = open( dtf, flags, ad_mode( dtf, mode ))) < 0 ) { - return( AFPERR_PARAM ); - } - } else { - return( AFPERR_PARAM ); - } + if ( errno == ENOENT && ( flags & O_CREAT )) { + if (( adts = strrchr( dtf, '/' )) == NULL ) { + return( AFPERR_PARAM ); + } + *adts = '\0'; + if (( adt = strrchr( dtf, '/' )) == NULL ) { + return( AFPERR_PARAM ); + } + *adt = '\0'; + (void) ad_mkdir( dtf, DIRBITS | 0777 ); + *adt = '/'; + (void) ad_mkdir( dtf, DIRBITS | 0777 ); + *adts = '/'; + + if (( sa.sdt_fd = open( dtf, flags, ad_mode( dtf, mode ))) < 0 ) { + return( AFPERR_PARAM ); + } + } else { + return( AFPERR_PARAM ); + } } memcpy( sa.sdt_creator, creator, sizeof( CreatorType )); sa.sdt_vid = vol->v_vid; @@ -85,11 +83,7 @@ static int applopen( vol, creator, flags, mode ) /* * copy appls to new file, deleting any matching (old) appl entries */ -static int copyapplfile( sfd, dfd, mpath, mplen ) - int sfd; - int dfd; - char *mpath; - u_short mplen; +static int copyapplfile(int sfd, int dfd, char *mpath, u_short mplen) { int cc; char *p; @@ -98,20 +92,20 @@ static int copyapplfile( sfd, dfd, mpath, mplen ) char buf[ MAXPATHLEN ]; while (( cc = read( sfd, buf, sizeof(appltag) + sizeof( u_short ))) > 0 ) { - p = buf + sizeof(appltag); - memcpy( &len, p, sizeof(len)); - len = ntohs( len ); - p += sizeof( len ); - if (( cc = read( sa.sdt_fd, p, len )) < len ) { - break; - } - if ( pathcmp( mpath, mplen, p, len ) != 0 ) { - p += len; - if ( write( dfd, buf, p - buf ) != p - buf ) { - cc = -1; - break; - } - } + p = buf + sizeof(appltag); + memcpy( &len, p, sizeof(len)); + len = ntohs( len ); + p += sizeof( len ); + if (( cc = read( sa.sdt_fd, p, len )) < len ) { + break; + } + if ( pathcmp( mpath, mplen, p, len ) != 0 ) { + p += len; + if ( write( dfd, buf, p - buf ) != p - buf ) { + cc = -1; + break; + } + } } return( cc ); } @@ -124,43 +118,91 @@ static int copyapplfile( sfd, dfd, mpath, mplen ) * but uses upaths instead of mac format paths. * * The new way: dir and path refer to an app, path is a mac format - * pathname. makemacpath() builds a cname. + * pathname. makemacpath() builds a cname. (zero is a path separator + * and it's not \0 terminated). * * See afp_getappl() for the backward compatiblity code. */ static char * -makemacpath( mpath, mpathlen, dir, path ) - char *mpath; - int mpathlen; - struct dir *dir; - char *path; +makemacpath(const struct vol *vol, char *mpath, int mpathlen, struct dir *dir, char *path) { char *p; p = mpath + mpathlen; p -= strlen( path ); - strncpy( p, path, strlen( path )); + memcpy( p, path, strlen( path )); + + while ( dir->d_did != DIRDID_ROOT ) { + p -= blength(dir->d_m_name) + 1; + if (p < mpath) { + /* FIXME: pathname too long */ + return NULL; + } + memcpy(p, cfrombstr(dir->d_m_name), blength(dir->d_m_name) + 1); + if ((dir = dirlookup(vol, dir->d_pdid)) == NULL) + return NULL; + } + return( p ); + + +#if 0 + char buffer[12 + MAXPATHLEN + 1]; + int buflen = 12 + MAXPATHLEN + 1; + char *ret = mpath; + char *path = name; + char *uname = NULL; + struct bstrList *pathlist = NULL; + cnid_t cnid = dir->d_pdid; + + /* Create list for path elements, request 16 list elements for now*/ + if ((pathlist = bstListCreateMin(16)) == NULL) { + LOG(log_error, logtype_afpd, "makemacpath: OOM: %s", strerror(errno)); + return NULL; + } + + while ( cnid != DIRDID_ROOT ) { + + /* construct path, copy already found uname to path element list*/ + if ((bstrListPush(pathlist, bfromcstr(path))) != BSTR_OK) { + afp_errno = AFPERR_MISC; + ret = NULL; + goto exit; + } + + /* next part */ + if ((uname = cnid_resolve(vol->v_cdb, &cnid, buffer, buflen)) == NULL ) { + afp_errno = AFPERR_NOOBJ; + ret = NULL; + goto exit; + } - while ( dir->d_parent != NULL ) { - p -= strlen( dir->d_name ) + 1; - strcpy( p, dir->d_name ); - dir = dir->d_parent; + if ((path = utompath(vol, uname, cnid, utf8_encoding())) == NULL) { + afp_errno = AFPERR_MISC; + ret = NULL; + goto exit; + } } - return( p ); + + + +exit: + if (pathlist) + bstrListDestroy(pathlist); + + return(ret); +#endif } -int afp_addappl(obj, ibuf, ibuflen, rbuf, rbuflen ) - AFPObj *obj; - char *ibuf, *rbuf; - int ibuflen, *rbuflen; +int afp_addappl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { struct vol *vol; struct dir *dir; - int tfd, cc; + int tfd, cc; u_int32_t did; u_int16_t vid, mplen; - char *path, *dtf, *p, *mp; + struct path *path; + char *dtf, *p, *mp; u_char creator[ 4 ]; u_char appltag[ 4 ]; char *mpath, *tempfile; @@ -170,14 +212,14 @@ int afp_addappl(obj, ibuf, ibuflen, rbuf, rbuflen ) memcpy( &vid, ibuf, sizeof( vid )); ibuf += sizeof( vid ); - if (( vol = getvolbyvid( vid )) == NULL ) { - return( AFPERR_PARAM ); + if (NULL == ( vol = getvolbyvid( vid ))) { + return( AFPERR_PARAM ); } memcpy( &did, ibuf, sizeof( did )); ibuf += sizeof( did ); - if (( dir = dirsearch( vol, did )) == NULL ) { - return( AFPERR_NOOBJ ); + if (NULL == ( dir = dirlookup( vol, did )) ) { + return afp_errno; } memcpy( creator, ibuf, sizeof( creator )); @@ -186,27 +228,30 @@ int afp_addappl(obj, ibuf, ibuflen, rbuf, rbuflen ) memcpy( appltag, ibuf, sizeof( appltag )); ibuf += sizeof( appltag ); - if (( path = cname( vol, dir, &ibuf )) == NULL ) { - return( AFPERR_NOOBJ ); + if (NULL == ( path = cname( vol, dir, &ibuf )) ) { + return get_afp_errno(AFPERR_PARAM); } - if ( *path == '\0' ) { - return( AFPERR_BADTYPE ); + if ( path_isadir(path) ) { + return( AFPERR_BADTYPE ); } if ( applopen( vol, creator, O_RDWR|O_CREAT, 0666 ) != AFP_OK ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } if ( lseek( sa.sdt_fd, 0L, SEEK_SET ) < 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } dtf = dtfile( vol, creator, ".appl.temp" ); tempfile = obj->oldtmp; strcpy( tempfile, dtf ); if (( tfd = open( tempfile, O_RDWR|O_CREAT, 0666 )) < 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } mpath = obj->newtmp; - mp = makemacpath( mpath, AFPOBJ_TMPSIZ, curdir, path ); + mp = makemacpath( vol, mpath, AFPOBJ_TMPSIZ, curdir, path->m_name ); + if (!mp) { + return AFPERR_PARAM; + } mplen = mpath + AFPOBJ_TMPSIZ - mp; /* write the new appl entry at start of temporary file */ @@ -218,8 +263,8 @@ int afp_addappl(obj, ibuf, ibuflen, rbuf, rbuflen ) memcpy(p, appltag, sizeof( appltag )); cc = mpath + AFPOBJ_TMPSIZ - p; if ( write( tfd, p, cc ) != cc ) { - unlink( tempfile ); - return( AFPERR_PARAM ); + unlink( tempfile ); + return( AFPERR_PARAM ); } cc = copyapplfile( sa.sdt_fd, tfd, mp, mplen ); close( tfd ); @@ -227,26 +272,24 @@ int afp_addappl(obj, ibuf, ibuflen, rbuf, rbuflen ) sa.sdt_fd = -1; if ( cc < 0 ) { - unlink( tempfile ); - return( AFPERR_PARAM ); + unlink( tempfile ); + return( AFPERR_PARAM ); } if ( rename( tempfile, dtfile( vol, creator, ".appl" )) < 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } return( AFP_OK ); } -int afp_rmvappl(obj, ibuf, ibuflen, rbuf, rbuflen ) - AFPObj *obj; - char *ibuf, *rbuf; - int ibuflen, *rbuflen; +int afp_rmvappl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { struct vol *vol; struct dir *dir; int tfd, cc; u_int32_t did; u_int16_t vid, mplen; - char *path, *dtf, *mp; + struct path *path; + char *dtf, *mp; u_char creator[ 4 ]; char *tempfile, *mpath; @@ -255,40 +298,44 @@ int afp_rmvappl(obj, ibuf, ibuflen, rbuf, rbuflen ) memcpy( &vid, ibuf, sizeof( vid )); ibuf += sizeof( vid ); - if (( vol = getvolbyvid( vid )) == NULL ) { - return( AFPERR_PARAM ); + if (NULL == ( vol = getvolbyvid( vid ))) { + return( AFPERR_PARAM ); } memcpy( &did, ibuf, sizeof( did )); ibuf += sizeof( did ); - if (( dir = dirsearch( vol, did )) == NULL ) { - return( AFPERR_NOOBJ ); + if (NULL == ( dir = dirlookup( vol, did )) ) { + return afp_errno; } memcpy( creator, ibuf, sizeof( creator )); ibuf += sizeof( creator ); - if (( path = cname( vol, dir, &ibuf )) == NULL ) { - return( AFPERR_NOOBJ ); + if (NULL == ( path = cname( vol, dir, &ibuf )) ) { + return get_afp_errno(AFPERR_PARAM); } - if ( *path == '.' ) { - return( AFPERR_BADTYPE ); + if ( path_isadir(path) ) { + return( AFPERR_BADTYPE ); } if ( applopen( vol, creator, O_RDWR, 0666 ) != AFP_OK ) { - return( AFPERR_NOOBJ ); + return( AFPERR_NOOBJ ); } if ( lseek( sa.sdt_fd, 0L, SEEK_SET ) < 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } dtf = dtfile( vol, creator, ".appl.temp" ); tempfile = obj->oldtmp; strcpy( tempfile, dtf ); if (( tfd = open( tempfile, O_RDWR|O_CREAT, 0666 )) < 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } mpath = obj->newtmp; - mp = makemacpath( mpath, AFPOBJ_TMPSIZ, curdir, path ); + mp = makemacpath( vol, mpath, AFPOBJ_TMPSIZ, curdir, path->m_name ); + if (!mp) { + return AFPERR_PARAM ; + } + mplen = mpath + AFPOBJ_TMPSIZ - mp; cc = copyapplfile( sa.sdt_fd, tfd, mp, mplen ); close( tfd ); @@ -296,36 +343,34 @@ int afp_rmvappl(obj, ibuf, ibuflen, rbuf, rbuflen ) sa.sdt_fd = -1; if ( cc < 0 ) { - unlink( tempfile ); - return( AFPERR_PARAM ); + unlink( tempfile ); + return( AFPERR_PARAM ); } if ( rename( tempfile, dtfile( vol, creator, ".appl" )) < 0 ) { - return( AFPERR_PARAM ); + return( AFPERR_PARAM ); } return( AFP_OK ); } -int afp_getappl(obj, ibuf, ibuflen, rbuf, rbuflen ) - AFPObj *obj; - char *ibuf, *rbuf; - int ibuflen, *rbuflen; +int afp_getappl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, size_t *rbuflen) { - struct stat st; struct vol *vol; char *p, *q; - int cc, buflen; + int cc; + size_t buflen; u_int16_t vid, aindex, bitmap, len; u_char creator[ 4 ]; u_char appltag[ 4 ]; char *buf, *cbuf; - + struct path *path; + ibuf += 2; memcpy( &vid, ibuf, sizeof( vid )); ibuf += sizeof( vid ); - if (( vol = getvolbyvid( vid )) == NULL ) { - *rbuflen = 0; - return( AFPERR_PARAM ); + if (NULL == ( vol = getvolbyvid( vid )) ) { + *rbuflen = 0; + return( AFPERR_PARAM ); } memcpy( creator, ibuf, sizeof( creator )); @@ -335,44 +380,44 @@ int afp_getappl(obj, ibuf, ibuflen, rbuf, rbuflen ) ibuf += sizeof( aindex ); aindex = ntohs( aindex ); if ( aindex ) { /* index 0 == index 1 */ - --aindex; + --aindex; } - + memcpy( &bitmap, ibuf, sizeof( bitmap )); bitmap = ntohs( bitmap ); ibuf += sizeof( bitmap ); if ( applopen( vol, creator, O_RDONLY, 0666 ) != AFP_OK ) { - *rbuflen = 0; - return( AFPERR_NOITEM ); + *rbuflen = 0; + return( AFPERR_NOITEM ); } if ( aindex < sa.sdt_index ) { - if ( lseek( sa.sdt_fd, 0L, SEEK_SET ) < 0 ) { - *rbuflen = 0; - return( AFPERR_PARAM ); - } - sa.sdt_index = 0; + if ( lseek( sa.sdt_fd, 0L, SEEK_SET ) < 0 ) { + *rbuflen = 0; + return( AFPERR_PARAM ); + } + sa.sdt_index = 0; } /* position to correct spot within appl file */ buf = obj->oldtmp; while (( cc = read( sa.sdt_fd, buf, sizeof( appltag ) - + sizeof( u_short ))) > 0 ) { - p = buf + sizeof( appltag ); - memcpy( &len, p, sizeof( len )); - len = ntohs( len ); - p += sizeof( u_short ); - if (( cc = read( sa.sdt_fd, p, len )) < len ) { - break; - } - if ( sa.sdt_index == aindex ) { - break; - } - sa.sdt_index++; + + sizeof( u_short ))) > 0 ) { + p = buf + sizeof( appltag ); + memcpy( &len, p, sizeof( len )); + len = ntohs( len ); + p += sizeof( u_short ); + if (( cc = read( sa.sdt_fd, p, len )) < len ) { + break; + } + if ( sa.sdt_index == aindex ) { + break; + } + sa.sdt_index++; } if ( cc <= 0 || sa.sdt_index != aindex ) { - *rbuflen = 0; - return( AFPERR_NOITEM ); + *rbuflen = 0; + return( AFPERR_NOITEM ); } sa.sdt_index++; @@ -386,35 +431,35 @@ int afp_getappl(obj, ibuf, ibuflen, rbuf, rbuflen ) #define hextoint( c ) ( isdigit( c ) ? c - '0' : c + 10 - 'a' ) #define islxdigit(x) (!isupper(x)&&isxdigit(x)) - char utomname[ MAXPATHLEN + 1]; - char *u, *m; - int i, h; - - u = p; - m = utomname; - i = len; - while ( i ) { - if ( *u == ':' && *(u+1) != '\0' && islxdigit( *(u+1)) && - *(u+2) != '\0' && islxdigit( *(u+2))) { - ++u, --i; - h = hextoint( *u ) << 4; - ++u, --i; - h |= hextoint( *u ); - *m++ = h; - } else { - *m++ = *u; - } - ++u, --i; - } - - len = m - utomname; - p = utomname; - - if ( p[ len - 1 ] == '\0' ) { - len--; - } - } -#endif APPLCNAME + char utomname[ MAXPATHLEN + 1]; + char *u, *m; + int i, h; + + u = p; + m = utomname; + i = len; + while ( i ) { + if ( *u == ':' && *(u+1) != '\0' && islxdigit( *(u+1)) && + *(u+2) != '\0' && islxdigit( *(u+2))) { + ++u, --i; + h = hextoint( *u ) << 4; + ++u, --i; + h |= hextoint( *u ); + *m++ = h; + } else { + *m++ = *u; + } + ++u, --i; + } + + len = m - utomname; + p = utomname; + + if ( p[ len - 1 ] == '\0' ) { + len--; + } + } +#endif /* APPLCNAME */ /* fake up a cname */ cbuf = obj->newtmp; @@ -424,20 +469,20 @@ int afp_getappl(obj, ibuf, ibuflen, rbuf, rbuflen ) memcpy( q, p, len ); q = cbuf; - if (( p = cname( vol, vol->v_dir, &q )) == NULL ) { - *rbuflen = 0; - return( AFPERR_NOITEM ); + if (( path = cname( vol, vol->v_root, &q )) == NULL ) { + *rbuflen = 0; + return( AFPERR_NOITEM ); } - if ( stat( mtoupath(vol, p), &st ) < 0 ) { - *rbuflen = 0; - return( AFPERR_NOITEM ); + if ( path_isadir(path) || path->st_errno ) { + *rbuflen = 0; + return( AFPERR_NOITEM ); } buflen = *rbuflen - sizeof( bitmap ) - sizeof( appltag ); - if ( getfilparams(vol, bitmap, p, curdir, &st, rbuf + sizeof( bitmap ) + - sizeof( appltag ), &buflen ) != AFP_OK ) { - *rbuflen = 0; - return( AFPERR_BITMAP ); + if ( getfilparams(vol, bitmap, path, curdir, rbuf + sizeof( bitmap ) + + sizeof( appltag ), &buflen ) != AFP_OK ) { + *rbuflen = 0; + return( AFPERR_BITMAP ); } *rbuflen = buflen + sizeof( bitmap ) + sizeof( appltag ); @@ -449,4 +494,3 @@ int afp_getappl(obj, ibuf, ibuflen, rbuf, rbuflen ) return( AFP_OK ); } -