---
 bin/varnishd/storage/stevedore_utils.c        | 29 ++++++++++++++++++---------
 bin/varnishd/storage/storage.h                |  4 ++--
 bin/varnishd/storage/storage_file.c           | 11 +++++-----
 bin/varnishd/storage/storage_persistent_mgt.c |  2 +-
 4 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/bin/varnishd/storage/stevedore_utils.c 
b/bin/varnishd/storage/stevedore_utils.c
index 540f911..6f55b69 100644
--- a/bin/varnishd/storage/stevedore_utils.c
+++ b/bin/varnishd/storage/stevedore_utils.c
@@ -168,13 +168,21 @@ stv_fssize(int fd, unsigned *bs)
  * Decide file size.
  *
  * If the sizespecification is empty and the file exists with non-zero
- * size, use that, otherwise, interpret the specification.
+ * size
+ *     use that
+ * else if the sizespecification is non-empty
+ *     interpret the specification
+ * else if the default specification is non-empty
+ *     interpret the default specification
+ * else
+ *     bail with ARGV_ERR
  *
  * Handle off_t sizes and pointer width limitations.
  */
 
 uintmax_t
-STV_FileSize(int fd, const char *size, unsigned *granularity, const char *ctx)
+STV_FileSize(int fd, const char *size, const char *defsize,
+    unsigned *granularity, const char *ctx)
 {
        uintmax_t l, fssize;
        unsigned bs;
@@ -190,27 +198,30 @@ STV_FileSize(int fd, const char *size, unsigned 
*granularity, const char *ctx)
        fssize = stv_fssize(fd, &bs);
        XXXAZ(bs % *granularity);
 
-       if ((size == NULL || *size == '\0') && st.st_size != 0) {
+       l = 0;
+       if (size != NULL && *size == '\0')
+               size = NULL;
+       if (size == NULL && st.st_size != 0) {
                /*
                 * We have no size specification, but an existing file,
                 * use its existing size.
                 */
                l = st.st_size;
-       } else {
-               AN(size);
-               q = VNUM_2bytes(size, &l, 0);
+       } else if (size == NULL)
+               size = defsize;
 
+       if (size != NULL) {
+               q = VNUM_2bytes(size, &l, 0);
                if (q != NULL)
                        ARGV_ERR("(%s) size \"%s\": %s\n", ctx, size, q);
-
                if (l < 1024*1024)
                        ARGV_ERR("(%s) size \"%s\": too small, "
                            "did you forget to specify M or G?\n", ctx, size);
-
                if (l > fssize)
                        ARGV_ERR("(%s) size \"%s\": larger than file system\n",
                            ctx, size);
-       }
+       } else if (l == 0)
+               ARGV_ERR("(%s) no size specified\n", ctx);
 
        /*
         * This trickery wouldn't be necessary if X/Open would
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index 0d162ca..06264ae 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -194,8 +194,8 @@ extern struct stevedore *stv_transient;
 
 /*--------------------------------------------------------------------*/
 int STV_GetFile(const char *fn, int *fdp, const char **fnp, const char *ctx);
-uintmax_t STV_FileSize(int fd, const char *size, unsigned *granularity,
-    const char *ctx);
+uintmax_t STV_FileSize(int fd, const char *size, const char *defsize,
+    unsigned *granularity, const char *ctx);
 struct object *STV_MkObject(struct stevedore *, struct objcore *, void *ptr);
 
 struct lru *LRU_Alloc(void);
diff --git a/bin/varnishd/storage/storage_file.c 
b/bin/varnishd/storage/storage_file.c
index 863ad25..db634f2 100644
--- a/bin/varnishd/storage/storage_file.c
+++ b/bin/varnishd/storage/storage_file.c
@@ -98,19 +98,20 @@ struct smf_sc {
 
 /*--------------------------------------------------------------------*/
 
+static const char default_size[] = "100M";
+static const char default_filename[] = ".";
+
 static void
 smf_initfile(struct smf_sc *sc, const char *size)
 {
-       sc->filesize = STV_FileSize(sc->fd, size, &sc->pagesize, "-sfile");
+       sc->filesize = STV_FileSize(sc->fd, size, default_size, &sc->pagesize,
+           "-sfile");
 
        AZ(ftruncate(sc->fd, (off_t)sc->filesize));
 
        /* XXX: force block allocation here or in open ? */
 }
 
-static const char default_size[] = "100M";
-static const char default_filename[] = ".";
-
 static void
 smf_init(struct stevedore *parent, int ac, char * const *av)
 {
@@ -122,7 +123,7 @@ smf_init(struct stevedore *parent, int ac, char * const *av)
        AZ(av[ac]);
 
        fn = default_filename;
-       size = default_size;
+       size = NULL;
        page_size = getpagesize();
 
        if (ac > 3)
diff --git a/bin/varnishd/storage/storage_persistent_mgt.c 
b/bin/varnishd/storage/storage_persistent_mgt.c
index 33f41e0..e3a41b0 100644
--- a/bin/varnishd/storage/storage_persistent_mgt.c
+++ b/bin/varnishd/storage/storage_persistent_mgt.c
@@ -168,7 +168,7 @@ smp_mgt_init(struct stevedore *parent, int ac, char * const 
*av)
 
        sc->align = sizeof(void*) * 2;
        sc->granularity = getpagesize();
-       sc->mediasize = STV_FileSize(sc->fd, av[1], &sc->granularity,
+       sc->mediasize = STV_FileSize(sc->fd, av[1], NULL, &sc->granularity,
            "-spersistent");
 
        AZ(ftruncate(sc->fd, sc->mediasize));
-- 
2.1.1


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to