]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix issue 237.
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Mon, 13 Feb 2012 20:45:06 +0000 (05:45 +0900)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Tue, 14 Feb 2012 07:39:31 +0000 (16:39 +0900)
Properly set a clear error message when archive_{write,read}_set_options failed.

24 files changed:
libarchive/archive_options.c
libarchive/archive_read_set_options.c
libarchive/archive_read_support_format_cab.c
libarchive/archive_read_support_format_cpio.c
libarchive/archive_read_support_format_lha.c
libarchive/archive_read_support_format_rar.c
libarchive/archive_read_support_format_tar.c
libarchive/archive_read_support_format_zip.c
libarchive/archive_write_add_filter_bzip2.c
libarchive/archive_write_add_filter_gzip.c
libarchive/archive_write_add_filter_xz.c
libarchive/archive_write_set_format_7zip.c
libarchive/archive_write_set_format_cpio.c
libarchive/archive_write_set_format_cpio_newc.c
libarchive/archive_write_set_format_gnutar.c
libarchive/archive_write_set_format_iso9660.c
libarchive/archive_write_set_format_mtree.c
libarchive/archive_write_set_format_pax.c
libarchive/archive_write_set_format_ustar.c
libarchive/archive_write_set_format_xar.c
libarchive/archive_write_set_format_zip.c
libarchive/archive_write_set_options.c
libarchive/test/test_archive_read_set_options.c
libarchive/test/test_archive_write_set_options.c

index 962572c765a63bfde59221d96a9b87d20321af33..08a348fb30344ea3ee2ed8dd8da39d1fb118d6dd 100644 (file)
@@ -38,6 +38,7 @@ _archive_set_option(struct archive *a,
     int magic, const char *fn, option_handler use_option)
 {
        const char *mp, *op, *vp;
+       int r;
 
        archive_check_magic(a, magic, ARCHIVE_STATE_NEW, fn);
 
@@ -47,10 +48,24 @@ _archive_set_option(struct archive *a,
 
        if (op == NULL && vp == NULL)
                return (ARCHIVE_OK);
-       if (op == NULL)
+       if (op == NULL) {
+               archive_set_error(a, ARCHIVE_ERRNO_MISC, "Empty option");
                return (ARCHIVE_FAILED);
+       }
 
-       return use_option(a, mp, op, vp);
+       r = use_option(a, mp, op, vp);
+       if (r == ARCHIVE_WARN - 1) {
+               archive_set_error(a, ARCHIVE_ERRNO_MISC,
+                   "Unknown module name: `%s'", mp);
+               return (ARCHIVE_FAILED);
+       }
+       if (r == ARCHIVE_WARN) {
+               archive_set_error(a, ARCHIVE_ERRNO_MISC,
+                   "Undefined option: `%s%s%s%s%s%s'",
+                   vp?"":"!", mp?mp:"", mp?":":"", op, vp?"=":"", vp?vp:"");
+               return (ARCHIVE_FAILED);
+       }
+       return (r);
 }
 
 int
@@ -102,6 +117,25 @@ _archive_set_options(struct archive *a, const char *options,
                        free(data);
                        return (ARCHIVE_FATAL);
                }
+               if (r == ARCHIVE_FAILED && mod != NULL) {
+                       free(data);
+                       return (ARCHIVE_FAILED);
+               }
+               if (r == ARCHIVE_WARN - 1) {
+                       /* The module name is wrong. */
+                       archive_set_error(a, ARCHIVE_ERRNO_MISC,
+                           "Unknown module name: `%s'", mod);
+                       free(data);
+                       return (ARCHIVE_FAILED);
+               }
+               if (r == ARCHIVE_WARN) {
+                       /* The option name is wrong. No-one used this. */
+                       archive_set_error(a, ARCHIVE_ERRNO_MISC,
+                           "Undefined option: `%s%s%s'",
+                           mod?mod:"", mod?":":"", opt);
+                       free(data);
+                       return (ARCHIVE_FAILED);
+               }
                if (r == ARCHIVE_OK)
                        anyok = 1;
                else
index d6a5f45cca5f65e7e28e8c4147d057c5aa137e3e..793f8f73e53edba06defac850fc8ab73c3625161 100644 (file)
@@ -78,7 +78,7 @@ archive_set_format_option(struct archive *_a, const char *m, const char *o,
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_format_descriptor *format;
        size_t i;
-       int r, rv = ARCHIVE_FAILED;
+       int r, rv = ARCHIVE_WARN;
 
        for (i = 0; i < sizeof(a->formats)/sizeof(a->formats[0]); i++) {
                format = &a->formats[i];
@@ -102,6 +102,10 @@ archive_set_format_option(struct archive *_a, const char *m, const char *o,
                if (r == ARCHIVE_OK)
                        rv = ARCHIVE_OK;
        }
+       /* If the format name didn't match, return a special code for
+        * _archive_set_option[s]. */
+       if (rv == ARCHIVE_WARN && m != NULL)
+               rv = ARCHIVE_WARN - 1;
        return (rv);
 }
 
@@ -112,7 +116,7 @@ archive_set_filter_option(struct archive *_a, const char *m, const char *o,
        struct archive_read *a = (struct archive_read *)_a;
        struct archive_read_filter *filter;
        struct archive_read_filter_bidder *bidder;
-       int r, rv = ARCHIVE_FAILED;
+       int r, rv = ARCHIVE_WARN;
 
        for (filter = a->filter; filter != NULL; filter = filter->upstream) {
                bidder = filter->bidder;
@@ -135,6 +139,10 @@ archive_set_filter_option(struct archive *_a, const char *m, const char *o,
                if (r == ARCHIVE_OK)
                        rv = ARCHIVE_OK;
        }
+       /* If the filter name didn't match, return a special code for
+        * _archive_set_option[s]. */
+       if (rv == ARCHIVE_WARN && m != NULL)
+               rv = ARCHIVE_WARN - 1;
        return (rv);
 }
 
index 685c54841631c2869d2373dfb993a88cd58ed18d..d663e2e3c24f8359e2a7cbab2a4f80609790c8ff 100644 (file)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2010-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2010-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -478,11 +478,13 @@ archive_read_format_cab_options(struct archive_read *a,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "cab: unknown keyword ``%s''", key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index 5ae73d7700ba01edcc518a12aa578b08904e3948..a1f842a302438133b9820de4eb53c21fd51055e2 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2003-2007 Tim Kientzle
- * Copyright (c) 2010-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2010-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -325,7 +325,7 @@ archive_read_format_cpio_options(struct archive_read *a,
        if (strcmp(key, "compat-2x")  == 0) {
                /* Handle filnames as libarchive 2.x */
                cpio->init_default_conversion = (val != NULL)?1:0;
-               ret = ARCHIVE_OK;
+               return (ARCHIVE_OK);
        } else if (strcmp(key, "hdrcharset")  == 0) {
                if (val == NULL || val[0] == 0)
                        archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -339,11 +339,13 @@ archive_read_format_cpio_options(struct archive_read *a,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "cpio: unknown keyword ``%s''", key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index 4f0bf0ed48b6da22422f5e7320997cb665c9a3c3..ace3b3a9cfd9bd8c42f575f1729d9e813a10e759 100644 (file)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2008-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2008-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -445,11 +445,13 @@ archive_read_format_lha_options(struct archive_read *a,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "lha: unknown keyword ``%s''", key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index 1a8b157eb1f3227e998a91144c89748029cda077..d2a893ec5bba0b39cb958c2e53ef0d542ad3d03e 100644 (file)
@@ -757,11 +757,13 @@ archive_read_format_rar_options(struct archive_read *a,
       else
         ret = ARCHIVE_FATAL;
     }
-  } else
-    archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-        "rar: unknown keyword ``%s''", key);
-                
-  return (ret);
+    return (ret);
+  }
+
+  /* Note: The "warn" return is just to inform the options
+   * supervisor that we didn't handle it.  It will generate
+   * a suitable error if no one used this option. */
+  return (ARCHIVE_WARN);
 }
 
 static int
index eb255819c6c8e204c43254428771f8cf1f485f05..52d431e7e0c3e8c6825ecc49ad1bf4e384cc34db 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2003-2007 Tim Kientzle
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -369,7 +369,7 @@ archive_read_format_tar_options(struct archive_read *a,
                /* Handle UTF-8 filnames as libarchive 2.x */
                tar->compat_2x = (val != NULL)?1:0;
                tar->init_default_conversion = tar->compat_2x;
-               ret = ARCHIVE_OK;
+               return (ARCHIVE_OK);
        } else if (strcmp(key, "hdrcharset")  == 0) {
                if (val == NULL || val[0] == 0)
                        archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -383,11 +383,13 @@ archive_read_format_tar_options(struct archive_read *a,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "tar: unknown keyword ``%s''", key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 /* utility function- this exists to centralize the logic of tracking
index 5668f12c5375f1122ea00c7894850f2d2aba2c80..e8e1ce52443a24e73713299fe01a34e028035bf1 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2004 Tim Kientzle
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -441,7 +441,7 @@ archive_read_format_zip_options(struct archive_read *a,
        if (strcmp(key, "compat-2x")  == 0) {
                /* Handle filnames as libarchive 2.x */
                zip->init_default_conversion = (val != NULL) ? 1 : 0;
-               ret = ARCHIVE_OK;
+               return (ARCHIVE_OK);
        } else if (strcmp(key, "hdrcharset")  == 0) {
                if (val == NULL || val[0] == 0)
                        archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -456,11 +456,13 @@ archive_read_format_zip_options(struct archive_read *a,
                        } else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "zip: unknown keyword ``%s''", key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index e0d07a9ff7c794ae5f3cb89491280a94415e4b93..ef1fcf47dcb3fafcb7fe3dda402cadec2b7ab879 100644 (file)
@@ -208,6 +208,9 @@ archive_compressor_bzip2_options(struct archive_write_filter *f,
                return (ARCHIVE_OK);
        }
 
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
        return (ARCHIVE_WARN);
 }
 
index 786ae98ac020149328e8e2c41c52c8b936151340..d76154023a091b090533610afe80d3295dd5c20c 100644 (file)
@@ -220,6 +220,10 @@ archive_compressor_gzip_options(struct archive_write_filter *f, const char *key,
                data->compression_level = value[0] - '0';
                return (ARCHIVE_OK);
        }
+
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
        return (ARCHIVE_WARN);
 }
 
index b0677522455f4c5bbbbdf9d87e9df200875458c1..c6a9677aebeab8122428e469386ae76fc53c3b6e 100644 (file)
@@ -1,6 +1,6 @@
 /*-
- * Copyright (c) 2009,2010 Michihiro NAKAJIMA
  * Copyright (c) 2003-2010 Tim Kientzle
+ * Copyright (c) 2009-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -365,6 +365,9 @@ archive_compressor_xz_options(struct archive_write_filter *f,
                return (ARCHIVE_OK);
        }
 
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
        return (ARCHIVE_WARN);
 }
 
index 9820f130032381af11d84f1816e0942cf1be1105..1f6fa9710d018eced4c9f4a8c4b2c879cc6700ca 100644 (file)
@@ -413,7 +413,10 @@ _7z_options(struct archive_write *a, const char *key, const char *value)
                return (ARCHIVE_OK);
        }
 
-       return (ARCHIVE_FAILED);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index 92b9bfb0b9ffe43e8aac2f7e09543309f2c691e8..5d64cdcf0cb370340b0324f4c74b8f36f5986c14 100644 (file)
@@ -147,11 +147,13 @@ archive_write_cpio_options(struct archive_write *a, const char *key,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "%s: unknown keyword ``%s''", a->format_name, key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 /*
index d06c391a81fdc688dae1effda43c93b9e33e2c37..d7c2899ca9660e572c6abbf5360a42ed3bb6465b 100644 (file)
@@ -154,11 +154,13 @@ archive_write_newc_options(struct archive_write *a, const char *key,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "%s: unknown keyword ``%s''", a->format_name, key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static struct archive_string_conv *
index dea46b05d4ac557aab408fdb7597a76c2f4dcbac..dc5b744886d38fae27407f117cf03051762020bf 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
  * Author: Jonas Gastal <jgastal@profusion.mobi>
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  *
  * All rights reserved.
  *
@@ -177,7 +177,8 @@ archive_write_set_format_gnutar(struct archive *_a)
 
        gnutar = (struct gnutar *)calloc(1, sizeof(*gnutar));
        if (gnutar == NULL) {
-               archive_set_error(&a->archive, ENOMEM, "Can't allocate gnutar data");
+               archive_set_error(&a->archive, ENOMEM,
+                   "Can't allocate gnutar data");
                return (ARCHIVE_FATAL);
        }
        a->format_data = gnutar;
@@ -213,11 +214,13 @@ archive_write_gnutar_options(struct archive_write *a, const char *key,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "%s: unknown keyword ``%s''", a->format_name, key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index bdb3e3a1b569f0f951decf2d96beee654c5d0948..90c2157025b134ae0ea064303d668e78391ac18d 100644 (file)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2009-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2009-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -1507,6 +1507,11 @@ iso9660_options(struct archive_write *a, const char *key, const char *value)
                break;
        }
 
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
+
 invalid_value:
        archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
            "Invalid value for option ``%s''", key);
index 3802a25f3d08b03206f0073ae03cb140348d8c54..6b6449cd25ec18082f7d515f5aae9d568a15e0b5 100644 (file)
@@ -1,6 +1,6 @@
 /*-
- * Copyright (c) 2009,2011 Michihiro NAKAJIMA
  * Copyright (c) 2008 Joerg Sonnenberger
+ * Copyright (c) 2009-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -1222,7 +1222,10 @@ archive_write_mtree_options(struct archive_write *a, const char *key,
                return (ARCHIVE_OK);
        }
 
-       return (ARCHIVE_FAILED);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 int
index a62d99df8c1f7fa7b9318144578bda1e5e7e9ab2..742b9ebdde168eff4ebff9d5822816f1e334cf8c 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2003-2007 Tim Kientzle
- * Copyright (c) 2010-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2010-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -187,11 +187,13 @@ archive_write_pax_options(struct archive_write *a, const char *key,
                } else
                        archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
                            "pax: invalid charset name");
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "pax: unknown keyword ``%s''", key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 /*
index 4b96ac23c06f3022686c4f3ccf5e8eaa31d7902e..3117dd3642a9434aba153448a676984f27a0a2a5 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2003-2007 Tim Kientzle
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -224,11 +224,13 @@ archive_write_ustar_options(struct archive_write *a, const char *key,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "%s: unknown keyword ``%s''", a->format_name, key);
+               return (ret);
+       }
 
-       return (ret);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index d6e9bcb1e84254c400fdeba32891443f0b15af90..988a971e0bd206db03bbe0c7517065c9c767c240 100644 (file)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2010-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2010-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -498,7 +498,10 @@ xar_options(struct archive_write *a, const char *key, const char *value)
                return (ARCHIVE_OK);
        }
 
-       return (ARCHIVE_FAILED);
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 static int
index f07a14f47f5a47278ef82d3e9bbee1c4648d73d6..0e3d7bb317d28be6f7e82fdfc792bfd04ffcd82b 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 2008 Anselm Strauss
  * Copyright (c) 2009 Joerg Sonnenberger
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -238,6 +238,7 @@ archive_write_zip_options(struct archive_write *a, const char *key,
                        zip->compression = COMPRESSION_STORE;
                        ret = ARCHIVE_OK;
                }
+               return (ret);
        } else if (strcmp(key, "hdrcharset")  == 0) {
                if (val == NULL || val[0] == 0) {
                        archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -251,10 +252,13 @@ archive_write_zip_options(struct archive_write *a, const char *key,
                        else
                                ret = ARCHIVE_FATAL;
                }
-       } else
-               archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-                   "%s: unknown keyword ``%s''", a->format_name, key);
-       return (ret);
+               return (ret);
+       }
+
+       /* Note: The "warn" return is just to inform the options
+        * supervisor that we didn't handle it.  It will generate
+        * a suitable error if no one used this option. */
+       return (ARCHIVE_WARN);
 }
 
 int
index a8c2d23dd73d50f5b551b18f9c7570b4a6733455..2e17984216a2449b6c3df7b1d29522351e810488 100644 (file)
@@ -79,10 +79,12 @@ archive_set_format_option(struct archive *_a, const char *m, const char *o,
 
        if (a->format_name == NULL)
                return (ARCHIVE_FAILED);
+       /* If the format name didn't match, return a special code for
+        * _archive_set_option[s]. */
        if (m != NULL && strcmp(m, a->format_name) != 0)
-               return (ARCHIVE_FAILED);
+               return (ARCHIVE_WARN - 1);
        if (a->format_options == NULL)
-               return (ARCHIVE_FAILED);
+               return (ARCHIVE_WARN);
        return a->format_options(a, o, v);
 }
 
@@ -92,7 +94,7 @@ archive_set_filter_option(struct archive *_a, const char *m, const char *o,
 {
        struct archive_write *a = (struct archive_write *)_a;
        struct archive_write_filter *filter;
-       int r, rv = ARCHIVE_FAILED;
+       int r, rv = ARCHIVE_WARN;
 
        for (filter = a->filter_first; filter != NULL; filter = filter->next_filter) {
                if (filter->options == NULL)
@@ -111,6 +113,10 @@ archive_set_filter_option(struct archive *_a, const char *m, const char *o,
                if (r == ARCHIVE_OK)
                        rv = ARCHIVE_OK;
        }
+       /* If the filter name didn't match, return a special code for
+        * _archive_set_option[s]. */
+       if (rv == ARCHIVE_WARN && m != NULL)
+               rv = ARCHIVE_WARN - 1;
        return (rv);
 }
 
index a199afe44524d2d82a2263a4db1cd867a2773b29..297d8fe8bf8f817c44ce441e9f976d7c1063dd64 100644 (file)
@@ -33,14 +33,13 @@ static void
 test(int pristine)
 {
        struct archive* a = archive_read_new();
-       int halfempty_options_rv = pristine ? ARCHIVE_WARN : ARCHIVE_OK;
+       int halfempty_options_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
        int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
-       int mixed_options_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_WARN;
 
        if (!pristine) {
                archive_read_support_filter_all(a);
                archive_read_support_format_all(a);
-        }
+       }
 
        /* NULL and "" denote `no option', so they're ok no matter
         * what, if any, formats are registered */
@@ -49,25 +48,73 @@ test(int pristine)
 
        /* unknown modules and options */
        should(a, ARCHIVE_FAILED, "fubar:snafu");
+       assertEqualString("Unknown module name: `fubar'",
+           archive_error_string(a));
        should(a, ARCHIVE_FAILED, "fubar:snafu=betcha");
+       assertEqualString("Unknown module name: `fubar'",
+           archive_error_string(a));
 
        /* unknown modules and options */
        should(a, ARCHIVE_FAILED, "snafu");
+       assertEqualString("Undefined option: `snafu'",
+           archive_error_string(a));
        should(a, ARCHIVE_FAILED, "snafu=betcha");
+       assertEqualString("Undefined option: `snafu'",
+           archive_error_string(a));
 
-       /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_WARN otherwise */
+       /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_FAILED otherwise */
        should(a, known_option_rv, "iso9660:joliet");
+       if (pristine) {
+               assertEqualString("Unknown module name: `iso9660'",
+                   archive_error_string(a));
+       }
        should(a, known_option_rv, "iso9660:joliet");
+       if (pristine) {
+               assertEqualString("Unknown module name: `iso9660'",
+                   archive_error_string(a));
+       }
        should(a, known_option_rv, "joliet");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
        should(a, known_option_rv, "!joliet");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
 
        should(a, ARCHIVE_OK, ",");
        should(a, ARCHIVE_OK, ",,");
 
        should(a, halfempty_options_rv, ",joliet");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
        should(a, halfempty_options_rv, "joliet,");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
 
-       should(a, mixed_options_rv, "joliet,snafu");
+       should(a, ARCHIVE_FAILED, "joliet,snafu");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       } else {
+               assertEqualString("Undefined option: `snafu'",
+                   archive_error_string(a));
+       }
+
+       should(a, ARCHIVE_FAILED, "iso9660:snafu");
+       if (pristine) {
+               assertEqualString("Unknown module name: `iso9660'",
+                   archive_error_string(a));
+       } else {
+               assertEqualString("Undefined option: `iso9660:snafu'",
+                   archive_error_string(a));
+       }
 
        archive_read_finish(a);
 }
index f98342eac0b76929035460417752abc481f2661b..57aba98c18c96d2737965c23bf7a51cb5e9b95ac 100644 (file)
@@ -33,14 +33,13 @@ static void
 test(int pristine)
 {
        struct archive* a = archive_write_new();
-       int halfempty_options_rv = pristine ? ARCHIVE_WARN : ARCHIVE_OK;
+       int halfempty_options_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
        int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
-       int mixed_options_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_WARN;
 
        if (!pristine) {
                archive_write_set_compression_gzip(a);
                archive_write_set_format_iso9660(a);
-        }
+       }
 
        /* NULL and "" denote `no option', so they're ok no matter
         * what, if any, formats are registered */
@@ -49,25 +48,73 @@ test(int pristine)
 
        /* unknown modules and options */
        should(a, ARCHIVE_FAILED, "fubar:snafu");
+       assertEqualString("Unknown module name: `fubar'",
+           archive_error_string(a));
        should(a, ARCHIVE_FAILED, "fubar:snafu=betcha");
+       assertEqualString("Unknown module name: `fubar'",
+           archive_error_string(a));
 
        /* unknown modules and options */
        should(a, ARCHIVE_FAILED, "snafu");
+       assertEqualString("Undefined option: `snafu'",
+           archive_error_string(a));
        should(a, ARCHIVE_FAILED, "snafu=betcha");
+       assertEqualString("Undefined option: `snafu'",
+           archive_error_string(a));
 
-       /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_WARN otherwise */
+       /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_FAILED otherwise */
        should(a, known_option_rv, "iso9660:joliet");
+       if (pristine) {
+               assertEqualString("Unknown module name: `iso9660'",
+                   archive_error_string(a));
+       }
        should(a, known_option_rv, "iso9660:joliet");
+       if (pristine) {
+               assertEqualString("Unknown module name: `iso9660'",
+                   archive_error_string(a));
+       }
        should(a, known_option_rv, "joliet");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
        should(a, known_option_rv, "!joliet");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
 
        should(a, ARCHIVE_OK, ",");
        should(a, ARCHIVE_OK, ",,");
 
        should(a, halfempty_options_rv, ",joliet");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
        should(a, halfempty_options_rv, "joliet,");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       }
 
-       should(a, mixed_options_rv, "joliet,snafu");
+       should(a, ARCHIVE_FAILED, "joliet,snafu");
+       if (pristine) {
+               assertEqualString("Undefined option: `joliet'",
+                   archive_error_string(a));
+       } else {
+               assertEqualString("Undefined option: `snafu'",
+                   archive_error_string(a));
+       }
+
+       should(a, ARCHIVE_FAILED, "iso9660:snafu");
+       if (pristine) {
+               assertEqualString("Unknown module name: `iso9660'",
+                   archive_error_string(a));
+       } else {
+               assertEqualString("Undefined option: `iso9660:snafu'",
+                   archive_error_string(a));
+       }
 
        archive_write_finish(a);
 }