]> arthur.barton.de Git - netatalk.git/commitdiff
fallback to a in memory temporary cnid db if we can't open the real one, doesn't...
authordidg <didg>
Tue, 24 Nov 2009 15:44:40 +0000 (15:44 +0000)
committerdidg <didg>
Tue, 24 Nov 2009 15:44:40 +0000 (15:44 +0000)
etc/afpd/messages.c
etc/afpd/volume.c
libatalk/cnid/cnid.c
libatalk/cnid/tdb/cnid_tdb_open.c

index 164bb200ab1c69e9b10f9ab55d1023c43af679b2..2812886229b7d5e96688012bf55a117f62d81c8f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $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.
@@ -64,7 +64,7 @@ void readmessage(AFPObj *obj)
 
     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");
     }
@@ -129,12 +129,20 @@ int afp_getsrvrmesg(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, siz
     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;
@@ -182,6 +190,6 @@ int afp_getsrvrmesg(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, siz
        *rbuflen += 1;
     }
     *rbuflen += outlen;
-
+    *message = 0;
     return AFP_OK;
 }
index c802f8173d7083af335fa9e5667149c87bfdb413..feb3b09e82d30a2d2005ba2a66c6dd28ea48c504 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $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.
@@ -1845,6 +1845,21 @@ static int volume_openDB(struct vol *volume)
         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;
 }
 
index 5476e2c3fee66419362e6893001d90edbfa2b586..86b9594fbed6b59fbb9330ab18605b00034675c3 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $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>
@@ -112,7 +112,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla
         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)) {
@@ -130,7 +130,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla
 
     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));
index 3cf5f533c157df97730c4549511453e976462967..70a79653cd505bc2a9d320156d76660d300969bb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $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.
@@ -63,7 +63,7 @@ static struct _cnid_db *cnid_tdb_new(const char *volpath)
 }
 
 /* ---------------------------- */
-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;
@@ -71,8 +71,11 @@ struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask, u_int32_t flags _U_
     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;
     }
 
@@ -85,6 +88,7 @@ struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask, u_int32_t flags _U_
         LOG(log_error, logtype_default, "tdb_open: Unable to allocate memory for tdb");
         return NULL;
     }
+    
     strcpy(path, dir);
     if (path[len - 1] != '/') {
         strcat(path, "/");
@@ -92,9 +96,15 @@ struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask, u_int32_t flags _U_
     }
  
     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, "/");
  
@@ -102,7 +112,8 @@ struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask, u_int32_t flags _U_
 
     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;
@@ -133,7 +144,6 @@ struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask, u_int32_t flags _U_
         free(data.dptr);
     }
         
-
     return cdb;
 
 fail: