X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=etc%2Fafpd%2Ffile.c;h=549f19ddfd4e06bebd0634648a406419fcb02587;hp=ec85f37a52e0dfdefb79335b05e447bb970138ea;hb=b0bcb8f6b0571592a50ce039882c9319e012a270;hpb=e22bbf78a53bf739dd38383de42a23c95d43c15d diff --git a/etc/afpd/file.c b/etc/afpd/file.c index ec85f37a..549f19dd 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -10,22 +10,7 @@ #include #include -/* STDC check */ -#if STDC_HEADERS #include -#else /* STDC_HEADERS */ -#ifndef HAVE_STRCHR -#define strchr index -#define strrchr index -#endif /* HAVE_STRCHR */ -char *strchr (), *strrchr (); - -#ifndef HAVE_MEMCPY -#define memcpy(d,s,n) bcopy ((s), (d), (n)) -#define memmove(d,s,n) bcopy ((s), (d), (n)) -#endif /* ! HAVE_MEMCPY */ -#endif /* STDC_HEADERS */ - #include #include #include @@ -632,12 +617,12 @@ int getfilparams(struct vol *vol, if (opened) { char *upath; - int flags = (bitmap & (1 << FILPBIT_ATTR))?ADFLAGS_OPENFORKS:0; + int flags = (bitmap & (1 << FILPBIT_ATTR)) ? ADFLAGS_CHECK_OF : 0; adp = of_ad(vol, path, &ad); upath = path->u_name; - if ( ad_metadata( upath, flags|ADFLAGS_CREATE, adp) < 0 ) { + if ( ad_metadata( upath, flags, adp) < 0 ) { switch (errno) { case EACCES: LOG(log_error, logtype_afpd, "getfilparams(%s): %s: check resource fork permission?", @@ -654,9 +639,7 @@ int getfilparams(struct vol *vol, } } rc = getmetadata(vol, bitmap, path, dir, buf, buflen, adp); - if ( adp ) { - ad_close_metadata( adp); - } + ad_close_metadata( adp); return( rc ); } @@ -664,7 +647,7 @@ int getfilparams(struct vol *vol, /* ----------------------------- */ int afp_createfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { - struct adouble ad, *adp; + struct adouble ad; struct vol *vol; struct dir *dir; struct ofork *of = NULL; @@ -680,9 +663,8 @@ int afp_createfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, memcpy(&vid, ibuf, sizeof( vid )); ibuf += sizeof( vid ); - if (NULL == ( vol = getvolbyvid( vid )) ) { + if (NULL == ( vol = getvolbyvid( vid )) ) return( AFPERR_PARAM ); - } if (vol->v_flags & AFPVOL_RO) return AFPERR_VLOCK; @@ -690,44 +672,35 @@ int afp_createfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, memcpy(&did, ibuf, sizeof( did)); ibuf += sizeof( did ); - if (NULL == ( dir = dirlookup( vol, did )) ) { + if (NULL == ( dir = dirlookup( vol, did )) ) return afp_errno; - } - if (NULL == ( s_path = cname( vol, dir, &ibuf )) ) { + if (NULL == ( s_path = cname( vol, dir, &ibuf )) ) return get_afp_errno(AFPERR_PARAM); - } - if ( *s_path->m_name == '\0' ) { + if ( *s_path->m_name == '\0' ) return( AFPERR_BADTYPE ); - } upath = s_path->u_name; + ad_init(&ad, vol->v_adouble, vol->v_ad_options); /* if upath is deleted we already in trouble anyway */ if ((of = of_findname(s_path))) { - adp = of->of_ad; - } else { - ad_init(&ad, vol->v_adouble, vol->v_ad_options); - adp = &ad; - } - if ( creatf) { - /* on a hard create, fail if file exists and is open */ - if (of) + if (creatf) return AFPERR_BUSY; + else + return AFPERR_EXIST; + } + + if ( creatf) openf = O_RDWR|O_CREAT|O_TRUNC; - } else { + else /* on a soft create, if the file is open then ad_open won't fail - because open syscall is not called - */ - if (of) { - return AFPERR_EXIST; - } + because open syscall is not called */ openf = O_RDWR|O_CREAT|O_EXCL; - } - if ( ad_open( upath, ADFLAGS_DF|ADFLAGS_HF|ADFLAGS_NOHF|ADFLAGS_CREATE, - openf, 0666, adp) < 0 ) { + if ( ad_open(&ad, upath, ADFLAGS_DF | ADFLAGS_HF | ADFLAGS_NOHF, + openf, 0666, openf, 0666) < 0 ) { switch ( errno ) { case EROFS: return AFPERR_VLOCK; @@ -744,48 +717,40 @@ int afp_createfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, return( AFPERR_PARAM ); } } - if ( ad_reso_fileno( adp ) == -1 ) { /* Hard META / HF */ + if ( ad_meta_fileno( &ad ) == -1 ) { /* Hard META / HF */ /* on noadouble volumes, just creating the data fork is ok */ if (vol_noadouble(vol)) { - ad_close( adp, ADFLAGS_DF ); + ad_close( &ad, ADFLAGS_DF ); goto createfile_done; } /* FIXME with hard create on an existing file, we already * corrupted the data file. */ netatalk_unlink( upath ); - ad_close( adp, ADFLAGS_DF ); + ad_close( &ad, ADFLAGS_DF ); return AFPERR_ACCESS; } path = s_path->m_name; - ad_setname(adp, path); + ad_setname(&ad, path); struct stat st; if (lstat(upath, &st) != 0) { LOG(log_error, logtype_afpd, "afp_createfile(\"%s\"): stat: %s", upath, strerror(errno)); - ad_close( adp, ADFLAGS_DF|ADFLAGS_HF); + ad_close(&ad, ADFLAGS_DF|ADFLAGS_HF); return AFPERR_MISC; } - (void)get_id(vol, adp, &st, dir->d_did, upath, strlen(upath)); - - ad_flush( adp); + (void)get_id(vol, &ad, &st, dir->d_did, upath, strlen(upath)); + ad_flush(&ad); + ad_close(&ad, ADFLAGS_DF|ADFLAGS_HF ); fce_register_new_file(s_path); - ad_close( adp, ADFLAGS_DF|ADFLAGS_HF ); - createfile_done: curdir->d_offcnt++; -#ifdef DROPKLUDGE - if (vol->v_flags & AFPVOL_DROPBOX) { - retvalue = matchfile2dirperms(upath, vol, did); - } -#endif /* DROPKLUDGE */ - setvoltime(obj, vol ); return (retvalue); @@ -1000,7 +965,7 @@ int setfilparams(struct vol *vol, /* second try with adouble open */ - if ( ad_open_metadata( upath, 0, O_CREAT, adp) < 0) { + if ( ad_open(adp, upath, ADFLAGS_HF, O_RDWR | O_CREAT, 0666) < 0) { LOG(log_debug, logtype_afpd, "setfilparams: ad_open_metadata error"); /* * For some things, we don't need an adouble header: @@ -1013,7 +978,7 @@ int setfilparams(struct vol *vol, } LOG(log_debug, logtype_afpd, "setfilparams: no adouble perms, but only FILPBIT_MDATE and/or FILPBIT_UNIXPR"); isad = 0; - } else if ((ad_get_HF_flags( adp ) & O_CREAT) ) { + } else if ((ad_get_MD_flags( adp ) & O_CREAT) ) { ad_setname(adp, path->m_name); } @@ -1094,7 +1059,6 @@ setfilparam_done: if (isad) { ad_flush( adp); ad_close_metadata( adp); - } if (change_parent_mdate && gettimeofday(&tv, NULL) == 0) { @@ -1180,9 +1144,8 @@ int renamefile(const struct vol *vol, int sdir_fd, char *src, char *dst, char *n } } - /* don't care if we can't open the newly renamed ressource fork - */ - if (!ad_open( dst, ADFLAGS_HF, O_RDWR, 0666, adp)) { + /* don't care if we can't open the newly renamed ressource fork */ + if (ad_open(adp, dst, ADFLAGS_HF, O_RDWR) == 0) { ad_setname(adp, newname); ad_flush( adp ); ad_close( adp, ADFLAGS_HF ); @@ -1310,11 +1273,11 @@ int afp_copyfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, si adp = of_ad(s_vol, s_path, &ad); - if (ad_open(s_path->u_name , ADFLAGS_DF |ADFLAGS_HF | ADFLAGS_NOHF, O_RDONLY, 0, adp) < 0) { + if (ad_open(adp, s_path->u_name, ADFLAGS_DF | ADFLAGS_HF | ADFLAGS_NOHF, O_RDONLY, O_RDONLY) < 0) { return AFPERR_DENYCONF; } - denyreadset = (getforkmode(adp, ADEID_DFORK, AD_FILELOCK_DENY_RD) != 0 || - getforkmode(adp, ADEID_RFORK, AD_FILELOCK_DENY_RD) != 0 ); + denyreadset = (ad_testlock(adp, ADEID_DFORK, AD_FILELOCK_DENY_RD) != 0 || + ad_testlock(adp, ADEID_RFORK, AD_FILELOCK_DENY_RD) != 0 ); if (denyreadset) { retvalue = AFPERR_DENYCONF; @@ -1330,9 +1293,6 @@ int afp_copyfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, si goto copy_exit; } -#ifdef FORCE_UIDGID - /* FIXME svid != dvid && dvid's user can't read svid */ -#endif if (NULL == ( d_vol = getvolbyvid( dvid )) ) { retvalue = AFPERR_PARAM; goto copy_exit; @@ -1377,12 +1337,6 @@ int afp_copyfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, si } curdir->d_offcnt++; -#ifdef DROPKLUDGE - if (vol->v_flags & AFPVOL_DROPBOX) { - retvalue=matchfile2dirperms(upath, vol, ddid); /* FIXME sdir or ddid */ - } -#endif /* DROPKLUDGE */ - setvoltime(obj, d_vol ); copy_exit: @@ -1521,7 +1475,7 @@ int copyfile(const struct vol *s_vol, adflags |= ADFLAGS_HF; } - if (ad_openat(sfd, src, adflags | ADFLAGS_NOHF, O_RDONLY, 0, adp) < 0) { + if (ad_openat(adp, sfd, src, adflags | ADFLAGS_NOHF, O_RDONLY, O_RDONLY) < 0) { ret_err = errno; goto done; } @@ -1539,7 +1493,7 @@ int copyfile(const struct vol *s_vol, } ad_init(&add, d_vol->v_adouble, d_vol->v_ad_options); - if (ad_open(dst , adflags, O_RDWR|O_CREAT|O_EXCL, st.st_mode, &add) < 0) { + if (ad_open(&add, dst, adflags, O_RDWR|O_CREAT|O_EXCL, st.st_mode, O_RDWR|O_CREAT|O_EXCL, st.st_mode) < 0) { ret_err = errno; ad_close( adp, adflags ); if (EEXIST != ret_err) { @@ -1654,7 +1608,7 @@ int deletefile(const struct vol *vol, int dirfd, char *file, int checkAttrib) * moreover sometimes deletefile is called with a no existent file and * ad_open would create a 0 byte resource fork */ - if ( ad_metadataat(dirfd, file, ADFLAGS_OPENFORKS, &ad) == 0 ) { + if ( ad_metadataat(dirfd, file, ADFLAGS_CHECK_OF, &ad) == 0 ) { if ((err = check_attrib(&ad))) { ad_close_metadata(&ad); return err; @@ -1665,7 +1619,7 @@ int deletefile(const struct vol *vol, int dirfd, char *file, int checkAttrib) /* try to open both forks at once */ adflags = ADFLAGS_DF; - if ( ad_openat(dirfd, file, adflags |ADFLAGS_HF|ADFLAGS_NOHF, O_RDONLY, 0, &ad ) < 0 ) { + if ( ad_openat(&ad, dirfd, file, adflags |ADFLAGS_HF|ADFLAGS_NOHF, O_RDONLY, O_RDONLY) < 0 ) { switch (errno) { case ENOENT: err = AFPERR_NOOBJ; @@ -1808,32 +1762,12 @@ static int reenumerate_loop(struct dirent *de, char *mname _U_, void *data) cnid_t did = param->did; cnid_t aint; - if ( lstat(de->d_name, &path.st)<0 ) + if ( lstat(de->d_name, &path.st) < 0 ) return 0; /* update or add to cnid */ aint = cnid_add(vol->v_cdb, &path.st, did, de->d_name, strlen(de->d_name), 0); /* ignore errors */ -#if AD_VERSION > AD_VERSION1 - if (aint != CNID_INVALID && !S_ISDIR(path.st.st_mode)) { - struct adouble ad, *adp; - - path.st_errno = 0; - path.st_valid = 1; - path.u_name = de->d_name; - - adp = of_ad(vol, &path, &ad); - - if ( ad_open_metadata( de->d_name, 0, 0, adp ) < 0 ) { - return 0; - } - if (ad_setid(adp, path.st.st_dev, path.st.st_ino, aint, did, vol->v_stamp)) { - ad_flush(adp); - } - ad_close_metadata(adp); - } -#endif /* AD_VERSION > AD_VERSION1 */ - return 0; } @@ -2095,7 +2029,7 @@ static struct adouble *find_adouble(struct path *path, struct ofork **of, struct adp = (*of)->of_ad; } else { - ret = ad_open( path->u_name, ADFLAGS_HF, O_RDONLY, 0, adp); + ret = ad_open(adp, path->u_name, ADFLAGS_HF, O_RDONLY); /* META and HF */ if ( !ret && ad_reso_fileno(adp) != -1 && !(adp->ad_resource_fork.adf_flags & ( O_RDWR | O_WRONLY))) { /* from AFP spec.