* revoke.c (export_minimal_pk, gen_desig_revoke, gen_revoke): Export a
[gnupg.git] / g10 / g10.c
index b8cae1b..e004015 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -46,6 +46,7 @@
 #include "status.h"
 #include "g10defs.h"
 #include "keyserver-internal.h"
+#include "exec.h"
 
 enum cmd_and_opt_values { aNull = 0,
     oArmor       = 'a',
@@ -185,6 +186,7 @@ enum cmd_and_opt_values { aNull = 0,
     oTrustDBName,
     oNoSecmemWarn,
     oNoPermissionWarn,
+    oNoMDCWarn,
     oNoArmor,
     oNoDefKeyring,
     oNoGreeting,
@@ -236,6 +238,8 @@ enum cmd_and_opt_values { aNull = 0,
     oLockNever,
     oKeyServer,
     oKeyServerOptions,
+    oImportOptions,
+    oExportOptions,
     oTempDir,
     oExecPath,
     oEncryptTo,
@@ -408,6 +412,8 @@ static ARGPARSE_OPTS opts[] = {
     { oDefaultKey, "default-key" ,2, N_("|NAME|use NAME as default secret key")},
     { oKeyServer, "keyserver",2, N_("|HOST|use this keyserver to lookup keys")},
     { oKeyServerOptions, "keyserver-options",2,"@"},
+    { oImportOptions, "import-options",2,"@"},
+    { oExportOptions, "export-options",2,"@"},
     { oCharset, "charset"   , 2, N_("|NAME|set terminal charset to NAME") },
     { oOptions, "options"   , 2, N_("read options from file")},
 
@@ -486,6 +492,7 @@ static ARGPARSE_OPTS opts[] = {
     { oTrustDBName, "trustdb-name", 2, "@" },
     { oNoSecmemWarn, "no-secmem-warning", 0, "@" }, /* used only by regression tests */
     { oNoPermissionWarn, "no-permission-warning", 0, "@" },
+    { oNoMDCWarn, "no-mdc-warning", 0, "@" },
     { oNoArmor, "no-armor",   0, "@"},
     { oNoArmor, "no-armour",   0, "@"},
     { oNoDefKeyring, "no-default-keyring", 0, "@" },
@@ -901,6 +908,12 @@ main( int argc, char **argv )
     opt.pgp2_workarounds = 1;
     opt.force_v3_sigs = 1;
     opt.escape_from = 1;
+    opt.import_options=0;
+    opt.export_options=
+      EXPORT_INCLUDE_NON_RFC|EXPORT_INCLUDE_ATTRIBUTES;
+    opt.keyserver_options.import_options=IMPORT_REPAIR_HKP_SUBKEY_BUG;
+    opt.keyserver_options.export_options=
+      EXPORT_INCLUDE_NON_RFC|EXPORT_INCLUDE_ATTRIBUTES;
     opt.keyserver_options.include_subkeys=1;
 #if defined (__MINGW32__) || defined (__CYGWIN32__)
     opt.homedir = read_w32_registry_string( NULL, "Software\\GNU\\GnuPG", "HomeDir" );
@@ -966,8 +979,21 @@ main( int argc, char **argv )
     /* Okay, we are now working under our real uid */
 
     if( default_config )
-       configname = make_filename(opt.homedir, "options", NULL );
-
+      {
+       configname = make_filename(opt.homedir, "gpg.conf", NULL );
+        if (!access (configname, R_OK))
+          { /* Print a warning when both config files are present. */
+            char *p = make_filename(opt.homedir, "options", NULL );
+            if (!access (p, R_OK))
+              log_info (_("NOTE: old default options file `%s' ignored\n"), p);
+            m_free (p);
+          }
+        else
+          { /* Keep on using the old default one. */
+            m_free (configname);
+            configname = make_filename(opt.homedir, "options", NULL );
+          }
+      }
     argc = orig_argc;
     argv = orig_argv;
     pargs.argc = &argc;
@@ -1304,6 +1330,7 @@ main( int argc, char **argv )
          case oCertDigestAlgo: cert_digest_string = m_strdup(pargs.r.ret_str); break;
          case oNoSecmemWarn: secmem_set_flags( secmem_get_flags() | 1 ); break;
          case oNoPermissionWarn: opt.no_perm_warn=1; break;
+         case oNoMDCWarn: opt.no_mdc_warn=1; break;
          case oCharset:
            if( set_native_charset( pargs.r.ret_str ) )
                log_error(_("%s is not a valid character set\n"),
@@ -1322,23 +1349,39 @@ main( int argc, char **argv )
 #endif /* __riscos__ */
             break;
          case oKeyServer:
+           opt.keyserver_uri=m_strdup(pargs.r.ret_str);
            if(parse_keyserver_uri(pargs.r.ret_str,configname,configlineno))
              log_error(_("could not parse keyserver URI\n"));
            break;
          case oKeyServerOptions:
            parse_keyserver_options(pargs.r.ret_str);
            break;
+         case oImportOptions:
+           if(!parse_import_options(pargs.r.ret_str,&opt.import_options))
+             {
+               if(configname)
+                 log_error(_("%s:%d: invalid import options\n"),
+                           configname,configlineno);
+               else
+                 log_error(_("invalid import options\n"));
+             }
+           break;
+         case oExportOptions:
+           if(!parse_export_options(pargs.r.ret_str,&opt.export_options))
+             {
+               if(configname)
+                 log_error(_("%s:%d: invalid export options\n"),
+                           configname,configlineno);
+               else
+                 log_error(_("invalid export options\n"));
+             }
+           break;
          case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
          case oExecPath:
-           {
-             /* Notice that path is never freed.  That is
-                intentional due to the way putenv() works. */
-             char *path=m_alloc(5+strlen(pargs.r.ret_str)+1);
-             strcpy(path,"PATH=");
-             strcat(path,pargs.r.ret_str);
-             if(putenv(path)!=0)
-               log_error(_("unable to set exec-path to %s\n"),path);
-           }
+           if(set_exec_path(pargs.r.ret_str,0))
+             log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
+           else
+             opt.exec_path_set=1;
            break;
          case oNotation:
            add_notation_data( pargs.r.ret_str, 0 );
@@ -1579,13 +1622,17 @@ main( int argc, char **argv )
 
        if(opt.pgp6 || opt.pgp7)
          {
-           opt.force_mdc=0;
-           opt.disable_mdc=1;
            opt.sk_comments=0;
            opt.escape_from=1;
            opt.force_v3_sigs=1;
            opt.ask_sig_expire=0;
            opt.def_compress_algo=1;
+
+           if(opt.pgp6) /* pgp7 has MDC */
+             {
+               opt.force_mdc=0;
+               opt.disable_mdc=1;
+             }
          }
       }
 
@@ -1996,7 +2043,8 @@ main( int argc, char **argv )
 
       case aFastImport:
       case aImport:
-       import_keys( argc? argv:NULL, argc, (cmd == aFastImport), NULL );
+       import_keys( argc? argv:NULL, argc, (cmd == aFastImport),
+                    NULL, opt.import_options );
        break;
 
       case aExport:
@@ -2011,7 +2059,7 @@ main( int argc, char **argv )
        else if( cmd == aRecvKeys )
            keyserver_import( sl );
        else
-           export_pubkeys( sl, (cmd == aExport) );
+           export_pubkeys( sl, opt.export_options );
        free_strlist(sl);
        break;