/*
- * $Id: messages.c,v 1.22 2009-10-29 13:38:15 didg Exp $
+ * $Id: messages.c,v 1.23 2009-11-24 15:44:40 didg Exp $
*
* Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT.
message=fopen(filename, "r");
if (message==NULL) {
- LOG(log_info, logtype_afpd, "Unable to open file %s", filename);
+ /* try without the process id */
sprintf(filename, "%s/message", SERVERTEXT);
message=fopen(filename, "r");
}
memcpy(&type, ibuf + 2, sizeof(type));
memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
+ message = servermesg;
switch (ntohs(type)) {
case AFPMESG_LOGIN: /* login */
- message = obj->options.loginmesg;
+ /* at least TIGER loses server messages
+ * if it receives a server msg attention before
+ * it has asked the login msg...
+ * Workaround: concatenate the two if any, ugly.
+ */
+ if (*message && *obj->options.loginmesg) {
+ strlcat(message, " - ", MAXMESGSIZE);
+ }
+ strlcat(message, obj->options.loginmesg, MAXMESGSIZE);
break;
case AFPMESG_SERVER: /* server */
- message = servermesg;
break;
default:
return AFPERR_BITMAP;
*rbuflen += 1;
}
*rbuflen += outlen;
-
+ *message = 0;
return AFP_OK;
}
/*
- * $Id: volume.c,v 1.105 2009-11-24 11:40:11 didg Exp $
+ * $Id: volume.c,v 1.106 2009-11-24 15:44:40 didg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
volume->v_cdb = cnid_open (volume->v_dbpath, volume->v_umask, volume->v_cnidscheme, flags);
else
volume->v_cdb = cnid_open (volume->v_path, volume->v_umask, volume->v_cnidscheme, flags);
+
+ if (!volume->v_cdb) {
+ flags |= CNID_FLAG_MEMORY;
+ LOG(log_error, logtype_afpd, "Reopen volume %s using in memory temporary CNID DB.", volume->v_path);
+ volume->v_cdb = cnid_open (volume->v_path, volume->v_umask, "tdb", flags);
+#ifdef SERVERTEXT
+ /* kill ourself with SIGUSR2 aka msg pending */
+ if (volume->v_cdb) {
+ setmessage("Something wrong with the volume's DB ... FIXME with a better msg");
+ kill(getpid(), SIGUSR2);
+ /* XXX desactivate cachecnid ? */
+ }
+#endif
+ }
+
return (!volume->v_cdb)?-1:0;
}
/*
- * $Id: cnid.c,v 1.9 2009-11-24 12:18:19 didg Exp $
+ * $Id: cnid.c,v 1.10 2009-11-24 15:44:56 didg Exp $
*
* Copyright (c) 2003 the Netatalk Team
* Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
return NULL;
}
- if ((mod->flags & CNID_FLAG_SETUID)) {
+ if ((mod->flags & CNID_FLAG_SETUID) && !(flags & CNID_FLAG_MEMORY)) {
uid = geteuid();
gid = getegid();
if (seteuid(0)) {
db = mod->cnid_open(volpath, mask, flags);
- if ((mod->flags & CNID_FLAG_SETUID)) {
+ if ((mod->flags & CNID_FLAG_SETUID) && !(flags & CNID_FLAG_MEMORY)) {
seteuid(0);
if ( setegid(gid) < 0 || seteuid(uid) < 0) {
LOG(log_error, logtype_afpd, "can't seteuid back %s", strerror(errno));
/*
- * $Id: cnid_tdb_open.c,v 1.6 2009-11-24 12:18:20 didg Exp $
+ * $Id: cnid_tdb_open.c,v 1.7 2009-11-24 15:44:56 didg Exp $
*
* Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT.
}
/* ---------------------------- */
-struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask, u_int32_t flags _U_)
+struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask, u_int32_t flags)
{
struct stat st;
struct _cnid_db *cdb;
size_t len;
char path[MAXPATHLEN + 1];
TDB_DATA key, data;
-
+ int hash_size = 131071;
+ int tdb_flags = 0;
+
if (!dir) {
+ /* note: dir and path are not used for in memory db */
return NULL;
}
LOG(log_error, logtype_default, "tdb_open: Unable to allocate memory for tdb");
return NULL;
}
+
strcpy(path, dir);
if (path[len - 1] != '/') {
strcat(path, "/");
}
strcpy(path + len, DBHOME);
- if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~mask) < 0)) {
- LOG(log_error, logtype_default, "tdb_open: DBHOME mkdir failed for %s", path);
- goto fail;
+ if (!(flags & CNID_FLAG_MEMORY)) {
+ if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~mask) < 0)) {
+ LOG(log_error, logtype_default, "tdb_open: DBHOME mkdir failed for %s", path);
+ goto fail;
+ }
+ }
+ else {
+ hash_size = 0;
+ tdb_flags = TDB_INTERNAL;
}
strcat(path, "/");
path[len + DBHOMELEN] = '\0';
strcat(path, DBCNID);
- db->tdb_cnid = tdb_open(path, 131071, 0 , O_RDWR | O_CREAT, 0666 & ~mask);
+
+ db->tdb_cnid = tdb_open(path, hash_size, tdb_flags , O_RDWR | O_CREAT, 0666 & ~mask);
if (!db->tdb_cnid) {
LOG(log_error, logtype_default, "tdb_open: unable to open tdb", path);
goto fail;
free(data.dptr);
}
-
return cdb;
fail: