[svn] GnuPG - r4786 - trunk/common
svn author marcus
cvs at cvs.gnupg.org
Wed Jun 18 16:46:06 CEST 2008
Author: marcus
Date: 2008-06-18 16:46:05 +0200 (Wed, 18 Jun 2008)
New Revision: 4786
Modified:
trunk/common/ChangeLog
trunk/common/iobuf.c
trunk/common/sysutils.c
trunk/common/sysutils.h
Log:
2008-06-18 Marcus Brinkmann <marcus at g10code.de>
* sysutils.h (translate_table_init, translate_table_lookup): New
prototypes.
* sysutils.c: Include <ctype.h>.
(FD_TRANSLATE_MAX): New macro.
(fd_translate, fd_translate_len): New static variables.
(translate_table_init, translate_table_lookup): New functions.
(translate_sys2libc_fd_int): Translate file descriptor.
* iobuf.c (check_special_filename): Translate handle values from
special filenames.
Modified: trunk/common/ChangeLog
===================================================================
--- trunk/common/ChangeLog 2008-06-16 15:48:33 UTC (rev 4785)
+++ trunk/common/ChangeLog 2008-06-18 14:46:05 UTC (rev 4786)
@@ -1,3 +1,15 @@
+2008-06-18 Marcus Brinkmann <marcus at g10code.de>
+
+ * sysutils.h (translate_table_init, translate_table_lookup): New
+ prototypes.
+ * sysutils.c: Include <ctype.h>.
+ (FD_TRANSLATE_MAX): New macro.
+ (fd_translate, fd_translate_len): New static variables.
+ (translate_table_init, translate_table_lookup): New functions.
+ (translate_sys2libc_fd_int): Translate file descriptor.
+ * iobuf.c (check_special_filename): Translate handle values from
+ special filenames.
+
2008-06-16 Werner Koch <wk at g10code.com>
* homedir.c (w32_commondir): New.
Modified: trunk/common/iobuf.c
===================================================================
--- trunk/common/iobuf.c 2008-06-16 15:48:33 UTC (rev 4785)
+++ trunk/common/iobuf.c 2008-06-18 14:46:05 UTC (rev 4786)
@@ -1177,7 +1177,7 @@
for (i = 0; digitp (fname+i); i++)
;
if (!fname[i])
- return atoi (fname);
+ return translate_table_lookup (atoi (fname));
}
return -1;
}
Modified: trunk/common/sysutils.c
===================================================================
--- trunk/common/sysutils.c 2008-06-16 15:48:33 UTC (rev 4785)
+++ trunk/common/sysutils.c 2008-06-18 14:46:05 UTC (rev 4786)
@@ -50,6 +50,7 @@
# include <pth.h>
#endif
#include <fcntl.h>
+#include <ctype.h>
#include "util.h"
#include "i18n.h"
@@ -278,6 +279,116 @@
}
+
+/* Handle translation. On W32, we provide handle values on the
+ command line directly and using special file names such as
+ "-&HANDLE". However, in GPGME we can not directly inherit the
+ handles as this may interfere with other components in a
+ multithreaded application. Thus, we inject the handles after
+ creating the GPG process. The problem is that the handle numbers
+ change at injection, but it is too late to change the command line.
+ Hence this hack, which allows us to translate the handle values
+ in the command line to their new values after injection.
+
+ Handles that must be translated are those occuring in special file
+ names (see iobuf.c::check_special_filename) as well as those given
+ directly to options (see translate_sys2libc_fd_int). */
+
+/* For W32, we may have to translate handle values given on the
+ command line. */
+#define FD_TRANSLATE_MAX 8
+static struct
+{
+ int from;
+ int to;
+} fd_translate[8];
+
+/* Number of entries used in fd_translate. */
+static int fd_translate_len;
+
+
+/* Initialize the fd translation table. This reads one line from
+ stdin which is expected to be in the format "FROM TO [...]" where
+ each "FROM TO" pair are two handle numbers. Handle number FROM on
+ the command line is translated to handle number TO. */
+void
+translate_table_init (void)
+{
+#define TRANS_MAX 100
+ char line[TRANS_MAX + 1];
+ char *linep;
+ int idx;
+ int res;
+ int newl = 0;
+
+ /* We always read one line from stdin. */
+ for (idx = 0; idx < TRANS_MAX; idx++)
+ {
+ res = read (0, &line[idx], 1);
+ if (res != 1)
+ break;
+ if (line[idx] == '\n')
+ {
+ newl = 1;
+ break;
+ }
+ }
+ if (!newl)
+ {
+ char buf[1];
+ do
+ res = read (0, buf, 1);
+ while (res == 1 && *buf != '\n');
+ }
+
+ line[idx] = '\0';
+ linep = line;
+
+ /* Now start to read mapping pairs. */
+ for (idx = 0; idx < FD_TRANSLATE_MAX; idx++)
+ {
+ unsigned long from;
+ unsigned long to;
+ char *tail;
+
+ while (isspace (*linep))
+ linep++;
+ if (*linep == '\0')
+ break;
+ from = strtoul (linep, &tail, 0);
+ if (tail == NULL || ! (*tail == '\0' || isspace (*tail)))
+ break;
+ linep = tail;
+
+ while (isspace (*linep))
+ linep++;
+ if (*linep == '\0')
+ break;
+ to = strtoul (linep, &tail, 0);
+ if (tail == NULL || ! (*tail == '\0' || isspace (*tail)))
+ break;
+ linep = tail;
+
+ fd_translate[idx].from = from;
+ fd_translate[idx].to = to;
+ fd_translate_len++;
+ }
+}
+
+
+/* Translate a handle number. */
+int
+translate_table_lookup (int fd)
+{
+ int idx;
+
+ for (idx = 0; idx < fd_translate_len; idx++)
+ if (fd_translate[idx].from == fd)
+ return fd_translate[idx].to;
+ return fd;
+}
+
+
/* This function is a NOP for POSIX systems but required under Windows
as the file handles as returned by OS calls (like CreateFile) are
different from the libc file descriptors (like open). This function
@@ -303,6 +414,7 @@
#endif
}
+
/* This is the same as translate_sys2libc_fd but takes an integer
which is assumed to be such an system handle. */
int
@@ -312,8 +424,14 @@
if (fd <= 2)
return fd; /* Do not do this for error, stdin, stdout, stderr. */
+ /* Note: If this function is ever used in a different context than
+ option parsing in the main function, a variant that does not do
+ translation probable needs to be used. */
+ fd = translate_table_lookup (fd);
+
return translate_sys2libc_fd ((void*)fd, for_write);
#else
+ fd = translate_table_lookup (fd);
return fd;
#endif
}
Modified: trunk/common/sysutils.h
===================================================================
--- trunk/common/sysutils.h 2008-06-16 15:48:33 UTC (rev 4785)
+++ trunk/common/sysutils.h 2008-06-18 14:46:05 UTC (rev 4786)
@@ -43,6 +43,16 @@
const unsigned char *get_session_marker (size_t *rlen);
/*int check_permissions (const char *path,int extension,int checkonly);*/
void gnupg_sleep (unsigned int seconds);
+
+/* Initialize the fd translation table. This reads one line from
+ stdin which is expected to be in the format "FROM TO [...]" where
+ each "FROM TO" pair are two handle numbers. Handle number FROM on
+ the command line is translated to handle number TO. */
+void translate_table_init (void);
+
+/* Translate a handle number. */
+int translate_table_lookup (int fd);
+
int translate_sys2libc_fd (gnupg_fd_t fd, int for_write);
int translate_sys2libc_fd_int (int fd, int for_write);
FILE *gnupg_tmpfile (void);
More information about the Gnupg-commits
mailing list