]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/volume.c
Merge master
[netatalk.git] / etc / afpd / volume.c
index 1b442093239c31fc8dc190a65625b591868d0fca..b6707b313699ea77646019f1ec44c068a8234ea2 100644 (file)
@@ -64,7 +64,7 @@ extern int afprun(int root, char *cmd, int *outfd);
 struct vol *current_vol;        /* last volume from getvolbyvid() */
 
 static struct vol *Volumes = NULL;
-static u_int16_t    lastvid = 0;
+static uint16_t    lastvid = 0;
 static char     *Trash = "\02\024Network Trash Folder";
 
 static struct extmap    *Extmap = NULL, *Defextmap = NULL;
@@ -446,6 +446,8 @@ static void volset(struct vol_option *options, struct vol_option *save,
                 options[VOLOPT_FLAGS].i_value |= AFPVOL_SEARCHDB;
             else if (strcasecmp(p, "nonetids") == 0)
                 options[VOLOPT_FLAGS].i_value |= AFPVOL_NONETIDS;
+            else if (strcasecmp(p, "noacls") == 0)
+                options[VOLOPT_FLAGS].i_value &= ~AFPVOL_ACLS;
             p = strtok(NULL, ",");
         }
 
@@ -535,7 +537,7 @@ static int creatvol(AFPObj *obj, struct passwd *pwd,
     char        tmpname[AFPVOL_U8MNAMELEN+1];
     ucs2_t      u8mtmpname[(AFPVOL_U8MNAMELEN+1)*2], mactmpname[(AFPVOL_MACNAMELEN+1)*2];
     char        suffix[6]; /* max is #FFFF */
-    u_int16_t   flags;
+    uint16_t   flags;
 
     LOG(log_debug, logtype_afpd, "createvol: Volume '%s'", name);
 
@@ -676,9 +678,10 @@ static int creatvol(AFPObj *obj, struct passwd *pwd,
     volume->v_vid = ++lastvid;
     volume->v_vid = htons(volume->v_vid);
 #ifdef HAVE_ACLS
-    if (check_vol_acl_support(volume))
-        volume->v_flags |= AFPVOL_ACLS
-;
+    if (!check_vol_acl_support(volume)) {
+        LOG(log_debug, logtype_afpd, "creatvol(\"%s\"): disabling ACL support", volume->v_path);
+        options[VOLOPT_FLAGS].i_value &= ~AFPVOL_ACLS;
+    }
 #endif
 
     /* handle options */
@@ -1145,6 +1148,9 @@ static int readvolfile(AFPObj *obj, struct afp_volume_name *p1, char *p2, int us
 
     /* Enable some default options for all volumes */
     save_options[VOLOPT_FLAGS].i_value |= AFPVOL_CACHE;
+#ifdef HAVE_ACLS
+    save_options[VOLOPT_FLAGS].i_value |= AFPVOL_ACLS;
+#endif
     save_options[VOLOPT_EA_VFS].i_value = AFPVOL_EA_AUTO;
     LOG(log_maxdebug, logtype_afpd, "readvolfile: seeding default umask: %04o",
         obj->options.umask);
@@ -1404,11 +1410,11 @@ static int getused(struct vol *vol)
 }
 
 static int getvolspace(struct vol *vol,
-                       u_int32_t *bfree, u_int32_t *btotal,
-                       VolSpace *xbfree, VolSpace *xbtotal, u_int32_t *bsize)
+                       uint32_t *bfree, uint32_t *btotal,
+                       VolSpace *xbfree, VolSpace *xbtotal, uint32_t *bsize)
 {
     int         spaceflag, rc;
-    u_int32_t   maxsize;
+    uint32_t   maxsize;
     VolSpace    used;
 #ifndef NO_QUOTA_SUPPORT
     VolSpace    qfree, qtotal;
@@ -1483,7 +1489,7 @@ void vol_fce_tm_event(void)
  * set volume creation date
  * avoid duplicate, well at least it tries
  */
-static void vol_setdate(u_int16_t id, struct adouble *adp, time_t date)
+static void vol_setdate(uint16_t id, struct adouble *adp, time_t date)
 {
     struct vol  *volume;
     struct vol  *vol = Volumes;
@@ -1502,13 +1508,13 @@ static void vol_setdate(u_int16_t id, struct adouble *adp, time_t date)
 }
 
 /* ----------------------- */
-static int getvolparams( u_int16_t bitmap, struct vol *vol, struct stat *st, char *buf, size_t *buflen)
+static int getvolparams( uint16_t bitmap, struct vol *vol, struct stat *st, char *buf, size_t *buflen)
 {
     struct adouble  ad;
     int         bit = 0, isad = 1;
-    u_int32_t       aint;
+    uint32_t       aint;
     u_short     ashort;
-    u_int32_t       bfree, btotal, bsize;
+    uint32_t       bfree, btotal, bsize;
     VolSpace            xbfree, xbtotal; /* extended bytes */
     char        *data, *nameoff = NULL;
     char                *slash;
@@ -1665,7 +1671,7 @@ static int getvolparams( u_int16_t bitmap, struct vol *vol, struct stat *st, cha
 
         case VOLPBIT_NAME :
             nameoff = data;
-            data += sizeof( u_int16_t );
+            data += sizeof( uint16_t );
             break;
 
         case VOLPBIT_BSIZE:  /* block size */
@@ -1704,7 +1710,7 @@ static int getvolparams( u_int16_t bitmap, struct vol *vol, struct stat *st, cha
 }
 
 /* ------------------------- */
-static int stat_vol(u_int16_t bitmap, struct vol *vol, char *rbuf, size_t *rbuflen)
+static int stat_vol(uint16_t bitmap, struct vol *vol, char *rbuf, size_t *rbuflen)
 {
     struct stat st;
     int     ret;
@@ -1874,8 +1880,8 @@ int afp_getsrvrparms(AFPObj *obj, char *ibuf _U_, size_t ibuflen _U_, char *rbuf
         return AFPERR_PARAM;
     }
     tv.tv_sec = AD_DATE_FROM_UNIX(tv.tv_sec);
-    memcpy(data, &tv.tv_sec, sizeof( u_int32_t));
-    data += sizeof( u_int32_t);
+    memcpy(data, &tv.tv_sec, sizeof( uint32_t));
+    data += sizeof( uint32_t);
     *data = vcnt;
     return( AFP_OK );
 }
@@ -2045,7 +2051,7 @@ int afp_openvol(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, size_t
     struct dir  *dir;
     int     len, ret;
     size_t  namelen;
-    u_int16_t   bitmap;
+    uint16_t   bitmap;
     char        path[ MAXPATHLEN + 1];
     char        *vol_uname;
     char        *vol_mname;
@@ -2210,14 +2216,13 @@ int afp_openvol(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, size_t
     }
 
     ret  = stat_vol(bitmap, volume, rbuf, rbuflen);
+
     if (ret == AFP_OK) {
+        handle_special_folders(volume);
+        savevolinfo(volume,
+                    volume->v_cnidserver ? volume->v_cnidserver : Cnid_srv,
+                    volume->v_cnidport   ? volume->v_cnidport   : Cnid_port);
 
-        if (!(volume->v_flags & AFPVOL_RO)) {
-            handle_special_folders( volume );
-            savevolinfo(volume,
-                        volume->v_cnidserver ? volume->v_cnidserver : Cnid_srv,
-                        volume->v_cnidport   ? volume->v_cnidport   : Cnid_port);
-        }
 
         /*
          * If you mount a volume twice, the second time the trash appears on
@@ -2325,7 +2330,7 @@ static void deletevol(struct vol *vol)
 int afp_closevol(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen)
 {
     struct vol  *vol;
-    u_int16_t   vid;
+    uint16_t   vid;
 
     *rbuflen = 0;
     ibuf += 2;
@@ -2341,7 +2346,7 @@ int afp_closevol(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U_
 }
 
 /* ------------------------- */
-struct vol *getvolbyvid(const u_int16_t vid )
+struct vol *getvolbyvid(const uint16_t vid )
 {
     struct vol  *vol;
 
@@ -2461,7 +2466,7 @@ void setvoltime(AFPObj *obj, struct vol *vol)
 int afp_getvolparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_,char *rbuf, size_t *rbuflen)
 {
     struct vol  *vol;
-    u_int16_t   vid, bitmap;
+    uint16_t   vid, bitmap;
 
     ibuf += 2;
     memcpy(&vid, ibuf, sizeof( vid ));
@@ -2482,8 +2487,8 @@ int afp_setvolparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf
 {
     struct adouble ad;
     struct vol  *vol;
-    u_int16_t   vid, bitmap;
-    u_int32_t   aint;
+    uint16_t   vid, bitmap;
+    uint32_t   aint;
 
     ibuf += 2;
     *rbuflen = 0;
@@ -2556,7 +2561,7 @@ static int create_special_folder (const struct vol *vol, const struct _special_f
 {
     char        *p,*q,*r;
     struct adouble  ad;
-    u_int16_t   attr;
+    uint16_t   attr;
     struct stat st;
     int     ret;
 
@@ -2631,13 +2636,25 @@ static int create_special_folder (const struct vol *vol, const struct _special_f
 static void handle_special_folders (const struct vol * vol)
 {
     const _special_folder *p = &special_folders[0];
+    uid_t process_uid;
 
-    if ((vol->v_flags & AFPVOL_RO))
-        return;
+    process_uid = geteuid();
+    if (process_uid) {
+        if (seteuid(0) == -1) {
+            process_uid = 0;
+        }
+    }
 
     for (; p->name != NULL; p++) {
         create_special_folder (vol, p);
     }
+
+    if (process_uid) {
+        if (seteuid(process_uid) == -1) {
+            LOG(log_error, logtype_logger, "can't seteuid back %s", strerror(errno));
+            exit(EXITERR_SYS);
+        }
+    }
 }
 
 const struct vol *getvolumes(void)