* gpgkeys_ldap.c (main), gpgkeys_hkp.c (main), gpgkeys_http.c (main),
authorDavid Shaw <dshaw@jabberwocky.com>
Wed, 13 Oct 2004 18:30:29 +0000 (18:30 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Wed, 13 Oct 2004 18:30:29 +0000 (18:30 +0000)
gpgkeys_finger.c (main): Call timeout functions before performing an
action that could block for a long time.

* ksutil.h, ksutil.c: New.  Right now just contains timeout functions.

keyserver/ChangeLog
keyserver/Makefile.am
keyserver/gpgkeys_finger.c
keyserver/gpgkeys_hkp.c
keyserver/gpgkeys_http.c
keyserver/gpgkeys_ldap.c
keyserver/ksutil.c [new file with mode: 0644]
keyserver/ksutil.h [new file with mode: 0644]

index 1345060..da06d28 100644 (file)
@@ -1,3 +1,12 @@
+2004-10-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main), gpgkeys_hkp.c (main), gpgkeys_http.c
+       (main), gpgkeys_finger.c (main): Call timeout functions before
+       performing an action that could block for a long time.
+
+       * ksutil.h, ksutil.c: New.  Right now just contains timeout
+       functions.
+
 2004-10-11  David Shaw  <dshaw@jabberwocky.com>
 
        * gpgkeys_finger.c, gpgkeys_hkp.c, gpgkeys_http.c, gpgkeys_ldap.c:
index c9f5825..f4b9703 100644 (file)
@@ -27,6 +27,11 @@ libexec_PROGRAMS = @GPGKEYS_LDAP@ @GPGKEYS_HKP@ @GPGKEYS_HTTP@ @GPGKEYS_FINGER@
 libexec_SCRIPTS = @GPGKEYS_MAILTO@
 noinst_SCRIPTS = gpgkeys_test
 
+gpgkeys_ldap_SOURCES = gpgkeys_ldap.c ksutil.c
+gpgkeys_hkp_SOURCES = gpgkeys_hkp.c ksutil.c
+gpgkeys_http_SOURCES = gpgkeys_http.c ksutil.c
+gpgkeys_finger_SOURCES = gpgkeys_finger.c ksutil.c
+
 gpgkeys_ldap_LDADD = ../util/libutil.a @LDAPLIBS@ @NETLIBS@ @LIBINTL@ @CAPLIBS@ @GETOPT@ @W32LIBS@
 gpgkeys_hkp_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ @LIBINTL@ @CAPLIBS@ @GETOPT@ @W32LIBS@
 gpgkeys_http_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ @LIBINTL@ @CAPLIBS@ @GETOPT@ @W32LIBS@
index d0755ed..43158cf 100644 (file)
@@ -44,6 +44,7 @@
 #define INCLUDED_BY_MAIN_MODULE 1
 #include "util.h"
 #include "keyserver.h"
+#include "ksutil.h"
 
 #ifdef _WIN32
 #define sock_close(a)  closesocket(a)
@@ -51,7 +52,6 @@
 #define sock_close(a)  close(a)
 #endif
 
-
 extern char *optarg;
 extern int optind;
 
@@ -65,7 +65,6 @@ static FILE *input, *output, *console;
 #define BEGIN "-----BEGIN PGP PUBLIC KEY BLOCK-----"
 #define END   "-----END PGP PUBLIC KEY BLOCK-----"
 
-
 #ifdef _WIN32
 static void
 deinit_sockets (void)
@@ -364,6 +363,7 @@ main(int argc,char *argv[])
   int arg,action=-1,ret=KEYSERVER_INTERNAL_ERROR;
   char line[MAX_LINE];
   char *thekey=NULL;
+  unsigned int timeout=DEFAULT_KEYSERVER_TIMEOUT;
 
   console=stderr;
 
@@ -472,11 +472,24 @@ main(int argc,char *argv[])
              else
                verbose++;
            }
+         else if(strncasecmp(start,"timeout",7)==0)
+           {
+             if(no)
+               timeout=0;
+             else
+               timeout=atoi(&start[8]);
+           }
 
          continue;
        }
     }
 
+  if(timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
   /* If it's a GET or a SEARCH, the next thing to come in is the
      keyids.  If it's a SEND, then there are no keyids. */
 
@@ -534,6 +547,8 @@ main(int argc,char *argv[])
       fprintf(console,"Command:\tGET\n");
     }
 
+  set_timeout(timeout);
+
   ret = get_key(thekey);
 
  fail:
index c42925c..77bad48 100644 (file)
@@ -32,6 +32,7 @@
 #include "util.h"
 #include "http.h"
 #include "keyserver.h"
+#include "ksutil.h"
 
 extern char *optarg;
 extern int optind;
@@ -41,10 +42,10 @@ extern int optind;
 #define SEARCH 2
 #define MAX_LINE 80
 
-int verbose=0,include_revoked=0,include_disabled=0;
-unsigned int http_flags=0;
-char host[80]={'\0'},proxy[80]={'\0'},port[10]={'\0'};
-FILE *input=NULL,*output=NULL,*console=NULL;
+static int verbose=0,include_revoked=0,include_disabled=0;
+static unsigned int http_flags=0;
+static char host[80]={'\0'},proxy[80]={'\0'},port[10]={'\0'};
+static FILE *input=NULL,*output=NULL,*console=NULL;
 
 #define BEGIN "-----BEGIN PGP PUBLIC KEY BLOCK-----"
 #define END   "-----END PGP PUBLIC KEY BLOCK-----"
@@ -761,6 +762,7 @@ main(int argc,char *argv[])
   char line[MAX_LINE];
   int failed=0;
   struct keylist *keylist=NULL,*keyptr=NULL;
+  unsigned int timeout=DEFAULT_KEYSERVER_TIMEOUT;
 
   console=stderr;
 
@@ -926,11 +928,24 @@ main(int argc,char *argv[])
              else
                http_flags|=HTTP_FLAG_TRY_SRV;
            }
+         else if(strncasecmp(start,"timeout",7)==0)
+           {
+             if(no)
+               timeout=0;
+             else
+               timeout=atoi(&start[8]);
+           }
 
          continue;
        }
     }
 
+  if(timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
   /* By suggested convention, if the user gives a :port, then disable
      SRV. */
   if(port[0])
@@ -1027,6 +1042,8 @@ main(int argc,char *argv[])
 
       while(keyptr!=NULL)
        {
+         set_timeout(timeout);
+
          if(get_key(keyptr->str)!=KEYSERVER_OK)
            failed++;
 
@@ -1040,6 +1057,8 @@ main(int argc,char *argv[])
 
        do
          {
+           set_timeout(timeout);
+
            if(send_key(&eof)!=KEYSERVER_OK)
              failed++;
          }
@@ -1052,6 +1071,8 @@ main(int argc,char *argv[])
        char *searchkey=NULL;
        int len=0;
 
+       set_timeout(timeout);
+
        /* To search, we stick a space in between each key to search
            for. */
 
index 6eabdcf..32700fb 100644 (file)
@@ -31,6 +31,7 @@
 #include "util.h"
 #include "http.h"
 #include "keyserver.h"
+#include "ksutil.h"
 
 extern char *optarg;
 extern int optind;
@@ -38,10 +39,10 @@ extern int optind;
 #define GET    0
 #define MAX_LINE 80
 
-int verbose=0;
-unsigned int http_flags=0;
-char host[80]={'\0'},proxy[80]={'\0'},port[10]={'\0'},path[1024]={'\0'};
-FILE *input=NULL,*output=NULL,*console=NULL;
+static int verbose=0;
+static unsigned int http_flags=0;
+static char host[80]={'\0'},proxy[80]={'\0'},port[10]={'\0'},path[1024]={'\0'};
+static FILE *input=NULL,*output=NULL,*console=NULL;
 
 #define BEGIN "-----BEGIN PGP PUBLIC KEY BLOCK-----"
 #define END   "-----END PGP PUBLIC KEY BLOCK-----"
@@ -128,6 +129,7 @@ main(int argc,char *argv[])
   int arg,action=-1,ret=KEYSERVER_INTERNAL_ERROR;
   char line[MAX_LINE];
   char *thekey=NULL;
+  unsigned int timeout=DEFAULT_KEYSERVER_TIMEOUT;
 
   console=stderr;
 
@@ -281,11 +283,24 @@ main(int argc,char *argv[])
              else
                http_flags|=HTTP_FLAG_TRY_SRV;
            }
+         else if(strncasecmp(start,"timeout",7)==0)
+           {
+             if(no)
+               timeout=0;
+             else
+               timeout=atoi(&start[8]);
+           }
 
          continue;
        }
     }
 
+  if(timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
   /* By suggested convention, if the user gives a :port, then disable
      SRV. */
   if(port[0])
@@ -351,6 +366,8 @@ main(int argc,char *argv[])
       fprintf(console,"Command:\tGET\n");
     }
 
+  set_timeout(timeout);
+
   ret=get_key(thekey);
 
  fail:
index c8d0ca6..37903a8 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "util.h"
 #include "keyserver.h"
+#include "ksutil.h"
 
 #ifdef __riscos__
 #include "util.h"
@@ -1538,6 +1539,7 @@ main(int argc,char *argv[])
   char line[MAX_LINE];
   int version,failed=0,use_ssl=0,use_tls=0,bound=0;
   struct keylist *keylist=NULL,*keyptr=NULL;
+  unsigned int timeout=DEFAULT_KEYSERVER_TIMEOUT;
 
   console=stderr;
 
@@ -1738,11 +1740,24 @@ main(int argc,char *argv[])
                  real_ldap=1;
                }
            }
+         else if(strncasecmp(start,"timeout",7)==0)
+           {
+             if(no)
+               timeout=0;
+             else
+               timeout=atoi(&start[8]);
+           }
 
          continue;
        }
     }
 
+  if(timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
   /* SSL trumps TLS */
   if(use_ssl)
     use_tls=0;
@@ -1826,6 +1841,9 @@ main(int argc,char *argv[])
 #endif
     }
 
+  /* We have a timeout set for the setup stuff since it could time out
+     as well. */
+  set_timeout(timeout);
 
   /* Note that this tries all A records on a given host (or at least,
      OpenLDAP does). */
@@ -1946,6 +1964,8 @@ main(int argc,char *argv[])
 
       while(keyptr!=NULL)
        {
+         set_timeout(timeout);
+
          if(get_key(keyptr->str)!=KEYSERVER_OK)
            failed++;
 
@@ -1959,6 +1979,8 @@ main(int argc,char *argv[])
 
        do
          {
+           set_timeout(timeout);
+
            if(real_ldap)
              {
                if(send_key(&eof)!=KEYSERVER_OK)
@@ -1979,6 +2001,8 @@ main(int argc,char *argv[])
        char *searchkey=NULL;
        int len=0;
 
+       set_timeout(timeout);
+
        /* To search, we stick a * in between each key to search for.
           This means that if the user enters words, they'll get
           "enters*words".  If the user "enters words", they'll get
diff --git a/keyserver/ksutil.c b/keyserver/ksutil.c
new file mode 100644 (file)
index 0000000..51e527d
--- /dev/null
@@ -0,0 +1,63 @@
+/* ksutil.c - general keyserver utility functions
+ * Copyright (C) 2004 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
+ * (at your option) any later version.
+ *
+ * GnuPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <config.h>
+#include <signal.h>
+#include <unistd.h>
+#include "keyserver.h"
+#include "ksutil.h"
+
+static void
+catch_alarm(int foo)
+{
+  _exit(KEYSERVER_TIMEOUT);
+}
+
+unsigned int
+set_timeout(unsigned int seconds)
+{
+#ifdef HAVE_DOSISH_SYSTEM
+  return 0;
+#else
+  return alarm(seconds);
+#endif
+}
+
+int
+register_timeout(void)
+{
+#ifdef HAVE_DOSISH_SYSTEM
+  return 0;
+#else
+#if defined(HAVE_SIGACTION) && defined(HAVE_STRUCT_SIGACTION)
+  struct sigaction act;
+
+  act.sa_handler=catch_alarm;
+  sigemptyset(&act.sa_mask);
+  act.sa_flags=0;
+  return sigaction(SIGALRM,&act,NULL);
+#else 
+  if(signal(SIGALRM,catch_alarm)==SIG_ERR)
+    return -1;
+  else
+    return 0;
+#endif
+#endif
+}
diff --git a/keyserver/ksutil.h b/keyserver/ksutil.h
new file mode 100644 (file)
index 0000000..76adbcf
--- /dev/null
@@ -0,0 +1,30 @@
+/* ksutil.h
+ * Copyright (C) 2004 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
+ * (at your option) any later version.
+ *
+ * GNUPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _KSUTIL_H_
+#define _KSUTIL_H_
+
+/* 30 seconds seems reasonable */
+#define DEFAULT_KEYSERVER_TIMEOUT 30
+
+unsigned int set_timeout(unsigned int seconds);
+int register_timeout(void);
+
+#endif /* !_KSUTIL_H_ */