Make ca command silently use default if .attr file does not exist
[openssl.git] / apps / apps.c
index 5a32dc0..79171d1 100644 (file)
 #endif
 #include <ctype.h>
 #include <errno.h>
-#ifdef __VMS
-# include <descrip.h>
-# include <iledef.h>
-# include <fscndef.h>
-# include <starlet.h>
-#endif
 #include <openssl/err.h>
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
@@ -1056,7 +1050,8 @@ int set_name_ex(unsigned long *flags, const char *arg)
     };
     if (set_multi_opts(flags, arg, ex_tbl) == 0)
         return 0;
-    if ((*flags & XN_FLAG_SEP_MASK) == 0)
+    if (*flags != XN_FLAG_COMPAT
+        && (*flags & XN_FLAG_SEP_MASK) == 0)
         *flags |= XN_FLAG_SEP_CPLUS_SPC;
     return 1;
 }
@@ -1193,16 +1188,15 @@ void print_bignum_var(BIO *out, const BIGNUM *in, const char *var,
 {
     BIO_printf(out, "    static unsigned char %s_%d[] = {", var, len);
     if (BN_is_zero(in)) {
-        BIO_printf(out, "\n\t0x00");
+        BIO_printf(out, "\n        0x00");
     } else {
         int i, l;
 
         l = BN_bn2bin(in, buffer);
         for (i = 0; i < l; i++) {
-            if ((i % 10) == 0)
-                BIO_printf(out, "\n\t");
+            BIO_printf(out, (i % 10) == 0 ? "\n        " : " ");
             if (i < l - 1)
-                BIO_printf(out, "0x%02X, ", buffer[i]);
+                BIO_printf(out, "0x%02X,", buffer[i]);
             else
                 BIO_printf(out, "0x%02X", buffer[i]);
         }
@@ -1567,7 +1561,7 @@ CA_DB *load_index(const char *dbfile, DB_ATTR *db_attr)
 #else
     BIO_snprintf(buf, sizeof(buf), "%s-attr", dbfile);
 #endif
-    dbattr_conf = app_load_config(buf);
+    dbattr_conf = app_load_config_quiet(buf);
 
     retdb = app_malloc(sizeof(*retdb), "new DB");
     retdb->db = tmpdb;
@@ -1597,6 +1591,9 @@ CA_DB *load_index(const char *dbfile, DB_ATTR *db_attr)
     return retdb;
 }
 
+/*
+ * Returns > 0 on success, <= 0 on error
+ */
 int index_index(CA_DB *db)
 {
     if (!TXT_DB_create_index(db->db, DB_serial, NULL,
@@ -1771,8 +1768,14 @@ X509_NAME *parse_name(const char *cp, long chtype, int canmulti)
     char *work;
     X509_NAME *n;
 
-    if (*cp++ != '/')
+    if (*cp++ != '/') {
+        BIO_printf(bio_err,
+                   "name is expected to be in the format "
+                   "/type0=value0/type1=value1/type2=... where characters may "
+                   "be escaped by \\. This name is not in that format: '%s'\n",
+                   --cp);
         return NULL;
+    }
 
     n = X509_NAME_new();
     if (n == NULL)
@@ -1828,6 +1831,12 @@ X509_NAME *parse_name(const char *cp, long chtype, int canmulti)
                       opt_getprog(), typestr);
             continue;
         }
+        if (*valstr == '\0') {
+            BIO_printf(bio_err,
+                       "%s: No value provided for Subject Attribute %s, skipped\n",
+                       opt_getprog(), typestr);
+            continue;
+        }
         if (!X509_NAME_add_entry_by_NID(n, nid, chtype,
                                         valstr, strlen((char *)valstr),
                                         -1, ismulti ? -1 : 0))
@@ -2367,116 +2376,6 @@ int app_isdir(const char *name)
 }
 #endif
 
-/* app_dirname section */
-
-/*
- * This exactly follows what POSIX's
- * dirname does, but is implemented
- * in a more platform independent way.
- *
- * path        dirname
- * /usr/lib    /usr
- * /usr/       /
- * usr         .
- * /           /
- * .           .
- * ..          .
- * ""          .
- *
- * Note: this function also keeps the
- * possibility of modifying the 'path'
- * string same as POSIX dirname.
- */
-static char *posix_dirname(char *path)
-{
-    size_t l;
-    char *ret = ".";
-
-    l = strlen(path);
-    if (l == 0)
-        goto out;
-    if (strcmp(path, ".") == 0)
-        goto out;
-    if (strcmp(path, "..") == 0)
-        goto out;
-    if (strcmp(path, "/") == 0) {
-        ret = "/";
-        goto out;
-    }
-    if (path[l - 1] == '/') {
-        /* /usr/ */
-        path[l - 1] = '\0';
-    }
-    if ((ret = strrchr(path, '/')) == NULL) {
-        /* usr */
-        ret = ".";
-    } else if (ret == path) {
-        /* /usr */
-        *++ret = '\0';
-        ret = path;
-    } else {
-        /* /usr/lib */
-        *ret = '\0';
-        ret = path;
-    }
- out:
-    return ret;
-}
-
-/*
- * TODO: implement app_dirname for Windows.
- */
-#if !defined(_WIN32)
-char *app_dirname(char *path)
-{
-    return posix_dirname(path);
-}
-#elif defined(__VMS)
-/*
- * sys$filescan fills the given item list with pointers into the original
- * path string, so all we need to do is to find the file name and simply
- * put a NUL byte wherever the FSCN$_NAME pointer points.  If there is no
- * file name part and the path string isn't the empty string, we know for
- * a fact that the whole string is a directory spec and return it as is.
- * Otherwise or if that pointer is the starting address of the original
- * path string, we know to return "sys$disk:[]", which corresponds to the
- * Unixly ".".
- *
- * If sys$filescan returns an error status, we know that this is not
- * parsable as a VMS file spec, and then use the fallback, in case we
- * have a Unix type path.
- */
-char *app_dirname(char *path)
-{
-    char *ret = "sys$disk:[]";
-    struct dsc$descriptor_s dsc_path = { 0 };
-    ile2 itemlist[] = {
-        {0, FSCN$_NAME, 0},
-        {0, 0, 0}
-    };
-    int fields;
-    int status;
-
-    dsc_path.dsc$a_pointer = path;
-    dsc_path.dsc$w_length = strlen(path);
-    status = sys$filescan(&dsc_path, itemlist, &fields, 0, 0);
-
-    if (!(status & 1))
-        return posix_dirname(path);
-
-    if ((fields & (1 << FSCN$_NAME)) == 0) {
-        if (dsc_path.dsc$w_length != 0)
-            ret = path;
-    } else if (itemlist[0].ile2$ps_bufaddr != path) {
-        if (itemlist[0].ile2$ps_bufaddr != path) {
-            *itemlist[0].ile2$ps_bufaddr = '\0';
-            ret = path;
-        }
-    }
-    return ret;
-}
-#endif
-
 /* raw_read|write section */
 #if defined(__VMS)
 # include "vms_term_sock.h"
@@ -2599,7 +2498,7 @@ BIO *dup_bio_err(int format)
     return b;
 }
 
-void destroy_prefix_method()
+void destroy_prefix_method(void)
 {
     BIO_meth_free(prefix_method);
     prefix_method = NULL;