X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fappl.c;h=fe9ff250336214d410a32bee946578865d490fd2;hb=4054f4b3c85ecab060dafd46c0d3632cadbb5803;hp=bd7c88ddc8fb2bd1eab416bf62c9c169f19cf306;hpb=dae33a574ac2963d8bd279eaf96e08b5b48afc03;p=netatalk.git diff --git a/etc/afpd/appl.c b/etc/afpd/appl.c index bd7c88dd..fe9ff250 100644 --- a/etc/afpd/appl.c +++ b/etc/afpd/appl.c @@ -1,5 +1,5 @@ /* - * $Id: appl.c,v 1.11 2003-01-24 07:08:42 didg Exp $ + * $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. @@ -13,21 +13,15 @@ #include #include #include -#ifdef HAVE_FCNTL_H -#include -#endif /* HAVE_FCNTL_H */ -#ifdef HAVE_UNISTD_H -#include -#endif /* HAVE_UNISTD_H */ -#include -#include + #include #include #include -#include #include #include +#include +#include #include "volume.h" #include "globals.h" @@ -35,20 +29,14 @@ #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; @@ -95,11 +83,7 @@ u_char creator[ 4 ]; /* * 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; @@ -134,36 +118,83 @@ u_short 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_parent != NULL ) { - p -= strlen( dir->d_m_name ) + 1; - strcpy( p, dir->d_m_name ); - dir = dir->d_parent; + 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; + } + + if ((path = utompath(vol, uname, cnid, utf8_encoding())) == NULL) { + afp_errno = AFPERR_MISC; + ret = NULL; + goto exit; + } + } + + + +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; @@ -187,7 +218,7 @@ int ibuflen, *rbuflen; memcpy( &did, ibuf, sizeof( did )); ibuf += sizeof( did ); - if (( dir = dirlookup( vol, did )) == NULL ) { + if (NULL == ( dir = dirlookup( vol, did )) ) { return afp_errno; } @@ -197,8 +228,8 @@ int ibuflen, *rbuflen; memcpy( appltag, ibuf, sizeof( appltag )); ibuf += sizeof( appltag ); - if (( path = cname( vol, dir, &ibuf )) == NULL ) { - return afp_errno; + if (NULL == ( path = cname( vol, dir, &ibuf )) ) { + return get_afp_errno(AFPERR_PARAM); } if ( path_isadir(path) ) { return( AFPERR_BADTYPE ); @@ -217,7 +248,10 @@ int ibuflen, *rbuflen; return( AFPERR_PARAM ); } mpath = obj->newtmp; - mp = makemacpath( mpath, AFPOBJ_TMPSIZ, curdir, path->m_name ); + 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 */ @@ -247,10 +281,7 @@ int ibuflen, *rbuflen; 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; @@ -273,15 +304,15 @@ int ibuflen, *rbuflen; memcpy( &did, ibuf, sizeof( did )); ibuf += sizeof( did ); - if (( dir = dirlookup( vol, did )) == NULL ) { + 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 afp_errno; + if (NULL == ( path = cname( vol, dir, &ibuf )) ) { + return get_afp_errno(AFPERR_PARAM); } if ( path_isadir(path) ) { return( AFPERR_BADTYPE ); @@ -300,7 +331,11 @@ int ibuflen, *rbuflen; return( AFPERR_PARAM ); } mpath = obj->newtmp; - mp = makemacpath( mpath, AFPOBJ_TMPSIZ, curdir, path->m_name ); + 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 ); @@ -317,14 +352,12 @@ int ibuflen, *rbuflen; 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 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 ]; @@ -436,7 +469,7 @@ int ibuflen, *rbuflen; memcpy( q, p, len ); q = cbuf; - if (( path = cname( vol, vol->v_dir, &q )) == NULL ) { + if (( path = cname( vol, vol->v_root, &q )) == NULL ) { *rbuflen = 0; return( AFPERR_NOITEM ); }