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;
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, ",");
}
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);
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 */
/* 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);
}
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;
* 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;
}
/* ----------------------- */
-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;
case VOLPBIT_NAME :
nameoff = data;
- data += sizeof( u_int16_t );
+ data += sizeof( uint16_t );
break;
case VOLPBIT_BSIZE: /* block size */
}
/* ------------------------- */
-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;
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 );
}
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;
}
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
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;
}
/* ------------------------- */
-struct vol *getvolbyvid(const u_int16_t vid )
+struct vol *getvolbyvid(const uint16_t vid )
{
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 ));
{
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;
{
char *p,*q,*r;
struct adouble ad;
- u_int16_t attr;
+ uint16_t attr;
struct stat st;
int ret;
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)