Handle errors while hashing better.
[doldaconnect.git] / daemon / client.c
index bf7a3af..50da10d 100644 (file)
@@ -76,7 +76,11 @@ static struct scanstate *scanjob = NULL;
 static struct scanqueue *scanqueue = NULL;
 static struct sharepoint *shares = NULL;
 static struct hashcache *hashcache = NULL;
-static pid_t hashjob = 0;
+/* Set initially to -1, but changed to 0 the first time run() is
+ * called. This is to avoid forking a hash job before daemonizing,
+ * since that would make the daemon unable to wait() for the hash
+ * job. */
+static pid_t hashjob = -1;
 struct sharecache *shareroot = NULL;
 unsigned long long sharesize = 0;
 GCBCHAIN(sharechangecb, unsigned long long);
@@ -198,9 +202,21 @@ wchar_t *unparsehash(struct hash *hash)
     addtobuf(buf, ':');
     bufcat(buf, whbuf, wcslen(whbuf));
     free(whbuf);
+    addtobuf(buf, 0);
     return(buf);
 }
 
+int hashcmp(struct hash *h1, struct hash *h2)
+{
+    if(wcscmp(h1->algo, h2->algo))
+       return(0);
+    if(h1->len != h2->len)
+       return(0);
+    if(memcmp(h1->buf, h2->buf, h1->len))
+       return(0);
+    return(1);
+}
+
 static struct hashcache *newhashcache(void)
 {
     struct hashcache *new;
@@ -523,13 +539,10 @@ static void checkhashes(void)
     char *path;
     
     node = shareroot->child;
-    while(1)
+    for(node = shareroot->child; node != NULL; node = nextscnode(node))
     {
-       if(node->child != NULL)
-       {
-           node = node->child;
+       if(node->f.b.type != FILE_REG)
            continue;
-       }
        if(!node->f.b.hastth)
        {
            if((hc = findhashcache(node->dev, node->inode)) != NULL)
@@ -543,19 +556,14 @@ static void checkhashes(void)
                {
                    flog(LOG_WARNING, "could not hash %s, unsharing it", path);
                    freecache(node);
+                   free(path);
+                   flog(LOG_INFO, "sharing %lli bytes", sharesize);
+                   continue;
                }
                free(path);
                return;
            }
        }
-       while(node->next == NULL)
-       {
-           if((node = node->parent) == shareroot)
-               break;
-       }
-       if(node == shareroot)
-           break;
-       node = node->next;
     }
 }
 
@@ -916,7 +924,7 @@ int doscan(int quantum)
            }
            type = FILE_REG;
        } else {
-           flog(LOG_WARNING, "unhandled file type: %i", sb.st_mode);
+           flog(LOG_WARNING, "unhandled file type: 0%o", sb.st_mode);
            free(wcs);
            continue;
        }
@@ -1039,6 +1047,11 @@ static int init(int hup)
 
 static int run(void)
 {
+    if(hashjob == -1)
+    {
+       hashjob = 0;
+       checkhashes();
+    }
     return(doscan(10));
 }