extern int afprun(int root, char *cmd, int *outfd);
-static void showvol(const ucs2_t *name)
-{
- struct vol *volume = getvolumes();
-
- for ( ; volume; volume = volume->v_next ) {
- if (volume->v_hide && !strcasecmp_w( volume->v_name, name ) ) {
- volume->v_hide = 0;
- return;
- }
- }
-}
-
-static void closevol(struct vol *vol)
-{
- if (!vol)
- return;
-
- vol->v_flags &= ~AFPVOL_OPEN;
-
- of_closevol(vol);
-
- dir_free( vol->v_root );
- vol->v_root = NULL;
- if (vol->v_cdb != NULL) {
- cnid_close(vol->v_cdb);
- vol->v_cdb = NULL;
- }
-
- if (vol->v_postexec) {
- afprun(0, vol->v_postexec, NULL);
- }
- if (vol->v_root_postexec) {
- afprun(1, vol->v_root_postexec, NULL);
- }
-
- if (vol->v_deleted) {
- showvol(vol->v_name);
- volume_free(vol);
- volume_unlink(vol);
- free(vol);
- }
-}
-
/*!
* Read band-size info from Info.plist XML file of an TM sparsebundle
*
spaceflag = AFPVOL_GVSMASK & vol->v_flags;
/* report up to 2GB if afp version is < 2.2 (4GB if not) */
- maxsize = (afp_version < 22) ? 0x7fffffffL : 0xffffffffL;
+ maxsize = (obj->afp_version < 22) ? 0x7fffffffL : 0xffffffffL;
#ifdef AFS
if ( spaceflag == AFPVOL_NONE || spaceflag == AFPVOL_AFSGVS ) {
* .Parent file here if it doesn't exist. */
/* Convert adouble:v2 to adouble:ea on the fly */
- (void)ad_convert(vol->v_path, st, vol);
+ (void)ad_convert(vol->v_path, st, vol, NULL);
ad_init(&ad, vol);
if (ad_open(&ad, vol->v_path, ADFLAGS_HF | ADFLAGS_DIR | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666) != 0 ) {
ashort |= VOLPBIT_ATTR_RO;
}
/* prior 2.1 only VOLPBIT_ATTR_RO is defined */
- if (afp_version > 20) {
+ if (obj->afp_version > 20) {
if (vol->v_cdb != NULL && (vol->v_cdb->flags & CNID_FLAG_PERSISTENT))
ashort |= VOLPBIT_ATTR_FILEID;
ashort |= VOLPBIT_ATTR_CATSEARCH;
- if (afp_version >= 30) {
+ if (obj->afp_version >= 30) {
ashort |= VOLPBIT_ATTR_UTF8;
if (vol->v_flags & AFPVOL_UNIX_PRIV)
ashort |= VOLPBIT_ATTR_UNIXPRIV;
ashort |= VOLPBIT_ATTR_TM;
if (vol->v_flags & AFPVOL_NONETIDS)
ashort |= VOLPBIT_ATTR_NONETIDS;
- if (afp_version >= 32) {
+ if (obj->afp_version >= 32) {
if (vol->v_vfs_ea)
ashort |= VOLPBIT_ATTR_EXT_ATTRS;
if (vol->v_flags & AFPVOL_ACLS)
int vcnt;
size_t len;
- load_volumes(obj, of_closevol);
+ load_volumes(obj, closevol);
data = rbuf + 5;
for ( vcnt = 0, volume = getvolumes(); volume; volume = volume->v_next ) {
continue; /* no r-x access */
}
}
- if (volume->v_hide) {
- continue; /* config file changed but the volume was mounted */
- }
- if (utf8_encoding()) {
+ if (utf8_encoding(obj)) {
len = ucs2_to_charset_allocate(CH_UTF8_MAC, &namebuf, volume->v_u8mname);
} else {
len = ucs2_to_charset_allocate(obj->options.maccharset, &namebuf, volume->v_macname);
flags |= CNID_FLAG_NODEV;
}
- if (volume->v_cnidscheme == NULL) {
- volume->v_cnidscheme = strdup(DEFAULT_CNID_SCHEME);
- LOG(log_info, logtype_afpd, "Volume %s use CNID scheme %s.",
- volume->v_path, volume->v_cnidscheme);
- }
-
- LOG(log_info, logtype_afpd, "CNID server: %s:%s",
- volume->v_cnidserver ? volume->v_cnidserver : obj->options.Cnid_srv,
- volume->v_cnidport ? volume->v_cnidport : obj->options.Cnid_port);
+ LOG(log_debug, logtype_afpd, "CNID server: %s:%s", volume->v_cnidserver, volume->v_cnidport);
volume->v_cdb = cnid_open(volume->v_path,
volume->v_umask,
volume->v_cnidscheme,
flags,
- volume->v_cnidserver ? volume->v_cnidserver : obj->options.Cnid_srv,
- volume->v_cnidport ? volume->v_cnidport : obj->options.Cnid_port);
+ volume->v_cnidserver,
+ volume->v_cnidport);
if ( ! volume->v_cdb && ! (flags & CNID_FLAG_MEMORY)) {
/* The first attempt failed and it wasn't yet an attempt to open in-memory */
if ((volname_tmp = strchr(volname,'+')) != NULL)
volname = volname_tmp+1;
- if (utf8_encoding()) {
+ if (utf8_encoding(obj)) {
namelen = convert_string(CH_UTF8_MAC, CH_UCS2, ibuf, len, volname, sizeof(obj->oldtmp));
} else {
namelen = convert_string(obj->options.maccharset, CH_UCS2, ibuf, len, volname, sizeof(obj->oldtmp));
if ((len + 1) & 1) /* pad to an even boundary */
ibuf++;
- load_volumes(obj, of_closevol);
+ load_volumes(obj, closevol);
for ( volume = getvolumes(); volume; volume = volume->v_next ) {
if ( strcasecmp_w( (ucs2_t*) volname, volume->v_name ) == 0 ) {
/* initialize volume variables
* FIXME file size
*/
- if (utf8_encoding()) {
+ if (utf8_encoding(obj)) {
volume->max_filename = UTF8FILELEN_EARLY;
}
else {
volume->v_flags |= AFPVOL_OPEN;
volume->v_cdb = NULL;
- if (utf8_encoding()) {
+ if (utf8_encoding(obj)) {
len = convert_string_allocate(CH_UCS2, CH_UTF8_MAC, volume->v_u8mname, namelen, &vol_mname);
} else {
len = convert_string_allocate(CH_UCS2, obj->options.maccharset, volume->v_macname, namelen, &vol_mname);
goto openvol_err;
}
}
+
+ const char *msg;
+ if ((msg = iniparser_getstring(obj->iniconfig, volume->v_configname, "login message", NULL)) != NULL)
+ setmessage(msg);
+
return( AFP_OK );
}
return ret;
}
+void closevol(const AFPObj *obj, struct vol *vol)
+{
+ if (!vol)
+ return;
+
+ vol->v_flags &= ~AFPVOL_OPEN;
+
+ of_closevol(obj, vol);
+
+ dir_free( vol->v_root );
+ vol->v_root = NULL;
+ if (vol->v_cdb != NULL) {
+ cnid_close(vol->v_cdb);
+ vol->v_cdb = NULL;
+ }
+
+ if (vol->v_postexec) {
+ afprun(0, vol->v_postexec, NULL);
+ }
+ if (vol->v_root_postexec) {
+ afprun(1, vol->v_root_postexec, NULL);
+ }
+}
+
/* ------------------------- */
-void close_all_vol(void)
+void close_all_vol(const AFPObj *obj)
{
struct vol *ovol;
curdir = NULL;
for ( ovol = getvolumes(); ovol; ovol = ovol->v_next ) {
if ( (ovol->v_flags & AFPVOL_OPEN) ) {
ovol->v_flags &= ~AFPVOL_OPEN;
- closevol(ovol);
+ closevol(obj, ovol);
}
}
}
/* ------------------------- */
-int afp_closevol(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen)
+int afp_closevol(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen)
{
struct vol *vol;
uint16_t vid;
}
(void)chdir("/");
- closevol(vol);
+ curdir = NULL;
+ closevol(obj, vol);
return( AFP_OK );
}
struct timeval tv;
struct stat st;
- if (!(afp_version > 21 && obj->options.flags & OPTION_SERVERNOTIF))
+ if (!(obj->afp_version > 21 && obj->options.flags & OPTION_SERVERNOTIF))
return 0;
if ( gettimeofday( &tv, NULL ) < 0 )
/* or finder doesn't update free space
* AFP 3.2 and above clients seem to be ok without so many notification
*/
- if (afp_version < 32 && obj->options.flags & OPTION_SERVERNOTIF) {
+ if (obj->afp_version < 32 && obj->options.flags & OPTION_SERVERNOTIF) {
obj->attention(obj->dsi, AFPATTN_NOTIFY | AFPATTN_VOLCHANGED);
}
}