]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/file.c
Various fixes for adouble:v2
[netatalk.git] / etc / afpd / file.c
index 78c7a5fb3f154f485a40bff58b68d9ce57bbbc0d..6d253d1ecc43941a8e62b12697be86061c35524c 100644 (file)
@@ -609,6 +609,7 @@ int getfilparams(struct vol *vol,
     struct adouble     ad, *adp;
     int                 opened = 0;
     int rc;    
+    int flags;
 
     LOG(log_debug, logtype_afpd, "getfilparams(\"%s\")", path->u_name);
 
@@ -617,7 +618,7 @@ int getfilparams(struct vol *vol,
 
     if (opened) {
         char *upath;
-        int  flags = (bitmap & (1 << FILPBIT_ATTR)) ? ADFLAGS_CHECK_OF : 0;
+        flags = (bitmap & (1 << FILPBIT_ATTR)) ? ADFLAGS_CHECK_OF : 0;
 
         adp = of_ad(vol, path, &ad);
         upath = path->u_name;
@@ -639,7 +640,7 @@ int getfilparams(struct vol *vol,
         }
     }
     rc = getmetadata(vol, bitmap, path, dir, buf, buflen, adp);
-    ad_close(adp, ADFLAGS_HF);
+    ad_close(adp, ADFLAGS_HF | flags);
 
     return( rc );
 }
@@ -677,7 +678,6 @@ int afp_createfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_,
 
     if (NULL == ( s_path = cname( vol, dir, &ibuf )) )
         return get_afp_errno(AFPERR_PARAM);
-
     if ( *s_path->m_name == '\0' )
         return( AFPERR_BADTYPE );
 
@@ -821,9 +821,7 @@ int setfilparams(struct vol *vol,
     uint32_t           aint;
     uint32_t           upriv;
     uint16_t           upriv_bit = 0;
-    
-    struct utimbuf     ut;
-
+        struct utimbuf ut;
     int                 change_mdate = 0;
     int                 change_parent_mdate = 0;
     int                 newdate = 0;
@@ -833,6 +831,7 @@ int setfilparams(struct vol *vol,
     uint16_t           bitmap = f_bitmap;
     uint32_t           cdate,bdate;
     u_char              finder_buf[32];
+    int symlinked = 0;
 
 #ifdef DEBUG
     LOG(log_debug9, logtype_afpd, "begin setfilparams:");
@@ -875,16 +874,15 @@ int setfilparams(struct vol *vol,
         case FILPBIT_FINFO :
             change_mdate = 1;
             memcpy(finder_buf, buf, 32 );
-            if (memcmp(buf,"slnkrhap",8)==0 && !S_ISLNK(path->st.st_mode)){
-            // SLFINFO
+            if (memcmp(buf, "slnkrhap", 8) == 0 && !S_ISLNK(path->st.st_mode)) {
                 int fp;
                 ssize_t len;
                 int erc=1;
                 char buf[PATH_MAX+1];
-                if ((fp=open(path->u_name,O_RDONLY))>=0){
-                    if ((len=read(fp,buf,PATH_MAX+1))){
-                        if (unlink(path->u_name)==0){
-                            buf[len]=0;
+                if ((fp = open(path->u_name, O_RDONLY)) >= 0) {
+                    if ((len = read(fp, buf, PATH_MAX+1))) {
+                        if (unlink(path->u_name) == 0) {
+                            buf[len] = 0;
                             erc = symlink(buf, path->u_name);
                             if (!erc)
                                 of_stat(path);
@@ -892,10 +890,11 @@ int setfilparams(struct vol *vol,
                     }
                     close(fp);
                 }
-                if (erc!=0){
+                if (erc != 0) {
                     err=AFPERR_BITMAP;
                     goto setfilparam_done;
                 }
+                symlinked = 1;
             }
             buf += 32;
             break;
@@ -966,7 +965,7 @@ int setfilparams(struct vol *vol,
          * - change of modification date
          * - UNIX privs (Bug-ID #2863424)
          */
-        if (f_bitmap & ~(1<<FILPBIT_MDATE | 1<<FILPBIT_UNIXPR)) {
+        if (!symlinked && f_bitmap & ~(1<<FILPBIT_MDATE | 1<<FILPBIT_UNIXPR)) {
             LOG(log_debug, logtype_afpd, "setfilparams: need adouble access");
             return AFPERR_ACCESS;
         }
@@ -1334,7 +1333,7 @@ int afp_copyfile(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, si
     setvoltime(obj, d_vol );
 
 copy_exit:
-    ad_close( adp, ADFLAGS_DF |ADFLAGS_HF );
+    ad_close( adp, ADFLAGS_DF |ADFLAGS_HF | ADFLAGS_SETSHRMD);
     return( retvalue );
 }
 
@@ -1387,19 +1386,7 @@ static int copy_fork(int eid, struct adouble *add, struct adouble *ads)
         dfd = ad_reso_fileno(add);
     }        
 
-    if (add->ad_version == AD_VERSION2)
-        soff = doff = ad_getentryoff(ads, eid);
-    else {
-        if (eid == ADEID_DFORK)
-            soff = doff = ad_getentryoff(ads, eid);
-        else {
-#ifdef HAVE_EAFD
-            soff = doff = 0;
-#else
-            soff = doff = ADEDOFF_RFORK_OSX;
-#endif
-        }
-    }
+    soff = doff = ad_getentryoff(ads, eid);
 
     if ((off_t)-1 == lseek(sfd, soff, SEEK_SET))
        return -1;
@@ -1480,9 +1467,6 @@ int copyfile(const struct vol *s_vol,
     }
 
     adflags = ADFLAGS_DF | ADFLAGS_RF | ADFLAGS_NORF;
-    if (newname) {
-        adflags |= ADFLAGS_HF;
-    }
 
     if (ad_openat(adp, sfd, src, adflags | ADFLAGS_NOHF | ADFLAGS_RDONLY) < 0) {
         ret_err = errno;
@@ -1501,7 +1485,7 @@ int copyfile(const struct vol *s_vol,
     }
 
     ad_init(&add, d_vol);
-    if (ad_open(&add, dst, adflags | ADFLAGS_RDWR | ADFLAGS_CREATE | ADFLAGS_EXCL, st.st_mode) < 0) {
+    if (ad_open(&add, dst, adflags | ADFLAGS_RDWR | ADFLAGS_CREATE | ADFLAGS_EXCL, st.st_mode | S_IRUSR | S_IWUSR) < 0) {
         ret_err = errno;
         ad_close( adp, adflags );
         if (EEXIST != ret_err) {
@@ -1511,13 +1495,15 @@ int copyfile(const struct vol *s_vol,
         return AFPERR_EXIST;
     }
 
+#if 0
     if (AD_RSRC_OPEN(adp))
         err = copy_fork(ADEID_RFORK, &add, adp);
-    
+#endif
+
     if (err == 0)
         err = copy_fork(ADEID_DFORK, &add, adp);
 
-    if ((err == 0) && (ad_meta_fileno(adp) != -1))
+    if (err == 0)
         err = d_vol->vfs->vfs_copyfile(d_vol, sfd, src, dst);
 
     if (err < 0)
@@ -1616,7 +1602,7 @@ int deletefile(const struct vol *vol, int dirfd, char *file, int checkAttrib)
         */
         if ( ad_metadataat(dirfd, file, ADFLAGS_CHECK_OF, &ad) == 0 ) {
             if ((err = check_attrib(&ad))) {
-                ad_close(&ad, ADFLAGS_HF);
+                ad_close(&ad, ADFLAGS_HF | ADFLAGS_CHECK_OF);
                return err;
             }
             meta = 1;
@@ -1673,7 +1659,7 @@ int deletefile(const struct vol *vol, int dirfd, char *file, int checkAttrib)
 
 end:
     if (meta)
-        ad_close(&ad, ADFLAGS_HF);
+        ad_close(&ad, ADFLAGS_HF | ADFLAGS_CHECK_OF);
 
     if (adp)
         ad_close( &ad, adflags );  /* ad_close removes locks if any */