X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fvolume.c;h=d15e9a4640a869d6baa1012796f37b3d03264ebd;hb=df7560dfdb12b06090dc4b2c6e88d0858930b591;hp=50bafbe55b555e5aa0d12d89721a714b7d344879;hpb=ccd3cbc0f8ec5f86b70e0e09bd96858489279276;p=netatalk.git diff --git a/etc/afpd/volume.c b/etc/afpd/volume.c index 50bafbe5..d15e9a46 100644 --- a/etc/afpd/volume.c +++ b/etc/afpd/volume.c @@ -14,23 +14,7 @@ #include #include #include -#ifdef HAVE_STRINGS_H -#include -#endif -/* STDC check */ -#if STDC_HEADERS #include -#else /* STDC_HEADERS */ -#ifndef HAVE_STRCHR -#define strchr index -#define strrchr index -#endif /* HAVE_STRCHR */ -char *strchr (), *strrchr (); -#ifndef HAVE_MEMCPY -#define memcpy(d,s,n) bcopy ((s), (d), (n)) -#define memmove(d,s,n) bcopy ((s), (d), (n)) -#endif /* ! HAVE_MEMCPY */ -#endif /* STDC_HEADERS */ #include #include #include @@ -38,7 +22,6 @@ char *strchr (), *strrchr (); #include #include -#include #include #include #include @@ -47,6 +30,7 @@ char *strchr (), *strrchr (); #include #include #include +#include #include #include #include @@ -81,7 +65,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; @@ -107,15 +91,7 @@ static void free_extmap(void); #define VOLOPT_MACCHARSET 16 #define VOLOPT_CNIDSCHEME 17 #define VOLOPT_ADOUBLE 18 /* adouble version */ - -#ifdef FORCE_UIDGID -#warning UIDGID -#include "uid.h" - -#define VOLOPT_FORCEUID 19 /* force uid for username x */ -#define VOLOPT_FORCEGID 20 /* force gid for group x */ -#endif /* FORCE_UIDGID */ - +/* Usable slot: 19/20 */ #define VOLOPT_UMASK 21 #define VOLOPT_ALLOWED_HOSTS 22 #define VOLOPT_DENIED_HOSTS 23 @@ -147,12 +123,7 @@ typedef struct _special_folder { static const _special_folder special_folders[] = { {"Network Trash Folder", 1, 0777, 1}, - {"Temporary Items", 1, 0777, 1}, {".AppleDesktop", 1, 0777, 0}, -#if 0 - {"TheFindByContentFolder", 0, 0, 1}, - {"TheVolumeSettingsFolder", 0, 0, 1}, -#endif {NULL, 0, 0, 0}}; /* Forward declarations */ @@ -266,25 +237,12 @@ static char *volxlate(AFPObj *obj, } else if (is_var(p, "$c")) { if (afpmaster && xlatevolname) return NULL; -#ifndef NO_DDP - if (obj->proto == AFPPROTO_ASP) { - ASP asp = obj->handle; - - len = sprintf(dest, "%u.%u", ntohs(asp->asp_sat.sat_addr.s_net), - asp->asp_sat.sat_addr.s_node); - dest += len; - destlen -= len; - - } -#endif - if (obj->proto == AFPPROTO_DSI) { - DSI *dsi = obj->handle; - len = sprintf(dest, "%s:%u", - getip_string((struct sockaddr *)&dsi->client), - getip_port((struct sockaddr *)&dsi->client)); - dest += len; - destlen -= len; - } + DSI *dsi = obj->dsi; + len = sprintf(dest, "%s:%u", + getip_string((struct sockaddr *)&dsi->client), + getip_port((struct sockaddr *)&dsi->client)); + dest += len; + destlen -= len; } else if (is_var(p, "$d")) { if (afpmaster && xlatevolname) return NULL; @@ -306,19 +264,8 @@ static char *volxlate(AFPObj *obj, } else if (is_var(p, "$i")) { if (afpmaster && xlatevolname) return NULL; -#ifndef NO_DDP - if (obj->proto == AFPPROTO_ASP) { - ASP asp = obj->handle; - len = sprintf(dest, "%u", ntohs(asp->asp_sat.sat_addr.s_net)); - dest += len; - destlen -= len; - - } -#endif - if (obj->proto == AFPPROTO_DSI) { - DSI *dsi = obj->handle; - q = getip_string((struct sockaddr *)&dsi->client); - } + DSI *dsi = obj->dsi; + q = getip_string((struct sockaddr *)&dsi->client); } else if (is_var(p, "$s")) { if (obj->Obj) q = obj->Obj; @@ -447,16 +394,10 @@ static void volset(struct vol_option *options, struct vol_option *save, else if (strcasecmp(val + 1, "xlateupper") == 0) options[VOLOPT_CASEFOLD].i_value = AFPVOL_ULOWERMUPPER; } else if (optionok(tmp, "adouble:", val)) { - if (strcasecmp(val + 1, "v1") == 0) - options[VOLOPT_ADOUBLE].i_value = AD_VERSION1; -#if AD_VERSION == AD_VERSION2 - else if (strcasecmp(val + 1, "v2") == 0) + if (strcasecmp(val + 1, "v2") == 0) options[VOLOPT_ADOUBLE].i_value = AD_VERSION2; - else if (strcasecmp(val + 1, "osx") == 0) - options[VOLOPT_ADOUBLE].i_value = AD_VERSION2_OSX; - else if (strcasecmp(val + 1, "sfm") == 0) - options[VOLOPT_ADOUBLE].i_value = AD_VERSION1_SFM; -#endif + else if (strcasecmp(val + 1, "ea") == 0) + options[VOLOPT_ADOUBLE].i_value = AD_VERSION_EA; } else if (optionok(tmp, "options:", val)) { char *p; @@ -464,15 +405,7 @@ static void volset(struct vol_option *options, struct vol_option *save, return; while (p) { - if (strcasecmp(p, "prodos") == 0) - options[VOLOPT_FLAGS].i_value |= AFPVOL_A2VOL; - else if (strcasecmp(p, "mswindows") == 0) { - options[VOLOPT_FLAGS].i_value |= AFPVOL_MSWINDOWS | AFPVOL_USEDOTS; - } else if (strcasecmp(p, "crlf") == 0) - options[VOLOPT_FLAGS].i_value |= AFPVOL_CRLF; - else if (strcasecmp(p, "noadouble") == 0) - options[VOLOPT_FLAGS].i_value |= AFPVOL_NOADOUBLE; - else if (strcasecmp(p, "ro") == 0) + if (strcasecmp(p, "ro") == 0) options[VOLOPT_FLAGS].i_value |= AFPVOL_RO; else if (strcasecmp(p, "nohex") == 0) options[VOLOPT_FLAGS].i_value |= AFPVOL_NOHEX; @@ -480,15 +413,6 @@ static void volset(struct vol_option *options, struct vol_option *save, options[VOLOPT_FLAGS].i_value |= AFPVOL_USEDOTS; else if (strcasecmp(p, "invisibledots") == 0) options[VOLOPT_FLAGS].i_value |= AFPVOL_USEDOTS | AFPVOL_INV_DOTS; - else if (strcasecmp(p, "limitsize") == 0) - options[VOLOPT_FLAGS].i_value |= AFPVOL_LIMITSIZE; - /* support for either "dropbox" or "dropkludge" */ - else if (strcasecmp(p, "dropbox") == 0) - options[VOLOPT_FLAGS].i_value |= AFPVOL_DROPBOX; - else if (strcasecmp(p, "dropkludge") == 0) - options[VOLOPT_FLAGS].i_value |= AFPVOL_DROPBOX; - else if (strcasecmp(p, "nofileid") == 0) - options[VOLOPT_FLAGS].i_value |= AFPVOL_NOFILEID; else if (strcasecmp(p, "nostat") == 0) options[VOLOPT_FLAGS].i_value |= AFPVOL_NOSTAT; else if (strcasecmp(p, "preexec_close") == 0) @@ -503,8 +427,6 @@ static void volset(struct vol_option *options, struct vol_option *save, options[VOLOPT_FLAGS].i_value |= AFPVOL_CASEINSEN; else if (strcasecmp(p, "illegalseq") == 0) options[VOLOPT_FLAGS].i_value |= AFPVOL_EILSEQ; - else if (strcasecmp(p, "nocnidcache") == 0) - options[VOLOPT_FLAGS].i_value &= ~AFPVOL_CACHE; else if (strcasecmp(p, "tm") == 0) options[VOLOPT_FLAGS].i_value |= AFPVOL_TM; else if (strcasecmp(p, "searchdb") == 0) @@ -513,6 +435,8 @@ static void volset(struct vol_option *options, struct vol_option *save, options[VOLOPT_FLAGS].i_value |= AFPVOL_NONETIDS; else if (strcasecmp(p, "noacls") == 0) options[VOLOPT_FLAGS].i_value &= ~AFPVOL_ACLS; + else if (strcasecmp(p, "nov2toeaconv") == 0) + options[VOLOPT_FLAGS].i_value |= AFPVOL_NOV2TOEACONV; p = strtok(NULL, ","); } @@ -541,16 +465,6 @@ static void volset(struct vol_option *options, struct vol_option *save, options[VOLOPT_DFLTPERM].i_value = (int)strtol(val+1, NULL, 8); } else if (optionok(tmp, "password:", val)) { setoption(options, save, VOLOPT_PASSWORD, val); - -#ifdef FORCE_UIDGID - - /* this code allows forced uid/gid per volume settings */ - } else if (optionok(tmp, "forceuid:", val)) { - setoption(options, save, VOLOPT_FORCEUID, val); - } else if (optionok(tmp, "forcegid:", val)) { - setoption(options, save, VOLOPT_FORCEGID, val); - -#endif /* FORCE_UIDGID */ } else if (optionok(tmp, "root_preexec:", val)) { setoption(options, save, VOLOPT_ROOTPREEXEC, val); @@ -612,7 +526,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); @@ -770,14 +684,10 @@ static int creatvol(AFPObj *obj, struct passwd *pwd, volume->v_ad_options = 0; if ((volume->v_flags & AFPVOL_NODEV)) volume->v_ad_options |= ADVOL_NODEV; - if ((volume->v_flags & AFPVOL_CACHE)) - volume->v_ad_options |= ADVOL_CACHE; if ((volume->v_flags & AFPVOL_UNIX_PRIV)) volume->v_ad_options |= ADVOL_UNIXPRIV; if ((volume->v_flags & AFPVOL_INV_DOTS)) volume->v_ad_options |= ADVOL_INVDOTS; - if ((volume->v_flags & AFPVOL_NOADOUBLE)) - volume->v_ad_options |= ADVOL_NOADOUBLE; if (options[VOLOPT_PASSWORD].c_value) volume->v_password = strdup(options[VOLOPT_PASSWORD].c_value); @@ -847,19 +757,6 @@ static int creatvol(AFPObj *obj, struct passwd *pwd, if ((volume->v_flags & AFPVOL_EILSEQ)) volume->v_utom_flags |= CONV__EILSEQ; -#ifdef FORCE_UIDGID - if (options[VOLOPT_FORCEUID].c_value) { - volume->v_forceuid = strdup(options[VOLOPT_FORCEUID].c_value); - } else { - volume->v_forceuid = NULL; /* set as null so as to return 0 later on */ - } - - if (options[VOLOPT_FORCEGID].c_value) { - volume->v_forcegid = strdup(options[VOLOPT_FORCEGID].c_value); - } else { - volume->v_forcegid = NULL; /* set as null so as to return 0 later on */ - } -#endif if (!user) { if (options[VOLOPT_PREEXEC].c_value) volume->v_preexec = volxlate(obj, NULL, MAXPATHLEN, options[VOLOPT_PREEXEC].c_value, pwd, path, name); @@ -983,7 +880,7 @@ static int hostaccessvol(int type, const char *volname, const char *args, const { int mask_int; char buf[MAXPATHLEN + 1], *p, *b; - DSI *dsi = obj->handle; + DSI *dsi = obj->dsi; struct sockaddr_storage client; if (!args) @@ -1236,7 +1133,6 @@ static int readvolfile(AFPObj *obj, struct afp_volume_name *p1, char *p2, int us memset(default_options, 0, sizeof(default_options)); /* Enable some default options for all volumes */ - default_options[VOLOPT_FLAGS].i_value |= AFPVOL_CACHE; #ifdef HAVE_ACLS default_options[VOLOPT_FLAGS].i_value |= AFPVOL_ACLS; #endif @@ -1383,10 +1279,6 @@ static void volume_free(struct vol *vol) free(vol->v_cnidscheme); free(vol->v_dbpath); free(vol->v_gvs); -#ifdef FORCE_UIDGID - free(vol->v_forceuid); - free(vol->v_forcegid); -#endif /* FORCE_UIDGID */ if (vol->v_uuid) free(vol->v_uuid); } @@ -1595,11 +1487,11 @@ EC_CLEANUP: } 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; @@ -1607,9 +1499,7 @@ static int getvolspace(struct vol *vol, spaceflag = AFPVOL_GVSMASK & vol->v_flags; /* report up to 2GB if afp version is < 2.2 (4GB if not) */ - maxsize = (vol->v_flags & AFPVOL_A2VOL) ? 0x01fffe00 : - (((afp_version < 22) || (vol->v_flags & AFPVOL_LIMITSIZE)) - ? 0x7fffffffL : 0xffffffffL); + maxsize = (afp_version < 22) ? 0x7fffffffL : 0xffffffffL; #ifdef AFS if ( spaceflag == AFPVOL_NONE || spaceflag == AFPVOL_AFSGVS ) { @@ -1674,7 +1564,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; @@ -1693,13 +1583,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; @@ -1710,8 +1600,11 @@ static int getvolparams( u_int16_t bitmap, struct vol *vol, struct stat *st, cha * For MacOS8.x support we need to create the * .Parent file here if it doesn't exist. */ - ad_init(&ad, vol->v_adouble, vol->v_ad_options); - if ( ad_open_metadata( vol->v_path, ADFLAGS_DIR, O_CREAT, &ad) < 0 ) { + /* Convert adouble:v2 to adouble:ea on the fly */ + (void)ad_convert(vol->v_path, st, vol); + + ad_init(&ad, vol); + if (ad_open(&ad, vol->v_path, ADFLAGS_HF | ADFLAGS_DIR | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666) != 0 ) { isad = 0; vol->v_ctime = AD_DATE_FROM_UNIX(st->st_mtime); @@ -1768,10 +1661,8 @@ static int getvolparams( u_int16_t bitmap, struct vol *vol, struct stat *st, cha } /* prior 2.1 only VOLPBIT_ATTR_RO is defined */ if (afp_version > 20) { - if (0 == (vol->v_flags & AFPVOL_NOFILEID) && vol->v_cdb != NULL && - (vol->v_cdb->flags & CNID_FLAG_PERSISTENT)) { + if (vol->v_cdb != NULL && (vol->v_cdb->flags & CNID_FLAG_PERSISTENT)) ashort |= VOLPBIT_ATTR_FILEID; - } ashort |= VOLPBIT_ATTR_CATSEARCH; if (afp_version >= 30) { @@ -1843,28 +1734,20 @@ static int getvolparams( u_int16_t bitmap, struct vol *vol, struct stat *st, cha #ifndef NO_LARGE_VOL_SUPPORT case VOLPBIT_XBFREE : xbfree = hton64( xbfree ); -#if defined(__GNUC__) && defined(HAVE_GCC_MEMCPY_BUG) - bcopy(&xbfree, data, sizeof(xbfree)); -#else /* __GNUC__ && HAVE_GCC_MEMCPY_BUG */ memcpy(data, &xbfree, sizeof( xbfree )); -#endif /* __GNUC__ && HAVE_GCC_MEMCPY_BUG */ data += sizeof( xbfree ); break; case VOLPBIT_XBTOTAL : xbtotal = hton64( xbtotal ); -#if defined(__GNUC__) && defined(HAVE_GCC_MEMCPY_BUG) - bcopy(&xbtotal, data, sizeof(xbtotal)); -#else /* __GNUC__ && HAVE_GCC_MEMCPY_BUG */ memcpy(data, &xbtotal, sizeof( xbtotal )); -#endif /* __GNUC__ && HAVE_GCC_MEMCPY_BUG */ data += sizeof( xbfree ); break; #endif /* ! NO_LARGE_VOL_SUPPORT */ case VOLPBIT_NAME : nameoff = data; - data += sizeof( u_int16_t ); + data += sizeof( uint16_t ); break; case VOLPBIT_BSIZE: /* block size */ @@ -1896,14 +1779,14 @@ static int getvolparams( u_int16_t bitmap, struct vol *vol, struct stat *st, cha data += aint; } if ( isad ) { - ad_close_metadata( &ad); + ad_close(&ad, ADFLAGS_HF); } *buflen = data - buf; return( AFP_OK ); } /* ------------------------- */ -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; @@ -2050,13 +1933,6 @@ int afp_getsrvrparms(AFPObj *obj, char *ibuf _U_, size_t ibuflen _U_, char *rbuf /* set password bit if there's a volume password */ *data = (volume->v_password) ? AFPSRVR_PASSWD : 0; - /* Apple 2 clients running ProDOS-8 expect one volume to have - bit 0 of this byte set. They will not recognize anything - on the server unless this is the case. I have not - completely worked this out, but it's related to booting - from the server. Support for that function is a ways - off.. */ - *data |= (volume->v_flags & AFPVOL_A2VOL) ? AFPSRVR_CONFIGINFO : 0; *data++ |= 0; /* UNIX PRIVS BIT ..., OSX doesn't seem to use it, so we don't either */ *data++ = len; memcpy(data, namebuf, len ); @@ -2073,8 +1949,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 ); } @@ -2176,7 +2052,6 @@ static int volume_openDB(struct vol *volume) "Check server messages for details!"); kill(getpid(), SIGUSR2); /* deactivate cnid caching/storing in AppleDouble files */ - volume->v_flags &= ~AFPVOL_CACHE; } #endif } @@ -2244,7 +2119,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; @@ -2299,9 +2174,6 @@ int afp_openvol(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, size_t if (( volume->v_flags & AFPVOL_OPEN ) ) { /* the volume is already open */ -#ifdef FORCE_UIDGID - set_uidgid ( volume ); -#endif return stat_vol(bitmap, volume, rbuf, rbuflen); } @@ -2312,10 +2184,6 @@ int afp_openvol(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, size_t } } -#ifdef FORCE_UIDGID - set_uidgid ( volume ); -#endif - if (volume->v_preexec) { if ((ret = afprun(0, volume->v_preexec, NULL)) && volume->v_preexec_close) { LOG(log_error, logtype_afpd, "afp_openvol(%s): preexec : %d", volume->v_path, ret ); @@ -2530,7 +2398,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; @@ -2546,7 +2414,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; @@ -2559,10 +2427,6 @@ struct vol *getvolbyvid(const u_int16_t vid ) return( NULL ); } -#ifdef FORCE_UIDGID - set_uidgid ( vol ); -#endif /* FORCE_UIDGID */ - current_vol = vol; return( vol ); @@ -2630,7 +2494,7 @@ int pollvoltime(AFPObj *obj) if ( (vol->v_flags & AFPVOL_OPEN) && vol->v_mtime + 30 < tv.tv_sec) { if ( !stat( vol->v_path, &st ) && vol->v_mtime != st.st_mtime ) { vol->v_mtime = st.st_mtime; - if (!obj->attention(obj->handle, AFPATTN_NOTIFY | AFPATTN_VOLCHANGED)) + if (!obj->attention(obj->dsi, AFPATTN_NOTIFY | AFPATTN_VOLCHANGED)) return -1; return 1; } @@ -2661,7 +2525,7 @@ void setvoltime(AFPObj *obj, struct vol *vol) * AFP 3.2 and above clients seem to be ok without so many notification */ if (afp_version < 32 && obj->options.server_notif) { - obj->attention(obj->handle, AFPATTN_NOTIFY | AFPATTN_VOLCHANGED); + obj->attention(obj->dsi, AFPATTN_NOTIFY | AFPATTN_VOLCHANGED); } } } @@ -2670,7 +2534,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 )); @@ -2691,8 +2555,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; @@ -2714,9 +2578,8 @@ int afp_setvolparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf if (bitmap != (1 << VOLPBIT_BDATE)) return AFPERR_BITMAP; - ad_init(&ad, vol->v_adouble, vol->v_ad_options); - if ( ad_open( vol->v_path, ADFLAGS_HF|ADFLAGS_DIR, O_RDWR, - 0666, &ad) < 0 ) { + ad_init(&ad, vol); + if ( ad_open(&ad, vol->v_path, ADFLAGS_HF | ADFLAGS_DIR | ADFLAGS_RDWR) < 0 ) { if (errno == EROFS) return AFPERR_VLOCK; @@ -2730,33 +2593,6 @@ int afp_setvolparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf return( AFP_OK ); } -/* ------------------------- */ -int wincheck(const struct vol *vol, const char *path) -{ - int len; - - if (!(vol->v_flags & AFPVOL_MSWINDOWS)) - return 1; - - /* empty paths are not allowed */ - if ((len = strlen(path)) == 0) - return 0; - - /* leading or trailing whitespaces are not allowed, carriage returns - * and probably other whitespace is okay, tabs are not allowed - */ - if ((path[0] == ' ') || (path[len-1] == ' ')) - return 0; - - /* certain characters are not allowed */ - if (strpbrk(path, MSWINDOWS_BADCHARS)) - return 0; - - /* everything else is okay */ - return 1; -} - - /* * precreate a folder * this is only intended for folders in the volume root @@ -2766,7 +2602,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; @@ -2810,9 +2646,9 @@ static int create_special_folder (const struct vol *vol, const struct _special_f if ( !ret && folder->hide) { /* Hide it */ - ad_init(&ad, vol->v_adouble, vol->v_ad_options); - if (ad_open_metadata( p, ADFLAGS_DIR, O_CREAT, &ad) < 0) { - free (p); + ad_init(&ad, vol); + if (ad_open(&ad, p, ADFLAGS_HF | ADFLAGS_DIR | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666) != 0) { + free(p); free(q); return (-1); } @@ -2830,8 +2666,8 @@ static int create_special_folder (const struct vol *vol, const struct _special_f memcpy(ad_entry(&ad, ADEID_FINDERI) + FINDERINFO_FRFLAGOFF,&attr, sizeof(attr)); } - ad_flush( &ad ); - ad_close_metadata( &ad); + ad_flush(&ad); + ad_close(&ad, ADFLAGS_HF); } free(p); free(q);