]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/fork.c
Merge branch 'release-3-0-alpha2'
[netatalk.git] / etc / afpd / fork.c
index 3f8018d039e661d4e46221a3ab24833ad013110b..2216a45c1b32a0d40be5b89698a9a95bc8553ffc 100644 (file)
@@ -25,6 +25,7 @@
 #include <atalk/bstradd.h>
 #include <atalk/globals.h>
 #include <atalk/netatalk_conf.h>
+#include <atalk/ea.h>
 
 #include "fork.h"
 #include "file.h"
@@ -64,10 +65,10 @@ static int getforkparams(const AFPObj *obj, struct ofork *ofork, uint16_t bitmap
     vol = ofork->of_vol;
     dir = dirlookup(vol, ofork->of_did);
 
-    if (NULL == (path.u_name = mtoupath(vol, of_name(ofork), dir->d_did, utf8_encoding()))) {
+    if (NULL == (path.m_name = utompath(vol, of_name(ofork), dir->d_did, utf8_encoding(obj)))) {
         return( AFPERR_MISC );
     }
-    path.m_name = of_name(ofork);
+    path.u_name = of_name(ofork);
     path.id = 0;
     st = &path.st;
     if ( bitmap & ( (1<<FILPBIT_DFLEN) | (1<<FILPBIT_EXTDFLEN) |
@@ -488,7 +489,7 @@ openfork_err:
     return ret;
 }
 
-int afp_setforkparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen, char *rbuf _U_, size_t *rbuflen)
+int afp_setforkparams(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf _U_, size_t *rbuflen)
 {
     struct ofork    *ofork;
     off_t       size;
@@ -536,7 +537,7 @@ int afp_setforkparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen, char *rbuf _U
 
     is64 = 0;
     if ((bitmap & ( (1<<FILPBIT_EXTDFLEN) | (1<<FILPBIT_EXTRFLEN) ))) {
-        if (afp_version >= 30) {
+        if (obj->afp_version >= 30) {
             is64 = 4;
         }
         else
@@ -573,6 +574,7 @@ int afp_setforkparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen, char *rbuf _U
             ad_tmplock(ofork->of_ad, eid, ADLOCK_WR, size, st_size -size, ofork->of_refnum) < 0) {
             goto afp_setfork_err;
         }
+
         err = ad_rtruncate(ofork->of_ad, size);
         if (st_size > size)
             ad_tmplock(ofork->of_ad, eid, ADLOCK_CLR, size, st_size -size, ofork->of_refnum);
@@ -877,22 +879,22 @@ 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
-        int fd;
-
-        fd = ad_readfile_init(ofork->of_ad, eid, &offset, 0);
-
-        if (dsi_stream_read_file(dsi, fd, offset, dsi->datasize) < 0) {
-            if (errno == EINVAL || errno == ENOSYS)
-                goto afp_read_loop;
-            else {
-                LOG(log_error, logtype_afpd, "afp_read(%s): ad_readfile: %s", of_name(ofork), strerror(errno));
-                goto afp_read_exit;
+        if (!(obj->options.flags & OPTION_NOSENDFILE)) {
+            int fd = ad_readfile_init(ofork->of_ad, eid, &offset, 0);
+            if (dsi_stream_read_file(dsi, fd, offset, dsi->datasize) < 0) { 
+               switch (errno) {
+                case EINVAL:
+                case ENOSYS:
+                    goto afp_read_loop;
+                default:
+                    LOG(log_error, logtype_afpd, "afp_read(%s): ad_readfile: %s", of_name(ofork), strerror(errno));
+                    goto afp_read_exit;
+                }
             }
-        }
-
-        dsi_readdone(dsi);
-        goto afp_read_done;
 
+            dsi_readdone(dsi);
+            goto afp_read_done;
+        }
     afp_read_loop:
 #endif
 
@@ -1206,29 +1208,27 @@ static int write_fork(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, s
     offset += cc;
 
 #if 0 /*def HAVE_SENDFILE_WRITE*/
-    if (!(obj->options.flags & OPTION_DEBUG)) {
-        if ((cc = ad_writefile(ofork->of_ad, eid, dsi->socket,
-                               offset, dsi->datasize)) < 0) {
-            switch (errno) {
-            case EDQUOT :
-            case EFBIG :
-            case ENOSPC :
-                cc = AFPERR_DFULL;
-                break;
-            default :
-                LOG(log_error, logtype_afpd, "afp_write: ad_writefile: %s", strerror(errno) );
-                goto afp_write_loop;
-            }
-            dsi_writeflush(dsi);
-            *rbuflen = 0;
-            ad_tmplock(ofork->of_ad, eid, ADLOCK_CLR, saveoff,
-                       reqcount,  ofork->of_refnum);
-            return cc;
+    if ((cc = ad_writefile(ofork->of_ad, eid, dsi->socket,
+                           offset, dsi->datasize)) < 0) {
+        switch (errno) {
+        case EDQUOT:
+        case EFBIG:
+        case ENOSPC:
+            cc = AFPERR_DFULL;
+            break;
+        default:
+            LOG(log_error, logtype_afpd, "afp_write: ad_writefile: %s", strerror(errno) );
+            goto afp_write_loop;
         }
-
-        offset += cc;
-        goto afp_write_done;
+        dsi_writeflush(dsi);
+        *rbuflen = 0;
+        ad_tmplock(ofork->of_ad, eid, ADLOCK_CLR, saveoff,
+                   reqcount,  ofork->of_refnum);
+        return cc;
     }
+
+    offset += cc;
+    goto afp_write_done;
 #endif /* 0, was HAVE_SENDFILE_WRITE */
 
     /* loop until everything gets written. currently