X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Ffork.c;h=eb18fd3373109d5c3b72fc1a8ea06e0f5b510cb8;hb=d82952695132e6dc2de60655de1dccb805e2f26b;hp=35d05152c2e76a227e167ae1c0acbcc5a3ec6ce0;hpb=22b6ad9df2e4d9608e47b262d69927bf5958bd44;p=netatalk.git diff --git a/etc/afpd/fork.c b/etc/afpd/fork.c index 35d05152..eb18fd33 100644 --- a/etc/afpd/fork.c +++ b/etc/afpd/fork.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "fork.h" #include "file.h" @@ -95,7 +96,6 @@ static int getforkparams(struct ofork *ofork, u_int16_t bitmap, char *buf, size_ return getmetadata(vol, bitmap, &path, dir, buf, buflen, adp ); } -/* ---------------------------- */ static off_t get_off_t(char **ibuf, int is64) { u_int32_t temp; @@ -117,7 +117,6 @@ static off_t get_off_t(char **ibuf, int is64) return ret; } -/* ---------------------- */ static int set_off_t(off_t offset, char *rbuf, int is64) { u_int32_t temp; @@ -138,8 +137,6 @@ static int set_off_t(off_t offset, char *rbuf, int is64) return ret; } -/* ------------------------ - */ static int is_neg(int is64, off_t val) { if (val < 0 || (sizeof(off_t) == 8 && !is64 && (val & 0x80000000U))) @@ -154,22 +151,6 @@ static int sum_neg(int is64, off_t offset, off_t reqcount) return 0; } -/* ------------------------- - */ -static int setforkmode(struct adouble *adp, int eid, int ofrefnum, int what) -{ - return ad_lock(adp, eid, ADLOCK_RD | ADLOCK_FILELOCK, what, 1, ofrefnum); -} - -/* ------------------------- - */ -int getforkmode(struct adouble *adp, int eid, int what) -{ - return ad_testlock(adp, eid, what); -} - -/* ------------------------- - */ static int fork_setmode(struct adouble *adp, int eid, int access, int ofrefnum) { int ret; @@ -179,13 +160,13 @@ static int fork_setmode(struct adouble *adp, int eid, int access, int ofrefnum) int denywriteset; if (! (access & (OPENACC_WR | OPENACC_RD | OPENACC_DWR | OPENACC_DRD))) { - return setforkmode(adp, eid, ofrefnum, AD_FILELOCK_OPEN_NONE); + return ad_lock(adp, eid, ADLOCK_RD | ADLOCK_FILELOCK, AD_FILELOCK_OPEN_NONE, 1, ofrefnum); } if ((access & (OPENACC_RD | OPENACC_DRD))) { - if ((readset = getforkmode(adp, eid, AD_FILELOCK_OPEN_RD)) <0) + if ((readset = ad_testlock(adp, eid, AD_FILELOCK_OPEN_RD)) <0) return readset; - if ((denyreadset = getforkmode(adp, eid, AD_FILELOCK_DENY_RD)) <0) + if ((denyreadset = ad_testlock(adp, eid, AD_FILELOCK_DENY_RD)) <0) return denyreadset; if ((access & OPENACC_RD) && denyreadset) { @@ -200,21 +181,21 @@ static int fork_setmode(struct adouble *adp, int eid, int access, int ofrefnum) * true */ if ((access & OPENACC_RD)) { - ret = setforkmode(adp, eid, ofrefnum, AD_FILELOCK_OPEN_RD); + ret = ad_lock(adp, eid, ADLOCK_RD | ADLOCK_FILELOCK, AD_FILELOCK_OPEN_RD, 1, ofrefnum); if (ret) return ret; } if ((access & OPENACC_DRD)) { - ret = setforkmode(adp, eid, ofrefnum, AD_FILELOCK_DENY_RD); + ret = ad_lock(adp, eid, ADLOCK_RD | ADLOCK_FILELOCK, AD_FILELOCK_DENY_RD, 1, ofrefnum); if (ret) return ret; } } /* ------------same for writing -------------- */ if ((access & (OPENACC_WR | OPENACC_DWR))) { - if ((writeset = getforkmode(adp, eid, AD_FILELOCK_OPEN_WR)) <0) + if ((writeset = ad_testlock(adp, eid, AD_FILELOCK_OPEN_WR)) <0) return writeset; - if ((denywriteset = getforkmode(adp, eid, AD_FILELOCK_DENY_WR)) <0) + if ((denywriteset = ad_testlock(adp, eid, AD_FILELOCK_DENY_WR)) <0) return denywriteset; if ((access & OPENACC_WR) && denywriteset) { @@ -226,12 +207,12 @@ static int fork_setmode(struct adouble *adp, int eid, int access, int ofrefnum) return -1; } if ((access & OPENACC_WR)) { - ret = setforkmode(adp, eid, ofrefnum, AD_FILELOCK_OPEN_WR); + ret = ad_lock(adp, eid, ADLOCK_RD | ADLOCK_FILELOCK, AD_FILELOCK_OPEN_WR, 1, ofrefnum); if (ret) return ret; } if ((access & OPENACC_DWR)) { - ret = setforkmode(adp, eid, ofrefnum, AD_FILELOCK_DENY_WR); + ret = ad_lock(adp, eid, ADLOCK_RD | ADLOCK_FILELOCK, AD_FILELOCK_DENY_WR, 1, ofrefnum); if (ret) return ret; } @@ -295,6 +276,11 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si return AFPERR_BADTYPE; } + LOG(log_debug, logtype_afpd, + "afp_openfork(\"%s\", %s)", + abspath(s_path->u_name), + (fork & OPENFORK_RSCS) ? "OPENFORK_RSCS" : "OPENFORK_DATA"); + /* stat() data fork st is set because it's not a dir */ switch ( s_path->st_errno ) { case 0: @@ -304,7 +290,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si case EACCES: return (access & OPENACC_WR) ? AFPERR_LOCK : AFPERR_ACCESS; default: - LOG(log_error, logtype_afpd, "afp_openfork(%s): ad_open: %s", s_path->m_name, strerror(errno) ); + LOG(log_error, logtype_afpd, "afp_openfork(%s): %s", s_path->m_name, strerror(errno)); return AFPERR_PARAM; } /* FIXME should we check it first ? */ @@ -333,7 +319,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si if ( fork == OPENFORK_DATA ) { eid = ADEID_DFORK; - adflags = ADFLAGS_DF | ADFLAGS_HF; + adflags = ADFLAGS_DF | ADFLAGS_HF ; } else { eid = ADEID_RFORK; adflags = ADFLAGS_RF | ADFLAGS_HF; @@ -348,7 +334,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si ret = AFPERR_NOOBJ; if (access & OPENACC_WR) { /* try opening in read-write mode */ - if (ad_open(upath, adflags, O_RDWR, 0, ofork->of_ad) < 0) { + if (ad_open(ofork->of_ad, upath, adflags, O_RDWR, O_RDWR) < 0) { switch ( errno ) { case EROFS: ret = AFPERR_VLOCK; @@ -358,14 +344,14 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si case ENOENT: if (fork == OPENFORK_DATA) { /* try to open only the data fork */ - if (ad_open(upath, ADFLAGS_DF, O_RDWR, 0, ofork->of_ad) < 0) { + if (ad_open(ofork->of_ad, upath, ADFLAGS_DF, O_RDWR) < 0) { goto openfork_err; } adflags = ADFLAGS_DF; } else { /* here's the deal. we only try to create the resource * fork if the user wants to open it for write acess. */ - if (ad_open(upath, adflags, O_RDWR | O_CREAT, 0666, ofork->of_ad) < 0) + if (ad_open(ofork->of_ad, upath, adflags, O_RDWR | O_CREAT, 0666, O_RDWR | O_CREAT, 0666) < 0) goto openfork_err; ofork->of_flags |= AFPFORK_OPEN; } @@ -393,7 +379,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si } else { /* try opening in read-only mode */ ret = AFPERR_NOOBJ; - if (ad_open(upath, adflags, O_RDONLY, 0, ofork->of_ad) < 0) { + if (ad_open(ofork->of_ad, upath, adflags, O_RDONLY, O_RDONLY) < 0) { switch ( errno ) { case EROFS: ret = AFPERR_VLOCK; @@ -403,7 +389,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si case ENOENT: /* see if client asked for a read only data fork */ if (fork == OPENFORK_DATA) { - if (ad_open(upath, ADFLAGS_DF, O_RDONLY, 0, ofork->of_ad) < 0) { + if (ad_open(ofork->of_ad, upath, ADFLAGS_DF, O_RDONLY) < 0) { goto openfork_err; } adflags = ADFLAGS_DF; @@ -439,14 +425,13 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si } } - if ((adflags & ADFLAGS_HF) && (ad_get_HF_flags( ofork->of_ad) & O_CREAT)) { + if ((adflags & ADFLAGS_RF) && (ad_get_RF_flags( ofork->of_ad) & O_CREAT)) { if (ad_setname(ofork->of_ad, path)) { ad_flush( ofork->of_ad ); } } - if (( ret = getforkparams(ofork, bitmap, rbuf + 2 * sizeof( u_int16_t ), - &buflen )) != AFP_OK ) { + if ((ret = getforkparams(ofork, bitmap, rbuf + 2 * sizeof(int16_t), &buflen)) != AFP_OK) { ad_close( ofork->of_ad, adflags ); goto openfork_err; } @@ -857,6 +842,11 @@ static int read_fork(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, si offset = get_off_t(&ibuf, is64); reqcount = get_off_t(&ibuf, is64); + LOG(log_debug, logtype_afpd, + "afp_read(\"%s\", off: %" PRIu64 ", size: %" PRIu64 ", fork: %s)", + cfrombstr(ofork->of_ad->ad_fullpath), offset, reqcount, + (ofork->of_flags & AFPFORK_DATA) ? "d" : "r"); + if (is64) { nlmask = nlchar = 0; } @@ -1030,6 +1020,11 @@ int afp_flushfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U return( AFPERR_PARAM ); } + LOG(log_debug, logtype_afpd, + "afp_flushfork(\"%s\", fork: %s)", + cfrombstr(ofork->of_ad->ad_fullpath), + (ofork->of_flags & AFPFORK_DATA) ? "d" : "r"); + if ( flushfork( ofork ) < 0 ) { LOG(log_error, logtype_afpd, "afp_flushfork(%s): %s", of_name(ofork), strerror(errno) ); } @@ -1059,6 +1054,11 @@ int afp_syncfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U_ return( AFPERR_PARAM ); } + LOG(log_debug, logtype_afpd, + "afp_syncfork(\"%s\", fork: %s)", + cfrombstr(ofork->of_ad->ad_fullpath), + (ofork->of_flags & AFPFORK_DATA) ? "d" : "r"); + if ( flushfork( ofork ) < 0 ) { LOG(log_error, logtype_afpd, "flushfork(%s): %s", of_name(ofork), strerror(errno) ); return AFPERR_MISC; @@ -1122,6 +1122,12 @@ int afp_closefork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U LOG(log_error, logtype_afpd, "afp_closefork: of_find(%d) could not locate fork", ofrefnum ); return( AFPERR_PARAM ); } + + LOG(log_debug, logtype_afpd, + "afp_closefork(\"%s\", fork: %s)", + cfrombstr(ofork->of_ad->ad_fullpath), + (ofork->of_flags & AFPFORK_DATA) ? "d" : "r"); + if ( of_closefork( ofork ) < 0 ) { LOG(log_error, logtype_afpd, "afp_closefork(%s): of_closefork: %s", of_name(ofork), strerror(errno) ); return( AFPERR_PARAM ); @@ -1197,6 +1203,11 @@ static int write_fork(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, s goto afp_write_err; } + LOG(log_debug, logtype_afpd, + "afp_write(\"%s\", off: %" PRIu64 ", size: %" PRIu64 ", fork: %s)", + cfrombstr(ofork->of_ad->ad_fullpath), offset, reqcount, + (ofork->of_flags & AFPFORK_DATA) ? "d" : "r"); + if ((ofork->of_flags & AFPFORK_ACCWR) == 0) { err = AFPERR_ACCESS; goto afp_write_err;