Post release updates.
[gnupg.git] / tools / make-dns-cert.c
index 6cf9264..4cd4bd3 100644 (file)
@@ -1,11 +1,11 @@
 /* make-dns-cert.c - An OpenPGP-to-DNS CERT conversion tool
- * Copyright (C) 2006 Free Software Foundation, Inc.
+ * Copyright (C) 2006, 2008 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <config.h>
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <unistd.h>
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
@@ -28,6 +29,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -44,23 +46,28 @@ cert_key(const char *name,const char *keyfile)
   fd=open(keyfile,O_RDONLY);
   if(fd==-1)
     {
-      printf("Cannot open key file %s: %s\n",keyfile,strerror(errno));
+      fprintf(stderr,"Cannot open key file %s: %s\n",keyfile,strerror(errno));
       return 1;
     }
 
   err=fstat(fd,&statbuf);
   if(err==-1)
     {
-      printf("Unable to stat key file %s: %s\n",keyfile,strerror(errno));
+      fprintf(stderr,"Unable to stat key file %s: %s\n",
+             keyfile,strerror(errno));
       goto fail;
     }
 
-  if(statbuf.st_size>32768)
+  if(statbuf.st_size>65536)
     {
-      printf("Key %s too large for CERT encoding\n",keyfile);
+      fprintf(stderr,"Key %s too large for CERT encoding\n",keyfile);
       goto fail;
     }
 
+  if(statbuf.st_size>16384)
+    fprintf(stderr,"Warning: key file %s is larger than the default"
+           " GnuPG max-cert-size\n",keyfile);
+
   printf("%s\tTYPE37\t\\# %u 0003 0000 00 ",
         name,(unsigned int)statbuf.st_size+5);
 
@@ -69,10 +76,13 @@ cert_key(const char *name,const char *keyfile)
     {
       unsigned char buffer[1024];
 
-      err=read(fd,buffer,1024);
+      do 
+        err = read (fd,buffer,1024);
+      while (err == -1 && errno == EINTR);
       if(err==-1)
        {
-         printf("Unable to read key file %s: %s\n",keyfile,strerror(errno));
+         fprintf(stderr,"Unable to read key file %s: %s\n",
+                 keyfile,strerror(errno));
          goto fail;
        }
 
@@ -97,10 +107,28 @@ url_key(const char *name,const char *fpr,const char *url)
 
   if(fpr)
     {
-      fprlen=strlen(fpr);
+      const char *tmp = fpr;
+      while (*tmp)
+       {
+         if ((*tmp >= 'A' && *tmp <= 'F') ||
+             (*tmp >= 'a' && *tmp <= 'f') ||
+             (*tmp >= '0' && *tmp <= '9'))
+           {
+             fprlen++;
+           }
+         else if (*tmp != ' ' && *tmp != '\t')
+           {
+             fprintf(stderr,"Fingerprint must consist of only hex digits"
+                     " and whitespace\n");
+             return 1;
+           }
+
+         tmp++;
+       }
+
       if(fprlen%2)
        {
-         printf("Fingerprint must be an even number of characters\n");
+         fprintf(stderr,"Fingerprint must be an even number of characters\n");
          return 1;
        }
 
@@ -113,7 +141,8 @@ url_key(const char *name,const char *fpr,const char *url)
 
   if(!fpr && !url)
     {
-      printf("Cannot generate a CERT without either a fingerprint or URL\n");
+      fprintf(stderr,
+             "Cannot generate a CERT without either a fingerprint or URL\n");
       return 1;
     }
 
@@ -136,13 +165,13 @@ url_key(const char *name,const char *fpr,const char *url)
 }
 
 static void
-usage(void)
+usage(FILE *stream)
 {
-  printf("make-dns-cert\n");
-  printf("\t-f\tfingerprint\n");
-  printf("\t-u\tURL\n");
-  printf("\t-k\tkey file\n");
-  printf("\t-n\tDNS name\n");
+  fprintf(stream,"make-dns-cert\n");
+  fprintf(stream,"\t-f\tfingerprint\n");
+  fprintf(stream,"\t-u\tURL\n");
+  fprintf(stream,"\t-k\tkey file\n");
+  fprintf(stream,"\t-n\tDNS name\n");
 }
 
 int
@@ -153,17 +182,21 @@ main(int argc,char *argv[])
 
   if(argc==1)
     {
-      usage();
-      return 0;
+      usage(stderr);
+      return 1;
     }
   else if(argc>1 && strcmp(argv[1],"--version")==0)
     {
-      printf("make-dns-cert (GnuPG) " VERSION "\n");
+#if defined(HAVE_CONFIG_H) && defined(VERSION)
+      printf ("make-dns-cert (GnuPG) " VERSION "\n");
+#else
+      printf ("make-dns-cert gnupg-svn%d\n", atoi (10+"$Revision$"));
+#endif
       return 0;
     }
   else if(argc>1 && strcmp(argv[1],"--help")==0)
     {
-      usage();
+      usage(stdout);
       return 0;
     }
 
@@ -172,7 +205,7 @@ main(int argc,char *argv[])
       {
       default:
       case 'h':
-       usage();
+       usage(stdout);
        exit(0);
 
       case 'f':
@@ -194,14 +227,14 @@ main(int argc,char *argv[])
 
   if(!name)
     {
-      printf("No name provided\n");
+      fprintf(stderr,"No name provided\n");
       return 1;
     }
 
   if(keyfile && (fpr || url))
     {
-      printf("Cannot generate a CERT record with both a keyfile and"
-            " a fingerprint or URL\n");
+      fprintf(stderr,"Cannot generate a CERT record with both a keyfile and"
+             " a fingerprint or URL\n");
       return 1;
     }