Fix more wrong sizeof() usages, part 1/x
[dragonfly.git] / libexec / dma / spool.c
index dbf0822..9c4d79e 100644 (file)
@@ -32,6 +32,9 @@
  * SUCH DAMAGE.
  */
 
+#include "dfcompat.h"
+
+#include <sys/file.h>
 #include <sys/stat.h>
 
 #include <ctype.h>
@@ -92,7 +95,7 @@ newspoolf(struct queue *queue)
         */
        if (fstat(fd, &st) != 0)
                goto fail;
-       if (asprintf(&queue->id, "%"PRIxMAX, st.st_ino) < 0)
+       if (asprintf(&queue->id, "%"PRIxMAX, (uintmax_t)st.st_ino) < 0)
                goto fail;
 
        queue->mailf = fdopen(fd, "r+");
@@ -120,9 +123,11 @@ writequeuef(struct qitem *it)
        int error;
        int queuefd;
 
-       queuefd = open_locked(it->queuefn, O_CREAT|O_EXCL|O_RDWR, 0600);
+       queuefd = open_locked(it->queuefn, O_CREAT|O_EXCL|O_RDWR, 0660);
        if (queuefd == -1)
                return (-1);
+       if (fchmod(queuefd, 0660) < 0)
+               return (-1);
        it->queuef = fdopen(queuefd, "w+");
        if (it->queuef == NULL)
                return (-1);
@@ -279,7 +284,7 @@ load_queue(struct queue *queue)
        char *queuefn;
        char *mailfn;
 
-       bzero(queue, sizeof(queue));
+       bzero(queue, sizeof(*queue));
        LIST_INIT(&queue->queue);
 
        spooldir = opendir(config.spooldir);
@@ -290,9 +295,7 @@ load_queue(struct queue *queue)
                queuefn = NULL;
                mailfn = NULL;
 
-               /* ignore temp files */
-               if (strncmp(de->d_name, "tmp_", 4) == 0 || de->d_type != DT_REG)
-                       continue;
+               /* ignore non-queue files */
                if (de->d_name[0] != 'Q')
                        continue;
                if (asprintf(&queuefn, "%s/Q%s", config.spooldir, de->d_name + 1) < 0)
@@ -300,6 +303,18 @@ load_queue(struct queue *queue)
                if (asprintf(&mailfn, "%s/M%s", config.spooldir, de->d_name + 1) < 0)
                        goto fail;
 
+               /*
+                * Some file systems don't provide a de->d_type, so we have to
+                * do an explicit stat on the queue file.
+                * Move on if it turns out to be something else than a file.
+                */
+               if (stat(queuefn, &sb) != 0)
+                       goto skip_item;
+               if (!S_ISREG(sb.st_mode)) {
+                       errno = EINVAL;
+                       goto skip_item;
+               }
+
                if (stat(mailfn, &sb) != 0)
                        goto skip_item;
 
@@ -315,7 +330,7 @@ skip_item:
                if (queuefn != NULL)
                        free(queuefn);
                if (mailfn != NULL)
-                       free(queuefn);
+                       free(mailfn);
        }
        closedir(spooldir);
        return (0);