X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Ffork.c;h=0c9ccef9c3c6f5e318532cce3f653c0cbd425276;hb=cb8de5b604041071f3454dd8df97295544caba59;hp=851dc2f2f41a0ce366ba98bdcd055e9d314c42e8;hpb=3778868fd627d3c5751d0cec1f9dabd4835bdb5e;p=netatalk.git diff --git a/etc/afpd/fork.c b/etc/afpd/fork.c index 851dc2f2..0c9ccef9 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" @@ -33,12 +34,6 @@ #include "desktop.h" #include "volume.h" -#ifdef DEBUG1 -#define Debug(a) ((a)->options.flags & OPTION_DEBUG) -#else -#define Debug(a) (0) -#endif - #ifdef AFS struct ofork *writtenfork; #endif @@ -95,7 +90,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 +111,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 +131,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 +145,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 +154,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 +175,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 +201,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 +270,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 +284,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 +313,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 +328,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 +338,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 +373,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 +383,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; @@ -427,8 +407,8 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si goto openfork_err; break; default: - LOG(log_error, logtype_afpd, "afp_openfork('%s/%s'): ad_open: errno: %i (%s)", - getcwdpath, s_path->m_name, errno, strerror(errno) ); + LOG(log_error, logtype_afpd, "afp_openfork(\"%s\"): %s", + abspath(s_path->m_name), strerror(errno) ); goto openfork_err; break; } @@ -439,14 +419,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 +836,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; } @@ -928,7 +912,7 @@ static int read_fork(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, si /* due to the nature of afp packets, we have to exit if we get an error. we can't do this with translation on. */ #ifdef WITH_SENDFILE - if (!(xlate || Debug(obj) )) { + if (!(xlate)) { int fd; fd = ad_readfile_init(ofork->of_ad, eid, &offset, 0); @@ -955,12 +939,6 @@ static int read_fork(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, si goto afp_read_exit; offset += *rbuflen; -#ifdef DEBUG1 - if (obj->options.flags & OPTION_DEBUG) { - printf( "(read) reply: %d, %d\n", *rbuflen, dsi->clientID); - bprint(rbuf, *rbuflen); - } -#endif /* dsi_read() also returns buffer size of next allocation */ cc = dsi_read(dsi, rbuf, *rbuflen); /* send it off */ if (cc < 0) @@ -1030,6 +1008,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 +1042,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 +1110,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 +1191,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; @@ -1255,12 +1254,6 @@ static int write_fork(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, s return( AFPERR_PARAM ); } -#ifdef DEBUG1 - if (obj->options.flags & OPTION_DEBUG) { - printf("(write) len: %d\n", *rbuflen); - bprint(rbuf, *rbuflen); - } -#endif if ((cc = write_file(ofork, eid, offset, rbuf, *rbuflen, xlate)) < 0) { *rbuflen = 0;