X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Ffile.c;h=39b61c1a92c081e789105271aecde74922f7aecc;hb=160c265b93257c13ee21f944fe3f4c5d9e79a697;hp=9a65b75f5e358960a67f12f3166aaace3511278d;hpb=fff7b0b7ecaec9c34f702aa1b8dd8854ac7052ef;p=netatalk.git diff --git a/etc/afpd/file.c b/etc/afpd/file.c index 9a65b75f..39b61c1a 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -1,5 +1,5 @@ /* - * $Id: file.c,v 1.32 2002-01-02 21:14:10 srittau Exp $ + * $Id: file.c,v 1.47 2002-08-16 00:42:56 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -38,7 +38,7 @@ char *strchr (), *strrchr (); #include #include -#include +#include #include #include #include @@ -89,48 +89,33 @@ char *strchr (), *strrchr (); */ const u_char ufinderi[] = { - 'T', 'E', 'X', 'T', 'U', 'N', 'I', 'X', - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; + 'T', 'E', 'X', 'T', 'U', 'N', 'I', 'X', + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }; -int getfilparams(struct vol *vol, +int getmetadata(struct vol *vol, u_int16_t bitmap, char *path, struct dir *dir, struct stat *st, - char *buf, int *buflen ) + char *buf, int *buflen, struct adouble *adp, int attrbits ) { #ifndef USE_LASTDID - struct stat hst, lst, *lstp; -#else /* USE_LASTDID */ - struct stat hst; + struct stat lst, *lstp; #endif /* USE_LASTDID */ - struct adouble ad, *adp; - struct ofork *of; + struct stat hst; struct extmap *em; char *data, *nameoff = NULL, *upath; - int bit = 0, isad = 1; + int bit = 0; u_int32_t aint; u_int16_t ashort; u_char achar, fdType[4]; #ifdef DEBUG - syslog(LOG_INFO, "begin getfilparams:"); + LOG(log_info, logtype_afpd, "begin getmetadata:"); #endif /* DEBUG */ upath = mtoupath(vol, path); - if ((of = of_findname(vol, curdir, path))) { - adp = of->of_ad; - } else { - memset(&ad, 0, sizeof(ad)); - adp = &ad; - } - - if ( ad_open( upath, ADFLAGS_HF, O_RDONLY, 0, adp) < 0 ) { - isad = 0; - } else if ( fstat( ad_hfileno( adp ), &hst ) < 0 ) { - syslog( LOG_ERR, "getfilparams fstat: %s", strerror(errno) ); - } data = buf; while ( bitmap != 0 ) { @@ -141,14 +126,16 @@ int getfilparams(struct vol *vol, switch ( bit ) { case FILPBIT_ATTR : - if ( isad ) { + if ( adp ) { ad_getattr(adp, &ashort); } else if (*upath == '.') { ashort = htons(ATTRBIT_INVISIBLE); } else ashort = 0; + if (attrbits) + ashort = htons(ntohs(ashort) | attrbits); memcpy(data, &ashort, sizeof( ashort )); - data += sizeof( u_short ); + data += sizeof( ashort ); break; case FILPBIT_PDID : @@ -157,17 +144,22 @@ int getfilparams(struct vol *vol, break; case FILPBIT_CDATE : - if (!isad || (ad_getdate(adp, AD_DATE_CREATE, &aint) < 0)) + if (!adp || (ad_getdate(adp, AD_DATE_CREATE, &aint) < 0)) aint = AD_DATE_FROM_UNIX(st->st_mtime); memcpy(data, &aint, sizeof( aint )); data += sizeof( aint ); break; case FILPBIT_MDATE : - if ( isad && (ad_getdate(adp, AD_DATE_MODIFY, &aint) == 0)) { - if ((st->st_mtime > AD_DATE_TO_UNIX(aint)) && - (hst.st_mtime < st->st_mtime)) { - aint = AD_DATE_FROM_UNIX(st->st_mtime); + if ( adp && (ad_getdate(adp, AD_DATE_MODIFY, &aint) == 0)) { + if ((st->st_mtime > AD_DATE_TO_UNIX(aint))) { + if ( fstat( ad_hfileno( adp ), &hst ) < 0 ) { + LOG(log_error, logtype_default, "getfilparams fstat: %s", strerror(errno) ); + } + else if (hst.st_mtime < st->st_mtime) + aint = AD_DATE_FROM_UNIX(st->st_mtime); + else + aint = AD_DATE_FROM_UNIX(hst.st_mtime); } } else { aint = AD_DATE_FROM_UNIX(st->st_mtime); @@ -177,14 +169,14 @@ int getfilparams(struct vol *vol, break; case FILPBIT_BDATE : - if (!isad || (ad_getdate(adp, AD_DATE_BACKUP, &aint) < 0)) + if (!adp || (ad_getdate(adp, AD_DATE_BACKUP, &aint) < 0)) aint = AD_DATE_START; memcpy(data, &aint, sizeof( int )); data += sizeof( int ); break; case FILPBIT_FINFO : - if (isad) + if (adp) memcpy(data, ad_entry(adp, ADEID_FINDERI), 32); else { memcpy(data, ufinderi, 32); @@ -194,7 +186,7 @@ int getfilparams(struct vol *vol, } } - if ((!isad || (memcmp(ad_entry(adp, ADEID_FINDERI), + if ((!adp || (memcmp(ad_entry(adp, ADEID_FINDERI), ufinderi, 8 ) == 0)) && (em = getextmap( path ))) { memcpy(data, em->em_type, sizeof( em->em_type )); @@ -217,13 +209,26 @@ int getfilparams(struct vol *vol, aint = 0; #if AD_VERSION > AD_VERSION1 /* look in AD v2 header */ - if (isad) + if (adp) memcpy(&aint, ad_entry(adp, ADEID_DID), sizeof(aint)); #endif /* AD_VERSION > AD_VERSION1 */ #ifdef CNID_DB aint = cnid_add(vol->v_db, st, dir->d_did, upath, strlen(upath), aint); + /* Throw errors if cnid_add fails. */ + if (aint == CNID_INVALID) { + switch (errno) { + case CNID_ERR_PARAM: + LOG(log_error, logtype_afpd, "getfilparams: Incorrect parameters passed to cnid_add"); + return(AFPERR_PARAM); + case CNID_ERR_PATH: + return(AFPERR_PARAM); + case CNID_ERR_DB: + case CNID_ERR_MAX: + return(AFPERR_MISC); + } + } #endif /* CNID_DB */ if (aint == 0) { @@ -276,7 +281,7 @@ int getfilparams(struct vol *vol, break; case FILPBIT_RFLEN : - if ( isad ) { + if ( adp ) { aint = htonl( ad_getentrylen( adp, ADEID_RFORK )); } else { aint = 0; @@ -292,7 +297,7 @@ int getfilparams(struct vol *vol, to "pXYZ" when we created it. See IA, Ver 2. */ case FILPBIT_PDINFO : - if ( isad ) { + if ( adp ) { memcpy(fdType, ad_entry( adp, ADEID_FINDERI ), 4 ); if ( memcmp( fdType, "TEXT", 4 ) == 0 ) { @@ -334,9 +339,6 @@ int getfilparams(struct vol *vol, break; default : - if ( isad ) { - ad_close( adp, ADFLAGS_HF ); - } return( AFPERR_BITMAP ); } bitmap = bitmap>>1; @@ -351,18 +353,67 @@ int getfilparams(struct vol *vol, memcpy(data, path, aint ); data += aint; } - if ( isad ) { - ad_close( adp, ADFLAGS_HF ); - } *buflen = data - buf; + return (AFP_OK); +} + +/* ----------------------- */ +int getfilparams(struct vol *vol, + u_int16_t bitmap, + char *path, struct dir *dir, struct stat *st, + char *buf, int *buflen ) +{ + struct adouble ad, *adp; + struct ofork *of; + char *upath; + u_int16_t attrbits = 0; + int rc; +#ifdef DEBUG + LOG(log_info, logtype_default, "begin getfilparams:"); +#endif /* DEBUG */ + + upath = mtoupath(vol, path); + if ((of = of_findname(vol, dir, path))) { + adp = of->of_ad; + attrbits = ((of->of_ad->ad_df.adf_refcount > 0) ? ATTRBIT_DOPEN : 0); + attrbits |= ((of->of_ad->ad_hf.adf_refcount > of->of_ad->ad_df.adf_refcount)? ATTRBIT_ROPEN : 0); + } else { + memset(&ad, 0, sizeof(ad)); + adp = &ad; + } + + if ( ad_open( upath, ADFLAGS_HF, O_RDONLY, 0, adp) < 0 ) { + adp = NULL; + } + else { +#if 0 + /* FIXME + we need to check if the file is open by another process. + it's slow so we only do it if we have to: + - bitmap is requested. + - we don't already have the answer! + */ + if ((bitmap & (1 << FILPBIT_ATTR))) { + if (!(attrbits & ATTRBIT_ROPEN)) { + } + if (!(attrbits & ATTRBIT_DOPEN)) { + } + } +#endif + } + rc = getmetadata(vol, bitmap, path, dir, st, buf, buflen, adp, attrbits); + if ( adp ) { + ad_close( adp, ADFLAGS_HF ); + } #ifdef DEBUG - syslog(LOG_INFO, "end getfilparams:"); + LOG(log_info, logtype_afpd, "end getfilparams:"); #endif /* DEBUG */ - return( AFP_OK ); + return( rc ); } +/* ----------------------------- */ int afp_createfile(obj, ibuf, ibuflen, rbuf, rbuflen ) AFPObj *obj; char *ibuf, *rbuf; @@ -381,7 +432,7 @@ int ibuflen, *rbuflen; #endif /* FORCE_UIDGID */ #ifdef DEBUG - syslog(LOG_INFO, "begin afp_createfile:"); + LOG(log_info, logtype_afpd, "begin afp_createfile:"); #endif /* DEBUG */ *rbuflen = 0; @@ -409,20 +460,12 @@ int ibuflen, *rbuflen; return( AFPERR_NOOBJ ); } - if (!wincheck(vol, path)) - return AFPERR_PARAM; - upath = mtoupath(vol, path); - - if ((vol->v_flags & AFPVOL_NOHEX) && strchr(upath, '/')) - return AFPERR_PARAM; - - if (!validupath(vol, upath)) - return AFPERR_EXIST; - - /* check for vetoed filenames */ - if (veto_file(vol->v_veto, upath)) - return AFPERR_EXIST; + { + int ret; + if (0 != (ret = check_name(vol, upath))) + return ret; + } if ((of = of_findname(vol, curdir, path))) { adp = of->of_ad; @@ -436,6 +479,12 @@ int ibuflen, *rbuflen; return AFPERR_BUSY; openf = O_RDWR|O_CREAT|O_TRUNC; } else { + /* on a soft create, if the file is open then ad_open won't failed + because open syscall is not called + */ + if (of) { + return AFPERR_EXIST; + } openf = O_RDWR|O_CREAT|O_EXCL; } @@ -495,7 +544,7 @@ createfile_done: setvoltime(obj, vol ); #ifdef DEBUG - syslog(LOG_INFO, "end afp_createfile"); + LOG(log_info, logtype_afpd, "end afp_createfile"); #endif /* DEBUG */ #ifdef FORCE_UIDGID @@ -518,7 +567,7 @@ int ibuflen, *rbuflen; u_int16_t vid, bitmap; #ifdef DEBUG - syslog(LOG_INFO, "begin afp_setfilparams:"); + LOG(log_info, logtype_afpd, "begin afp_setfilparams:"); #endif /* DEBUG */ *rbuflen = 0; @@ -547,6 +596,10 @@ int ibuflen, *rbuflen; return( AFPERR_NOOBJ ); } + if ( *path == '\0' ) { + return( AFPERR_BADTYPE ); /* it's a directory */ + } + if ((u_long)ibuf & 1 ) { ibuf++; } @@ -556,7 +609,7 @@ int ibuflen, *rbuflen; } #ifdef DEBUG - syslog(LOG_INFO, "end afp_setfilparams:"); + LOG(log_info, logtype_afpd, "end afp_setfilparams:"); #endif /* DEBUG */ return( rc ); @@ -583,7 +636,7 @@ int setfilparams(struct vol *vol, #endif /* FORCE_UIDGID */ #ifdef DEBUG - syslog(LOG_INFO, "begin setfilparams:"); + LOG(log_info, logtype_afpd, "begin setfilparams:"); #endif /* DEBUG */ upath = mtoupath(vol, path); @@ -731,7 +784,7 @@ setfilparam_done: } #ifdef DEBUG - syslog(LOG_INFO, "end setfilparams:"); + LOG(log_info, logtype_afpd, "end setfilparams:"); #endif /* DEBUG */ return err; @@ -742,12 +795,20 @@ setfilparam_done: * and the new mac name. * NOTE: if we have to copy a file instead of renaming it, locks * will break. + * FIXME: locks on ressource fork will always break thanks to ad_close, done ? + * + * src the full source absolute path + * dst the dest filename in current dir + * newname the dest mac name + * adp adouble struct of src file, if open, or & zeroed one + * */ -int renamefile(src, dst, newname, noadouble ) +int renamefile(src, dst, newname, noadouble, adp ) char *src, *dst, *newname; const int noadouble; +struct adouble *adp; { - struct adouble ad; + struct ofork *opened; char adsrc[ MAXPATHLEN + 1]; int len, rc; @@ -761,7 +822,7 @@ const int noadouble; /* existence check moved to afp_moveandrename */ #ifdef DEBUG - syslog (LOG_INFO, "begin renamefile:"); + LOG(log_info, logtype_afpd, "begin renamefile:"); #endif /* DEBUG */ if ( rename( src, dst ) < 0 ) { @@ -775,10 +836,10 @@ const int noadouble; return AFPERR_VLOCK; case EXDEV : /* Cross device move -- try copy */ if (( rc = copyfile(src, dst, newname, noadouble )) != AFP_OK ) { - deletefile( dst ); + deletefile( dst, 0 ); return( rc ); } - return deletefile( src ); + return deletefile( src, 0); default : return( AFPERR_PARAM ); } @@ -794,12 +855,11 @@ rename_retry: case ENOENT : /* check for a source appledouble header. if it exists, make * a dest appledouble directory and do the rename again. */ - memset(&ad, 0, sizeof(ad)); if (rc || stat(adsrc, &st) || - (ad_open(dst, ADFLAGS_HF, O_RDWR | O_CREAT, 0666, &ad) < 0)) + (ad_open(dst, ADFLAGS_HF, O_RDWR | O_CREAT, 0666, adp) < 0)) return AFP_OK; rc++; - ad_close(&ad, ADFLAGS_HF); + ad_close(adp, ADFLAGS_HF); goto rename_retry; case EPERM: case EACCES : @@ -811,8 +871,7 @@ rename_retry: } } - memset(&ad, 0, sizeof(ad)); - if ( ad_open( dst, ADFLAGS_HF, O_RDWR, 0666, &ad) < 0 ) { + if ( ad_open( dst, ADFLAGS_HF, O_RDWR, 0666, adp) < 0 ) { switch ( errno ) { case ENOENT : return( AFPERR_NOOBJ ); @@ -826,13 +885,13 @@ rename_retry: } len = strlen( newname ); - ad_setentrylen( &ad, ADEID_NAME, len ); - memcpy(ad_entry( &ad, ADEID_NAME ), newname, len ); - ad_flush( &ad, ADFLAGS_HF ); - ad_close( &ad, ADFLAGS_HF ); + ad_setentrylen( adp, ADEID_NAME, len ); + memcpy(ad_entry( adp, ADEID_NAME ), newname, len ); + ad_flush( adp, ADFLAGS_HF ); + ad_close( adp, ADFLAGS_HF ); #ifdef DEBUG - syslog (LOG_INFO, "end renamefile:"); + LOG(log_info, logtype_afpd, "end renamefile:"); #endif /* DEBUG */ return( AFP_OK ); @@ -851,7 +910,7 @@ int ibuflen, *rbuflen; u_int16_t svid, dvid; #ifdef DEBUG - syslog (LOG_INFO, "begin afp_copyfile:"); + LOG(log_info, logtype_afpd, "begin afp_copyfile:"); #endif /* DEBUG */ *rbuflen = 0; @@ -935,7 +994,7 @@ int ibuflen, *rbuflen; #endif /* DROPKLUDGE */ #ifdef DEBUG - syslog (LOG_INFO, "end afp_copyfile:"); + LOG(log_info, logtype_afpd, "end afp_copyfile:"); #endif /* DEBUG */ return( retvalue ); @@ -948,7 +1007,7 @@ static __inline__ int copy_all(const int dfd, const void *buf, ssize_t cc; #ifdef DEBUG - syslog(LOG_INFO, "begin copy_all:"); + LOG(log_info, logtype_afpd, "begin copy_all:"); #endif /* DEBUG */ while (buflen > 0) { @@ -970,7 +1029,7 @@ static __inline__ int copy_all(const int dfd, const void *buf, } #ifdef DEBUG - syslog(LOG_INFO, "end copy_all:"); + LOG(log_info, logtype_afpd, "end copy_all:"); #endif /* DEBUG */ return AFP_OK; @@ -989,7 +1048,7 @@ const int noadouble; ssize_t cc; #ifdef DEBUG - syslog(LOG_INFO, "begin copyfile:"); + LOG(log_info, logtype_afpd, "begin copyfile:"); #endif /* DEBUG */ if (newname) { @@ -1150,15 +1209,22 @@ copydata_done: } #ifdef DEBUG - syslog(LOG_INFO, "end copyfile:"); + LOG(log_info, logtype_afpd, "end copyfile:"); #endif /* DEBUG */ return( AFP_OK ); } -int deletefile( file ) +/* ----------------------------------- + checkAttrib: 1 check kFPDeleteInhibitBit + ie deletfile called by afp_delete + + when deletefile is called we don't have lock on it, file is closed (for us) +*/ +int deletefile( file, checkAttrib ) char *file; +int checkAttrib; { struct adouble ad; int adflags, err = AFP_OK; @@ -1166,7 +1232,7 @@ char *file; int openmode = O_RDWR; #ifdef DEBUG - syslog(LOG_INFO, "begin deletefile:"); + LOG(log_info, logtype_afpd, "begin deletefile:"); #endif /* DEBUG */ while(1) { @@ -1219,11 +1285,33 @@ char *file; } break; /* from the while */ } + /* + * Does kFPDeleteInhibitBit (bit 8) set? + */ + if (checkAttrib && (adflags & ADFLAGS_HF)) { + u_int16_t bshort; - if ((adflags & ADFLAGS_HF) && - (ad_tmplock(&ad, ADEID_RFORK, locktype, 0, 0) < 0 )) { - ad_close( &ad, adflags ); - return( AFPERR_BUSY ); + ad_getattr(&ad, &bshort); + if ((bshort & htons(ATTRBIT_NODELETE))) { + ad_close( &ad, adflags ); + return(AFPERR_OLOCK); + } + } + + if ((adflags & ADFLAGS_HF) ) { + /* FIXME we have a pb here because we want to know if a file is open + * there's a 'priority inversion' if you can't open the ressource fork RW + * you can delete it if it's open because you can't get a write lock. + * + * ADLOCK_FILELOCK means the whole ressource fork, not only after the + * metadatas + * + * FIXME it doesn't for RFORK open read only and fork open without deny mode + */ + if (ad_tmplock(&ad, ADEID_RFORK, locktype |ADLOCK_FILELOCK, 0, 0) < 0 ) { + ad_close( &ad, adflags ); + return( AFPERR_BUSY ); + } } if (ad_tmplock( &ad, ADEID_DFORK, locktype, 0, 0 ) < 0) { @@ -1267,12 +1355,12 @@ char *file; delete_unlock: if (adflags & ADFLAGS_HF) - ad_tmplock(&ad, ADEID_RFORK, ADLOCK_CLR, 0, 0); + ad_tmplock(&ad, ADEID_RFORK, ADLOCK_CLR |ADLOCK_FILELOCK, 0, 0); ad_tmplock(&ad, ADEID_DFORK, ADLOCK_CLR, 0, 0); ad_close( &ad, adflags ); #ifdef DEBUG - syslog(LOG_INFO, "end deletefile:"); + LOG(log_info, logtype_afpd, "end deletefile:"); #endif /* DEBUG */ return err; @@ -1296,7 +1384,7 @@ int ibuflen, *rbuflen; u_short vid; #ifdef DEBUG - syslog(LOG_INFO, "begin afp_createid:"); + LOG(log_info, logtype_afpd, "begin afp_createid:"); #endif /* DEBUG */ *rbuflen = 0; @@ -1354,14 +1442,14 @@ int ibuflen, *rbuflen; } #endif /* AD_VERSION > AD_VERSION1 */ - if (id = cnid_add(vol->v_db, &st, did, upath, len, id)) { + if (id = cnid_add(vol->v_db, &st, did, upath, len, id) != CNID_INVALID) { memcpy(rbuf, &id, sizeof(id)); *rbuflen = sizeof(id); return AFP_OK; } #ifdef DEBUG - syslog(LOG_INFO, "ending afp_createid...:"); + LOG(log_info, logtype_afpd, "ending afp_createid...:"); #endif /* DEBUG */ switch (errno) { @@ -1373,7 +1461,7 @@ int ibuflen, *rbuflen; return AFPERR_ACCESS; break; default: - syslog(LOG_ERR, "afp_createid: cnid_add: %m"); + LOG(log_error, logtype_afpd, "afp_createid: cnid_add: %s", strerror(errno)); return AFPERR_PARAM; } } @@ -1392,8 +1480,11 @@ int ibuflen, *rbuflen; cnid_t id; u_int16_t vid, bitmap; + static char buffer[12 + MAXPATHLEN + 1]; + int len = 12 + MAXPATHLEN + 1; + #ifdef DEBUG - syslog(LOG_INFO, "begin afp_resolveid:"); + LOG(log_info, logtype_afpd, "begin afp_resolveid:"); #endif /* DEBUG */ *rbuflen = 0; @@ -1409,11 +1500,11 @@ int ibuflen, *rbuflen; memcpy(&id, ibuf, sizeof( id )); ibuf += sizeof(id); - if ((upath = cnid_resolve(vol->v_db, &id)) == NULL) { + if ((upath = cnid_resolve(vol->v_db, &id, buffer, len)) == NULL) { return AFPERR_BADID; } - if (( dir = dirsearch( vol, id )) == NULL ) { + if (( dir = dirlookup( vol, id )) == NULL ) { return( AFPERR_PARAM ); } @@ -1444,7 +1535,7 @@ int ibuflen, *rbuflen; memcpy(rbuf, ibuf, sizeof(bitmap)); #ifdef DEBUG - syslog(LOG_INFO, "end afp_resolveid:"); + LOG(log_info, logtype_afpd, "end afp_resolveid:"); #endif /* DEBUG */ return AFP_OK; @@ -1461,10 +1552,13 @@ int ibuflen, *rbuflen; char *upath; int err; cnid_t id; + cnid_t fileid; u_short vid; + static char buffer[12 + MAXPATHLEN + 1]; + int len = 12 + MAXPATHLEN + 1; #ifdef DEBUG - syslog(LOG_INFO, "begin afp_deleteid:"); + LOG(log_info, logtype_afpd, "begin afp_deleteid:"); #endif /* DEBUG */ *rbuflen = 0; @@ -1482,12 +1576,13 @@ int ibuflen, *rbuflen; memcpy(&id, ibuf, sizeof( id )); ibuf += sizeof(id); + fileid = id; - if ((upath = cnid_resolve(vol->v_db, &id)) == NULL) { + if ((upath = cnid_resolve(vol->v_db, &id, buffer, len)) == NULL) { return AFPERR_NOID; } - if (( dir = dirsearch( vol, id )) == NULL ) { + if (( dir = dirlookup( vol, id )) == NULL ) { return( AFPERR_PARAM ); } @@ -1510,7 +1605,7 @@ int ibuflen, *rbuflen; if (S_ISDIR(st.st_mode)) return AFPERR_BADTYPE; - if (cnid_delete(vol->v_db, id)) { + if (cnid_delete(vol->v_db, fileid)) { switch (errno) { case EROFS: return AFPERR_VLOCK; @@ -1523,7 +1618,7 @@ int ibuflen, *rbuflen; } #ifdef DEBUG - syslog(LOG_INFO, "end afp_deleteid:"); + LOG(log_info, logtype_afpd, "end afp_deleteid:"); #endif /* DEBUG */ return err; @@ -1543,6 +1638,12 @@ int ibuflen, *rbuflen; char *spath, temp[17], *path, *p; char *supath, *upath; int err; + struct adouble ads; + struct adouble add; + struct adouble *adsp; + struct adouble *addp; + struct ofork *opened; + #ifdef CNID_DB int slen, dlen; #endif /* CNID_DB */ @@ -1550,7 +1651,7 @@ int ibuflen, *rbuflen; u_int16_t vid; #ifdef DEBUG - syslog(LOG_INFO, "begin afp_exchangefiles:"); + LOG(log_info, logtype_afpd, "begin afp_exchangefiles:"); #endif /* DEBUG */ *rbuflen = 0; @@ -1582,7 +1683,7 @@ int ibuflen, *rbuflen; } if ( *path == '\0' ) { - return( AFPERR_BADTYPE ); + return( AFPERR_BADTYPE ); /* it's a dir */ } upath = mtoupath(vol, path); @@ -1597,7 +1698,12 @@ int ibuflen, *rbuflen; return AFPERR_PARAM; } } - + memset(&ads, 0, sizeof(ads)); + adsp = &ads; + if ((opened = of_findname(vol, curdir, path))) { + /* reuse struct adouble so it won't break locks */ + adsp = opened->of_ad; + } /* save some stuff */ sdir = curdir; spath = obj->oldtmp; @@ -1642,7 +1748,12 @@ int ibuflen, *rbuflen; return AFPERR_PARAM; } } - + memset(&add, 0, sizeof(add)); + addp = &add; + if ((opened = of_findname(vol, curdir, path))) { + /* reuse struct adouble so it won't break locks */ + addp = opened->of_ad; + } #ifdef CNID_DB /* look for destination id. */ did = cnid_lookup(vol->v_db, &destst, curdir->d_did, upath, @@ -1657,17 +1768,17 @@ int ibuflen, *rbuflen; return AFPERR_MISC; /* now, quickly rename the file. we error if we can't. */ - if ((err = renamefile(p, temp, temp, vol_noadouble(vol))) < 0) + if ((err = renamefile(p, temp, temp, vol_noadouble(vol), adsp)) < 0) goto err_exchangefile; of_rename(vol, sdir, spath, curdir, temp); /* rename destination to source */ - if ((err = renamefile(path, p, spath, vol_noadouble(vol))) < 0) + if ((err = renamefile(path, p, spath, vol_noadouble(vol), addp)) < 0) goto err_src_to_tmp; of_rename(vol, curdir, path, sdir, spath); /* rename temp to destination */ - if ((err = renamefile(temp, upath, path, vol_noadouble(vol))) < 0) + if ((err = renamefile(temp, upath, path, vol_noadouble(vol), adsp)) < 0) goto err_dest_to_src; of_rename(vol, curdir, temp, curdir, path); @@ -1679,7 +1790,7 @@ int ibuflen, *rbuflen; case EPERM: case EACCES: err = AFPERR_ACCESS; - break; + break; default: err = AFPERR_PARAM; } @@ -1692,7 +1803,7 @@ int ibuflen, *rbuflen; case EPERM: case EACCES: err = AFPERR_ACCESS; - break; + break; default: err = AFPERR_PARAM; } @@ -1704,7 +1815,7 @@ int ibuflen, *rbuflen; #endif /* CNID_DB */ #ifdef DEBUG - syslog(LOG_INFO, "ending afp_exchangefiles:"); + LOG(log_info, logtype_afpd, "ending afp_exchangefiles:"); #endif /* DEBUG */ return AFP_OK; @@ -1714,17 +1825,17 @@ int ibuflen, *rbuflen; * properly. */ err_temp_to_dest: /* rename dest to temp */ - renamefile(upath, temp, temp, vol_noadouble(vol)); + renamefile(upath, temp, temp, vol_noadouble(vol), adsp); of_rename(vol, curdir, upath, curdir, temp); err_dest_to_src: /* rename source back to dest */ - renamefile(p, upath, path, vol_noadouble(vol)); + renamefile(p, upath, path, vol_noadouble(vol), addp); of_rename(vol, sdir, spath, curdir, path); err_src_to_tmp: /* rename temp back to source */ - renamefile(temp, p, spath, vol_noadouble(vol)); + renamefile(temp, p, spath, vol_noadouble(vol), adsp); of_rename(vol, curdir, temp, sdir, spath); err_exchangefile: