/*
- * $Id: volume.c,v 1.37 2002-10-10 20:27:36 jmarcus Exp $
+ * $Id: volume.c,v 1.46 2003-01-12 14:40:04 didg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
/* handle all the options. tmp can't be NULL. */
static void volset(struct vol_option *options, char *volname, int vlen,
- const char *nlspath, const char *tmp)
+ const char *nlspath, const char *tmp, AFPObj *obj,
+ struct passwd *pwd)
{
char *val;
options[VOLOPT_FLAGS].i_value |= AFPVOL_DROPBOX;
else if (strcasecmp(p, "nofileid") == 0)
options[VOLOPT_FLAGS].i_value |= AFPVOL_NOFILEID;
+ else if (strcasecmp(p, "utf8") == 0)
+ options[VOLOPT_FLAGS].i_value |= AFPVOL_UTF8;
p = strtok(NULL, ",");
}
#ifdef CNID_DB
} else if (optionok(tmp, "dbpath:", val)) {
+ char t[MAXPATHLEN + 1];
if (options[VOLOPT_DBPATH].c_value)
free(options[VOLOPT_DBPATH].c_value);
- options[VOLOPT_DBPATH].c_value = strdup(val + 1);
+ volxlate(obj, t, MAXPATHLEN, val, pwd, NULL);
+ options[VOLOPT_DBPATH].c_value = strdup(t + 1);
#endif /* CNID_DB */
} else if (optionok(tmp, "umask:", val)) {
options[VOLOPT_UMASK].i_value = (int)strtol(val, (char **)NULL, 8);
int c;
p = buf;
- while ((( c = getc( fp )) != EOF ) && ( size > 0 )) {
+ while ((EOF != ( c = getc( fp )) ) && ( size > 0 )) {
if ( c == '\n' || c == '\r' ) {
*p++ = '\n';
break;
LOG(log_error, logtype_afpd, "setextmap: calloc: %s", strerror(errno) );
return;
}
-
}
ext++;
for ( em = extmap, cnt = 0; em->em_ext; em++, cnt++) {
} else {
memcpy(em->em_creator, creator, sizeof( em->em_creator ));
}
-
- if ( !*ext ) {
- defextmap = em;
- }
}
/* -------------------------- */
{
struct extmap *em;
+ extmap_cnt = 0;
if ((em = extmap) == NULL) {
return;
}
- extmap_cnt = 0;
while (em->em_ext) {
em++;
extmap_cnt++;
}
if (extmap_cnt) {
qsort(extmap, extmap_cnt, sizeof(struct extmap), extmap_cmp);
+ defextmap = extmap;
}
}
strcat( path, p2 );
}
- if (( fp = fopen( path, "r" )) == NULL ) {
+ if (NULL == ( fp = fopen( path, "r" )) ) {
return( -1 );
}
path + VOLOPT_DEFAULT_LEN) < 0)
break;
volset(save_options, tmp, sizeof(tmp) - 1,
- obj->options.nlspath, path + VOLOPT_DEFAULT_LEN);
+ obj->options.nlspath, path + VOLOPT_DEFAULT_LEN,
+ obj, pwent);
}
}
break;
break;
volset(options, volname, sizeof(volname) - 1,
- obj->options.nlspath, tmp);
+ obj->options.nlspath, tmp, obj, pwent);
}
/* check allow/deny lists:
* it's passed in that way as it's possible to mount
* a read-write filesystem under a read-only one. */
if ((vol->v_flags & AFPVOL_RO) ||
- ((utime(vol->v_path, NULL) < 0) && (errno == EROFS)))
+ ((utime(vol->v_path, NULL) < 0) && (errno == EROFS))) {
ashort |= VOLPBIT_ATTR_RO;
-#ifdef WITH_CATSEARCH
- ashort |= VOLPBIT_ATTR_CATSEARCH;
-#endif
+ }
+ ashort |= VOLPBIT_ATTR_CATSEARCH;
+ if (afp_version >= 30) {
+ ashort |= VOLPBIT_ATTR_UTF8;
+ }
ashort = htons(ashort);
memcpy(data, &ashort, sizeof( ashort ));
data += sizeof( ashort );
ret = AFPERR_ACCESS;
goto openvol_err;
}
-
+ /* FIXME
+ */
+ if (afp_version >= 30) {
+ volume->max_filename = 255;
+ }
+ else {
+ volume->max_filename = MACFILELEN;
+ }
if (( volume->v_flags & AFPVOL_OPEN ) == 0 ) {
- if ((dir = dirnew(strlen(volume->v_name) + 1)) == NULL) {
+ /* FIXME unix name != mac name */
+ if ((dir = dirnew(volume->v_name, volume->v_name) ) == NULL) {
LOG(log_error, logtype_afpd, "afp_openvol: malloc: %s", strerror(errno) );
ret = AFPERR_MISC;
goto openvol_err;
}
dir->d_did = DIRDID_ROOT;
dir->d_color = DIRTREE_COLOR_BLACK; /* root node is black */
- strcpy( dir->d_name, volume->v_name );
volume->v_dir = volume->v_root = dir;
volume->v_flags |= AFPVOL_OPEN;
}
*rbuflen = 0;
ibuf += 2;
memcpy(&vid, ibuf, sizeof( vid ));
- if (( vol = getvolbyvid( vid )) == NULL ) {
+ if (NULL == ( vol = getvolbyvid( vid )) ) {
return( AFPERR_PARAM );
}
curdir = ovol->v_dir;
}
}
-
dirfree( vol->v_root );
vol->v_dir = NULL;
#ifdef CNID_DB
char *p;
struct extmap *em;
- if (( p = strrchr( path, '.' )) == NULL ) {
+ if (NULL == ( p = strrchr( path, '.' )) ) {
return( defextmap );
}
p++;
if ( (vol->v_flags & AFPVOL_OPEN) && vol->v_time + 30 < tv.tv_sec) {
if ( !stat( vol->v_path, &st ) && vol->v_time != st.st_mtime ) {
vol->v_time = st.st_mtime;
- obj->attention(obj->handle, AFPATTN_NOTIFY | AFPATTN_VOLCHANGED);
+ if (!obj->attention(obj->handle, AFPATTN_NOTIFY | AFPATTN_VOLCHANGED))
+ return -1;
return 1;
}
}
memcpy(&bitmap, ibuf, sizeof( bitmap ));
bitmap = ntohs( bitmap );
- if (( vol = getvolbyvid( vid )) == NULL ) {
+ if (NULL == ( vol = getvolbyvid( vid )) ) {
*rbuflen = 0;
return( AFPERR_PARAM );
}