X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fappl.c;h=51b64ef283b97d48e3ef826fd25d20a6c3b7a7ed;hb=465246e257d9aff9855e3e35d8fd5983db932b45;hp=a595c21098b467cf0d83c64971e08b6fe04c1b90;hpb=ecfc96169ab669b578e53fa8e13592934fe37788;p=netatalk.git diff --git a/etc/afpd/appl.c b/etc/afpd/appl.c index a595c210..51b64ef2 100644 --- a/etc/afpd/appl.c +++ b/etc/afpd/appl.c @@ -1,5 +1,5 @@ /* - * $Id: appl.c,v 1.15 2005-04-28 20:49:40 bfernhomberg 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. @@ -20,29 +20,23 @@ #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, 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 ]; -int flags; -int mode; +static int applopen(struct vol *vol, u_char creator[ 4 ], int flags, int mode) { char *dtf, *adt, *adts; @@ -89,11 +83,7 @@ int 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; @@ -134,11 +124,7 @@ u_short mplen; * 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; @@ -146,23 +132,69 @@ char *path; p -= strlen( path ); memcpy( p, path, strlen( path )); - while ( dir->d_parent != NULL ) { - p -= strlen( dir->d_m_name ) + 1; + while ( dir->d_did != DIRDID_ROOT ) { + p -= blength(dir->d_m_name) + 1; if (p < mpath) { /* FIXME: pathname too long */ return NULL; } - strcpy( p, dir->d_m_name ); - dir = dir->d_parent; + 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 _U_; -int ibuflen _U_, *rbuflen; +int afp_addappl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { struct vol *vol; struct dir *dir; @@ -216,7 +248,7 @@ int ibuflen _U_, *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; } @@ -249,10 +281,7 @@ int ibuflen _U_, *rbuflen; return( AFP_OK ); } -int afp_rmvappl(obj, ibuf, ibuflen, rbuf, rbuflen ) -AFPObj *obj; -char *ibuf, *rbuf _U_; -int ibuflen _U_, *rbuflen; +int afp_rmvappl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { struct vol *vol; struct dir *dir; @@ -302,7 +331,7 @@ int ibuflen _U_, *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 ; } @@ -323,14 +352,12 @@ int ibuflen _U_, *rbuflen; return( AFP_OK ); } -int afp_getappl(obj, ibuf, ibuflen, rbuf, rbuflen ) -AFPObj *obj; -char *ibuf, *rbuf; -int ibuflen _U_, *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 ]; @@ -442,7 +469,7 @@ int ibuflen _U_, *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 ); }