aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/ChangeLog6
-rw-r--r--common/sysutils.c38
-rw-r--r--common/sysutils.h17
-rw-r--r--g10/ChangeLog6
-rw-r--r--g10/gpg.c10
-rw-r--r--g10/gpgv.c2
-rw-r--r--sm/ChangeLog7
-rw-r--r--sm/gpgsm.c2
-rw-r--r--sm/server.c35
9 files changed, 86 insertions, 37 deletions
diff --git a/common/ChangeLog b/common/ChangeLog
index 3d1f47160..7dd887cdc 100644
--- a/common/ChangeLog
+++ b/common/ChangeLog
@@ -1,3 +1,9 @@
+2007-07-12 Werner Koch <[email protected]>
+
+ * sysutils.h (gnupg_fd_t): New.
+ * sysutils.c (translate_sys2libc_fd): Use that type instead of int.
+ (translate_sys2libc_fd_int): New.
+
2007-07-09 Werner Koch <[email protected]>
* t-gettime.c (test_isotime2epoch): Use time_t and not u32.
diff --git a/common/sysutils.c b/common/sysutils.c
index 47031a152..6f6a9cbf4 100644
--- a/common/sysutils.c
+++ b/common/sysutils.c
@@ -278,24 +278,36 @@ gnupg_sleep (unsigned int seconds)
translates system file handles to libc file handles. FOR_WRITE
gives the direction of the handle. */
int
-translate_sys2libc_fd (int fd, int for_write)
+translate_sys2libc_fd (gnupg_fd_t fd, int for_write)
{
#ifdef HAVE_W32_SYSTEM
int x;
-
- if (fd <= 2)
- return fd; /* Do not do this for error, stdin, stdout, stderr.
- (This also ignores an fd of -1.) */
- x = _open_osfhandle (fd, for_write ? 1 : 0);
+ if (fd == GNUPG_INVALID_FD)
+ return -1;
+
+ /* Note that _open_osfhandle is currently defined to take and return
+ a long. */
+ x = _open_osfhandle ((long)fd, for_write ? 1 : 0);
if (x == -1)
log_error ("failed to translate osfhandle %p\n", (void *) fd);
- else
- {
-/* log_info ("_open_osfhandle %p yields %d%s\n", */
-/* (void*)fd, x, for_write? " for writing":"" ); */
- fd = x;
- }
-#endif /* HAVE_W32_SYSTEM */
+ return x;
+#else /*!HAVE_W32_SYSTEM */
return fd;
+#endif
+}
+
+/* This is the same as translate_sys2libc_fd but takes an integer
+ which is assumet to be such an system handle. */
+int
+translate_sys2libc_fd_int (int fd, int for_write)
+{
+#ifdef HAVE_W32_SYSTEM
+ if (fd <= 2)
+ return fd; /* Do not do this for error, stdin, stdout, stderr. */
+
+ return translate_sys2libc_fd ((void*)fd, for_write);
+#else
+ return fd;
+#endif
}
diff --git a/common/sysutils.h b/common/sysutils.h
index cc7a50d03..42bf58b9c 100644
--- a/common/sysutils.h
+++ b/common/sysutils.h
@@ -20,13 +20,28 @@
#ifndef GNUPG_COMMON_SYSUTILS_H
#define GNUPG_COMMON_SYSUTILS_H
+/* Because we use system handles and not libc low level file
+ descriptors on W32, we need to declare them as HANDLE (which
+ actually is a plain pointer). This is required to eventually
+ support 64 bits Windows systems. */
+#ifdef HAVE_W32_SYSTEM
+typedef void *gnupg_fd_t;
+#define GNUPG_INVALID_FD ((void*)(-1))
+#else
+typedef int gnupg_fd_t;
+#define GNUPG_INVALID_FD (-1)
+#endif
+
+
void trap_unaligned (void);
int disable_core_dumps (void);
int enable_core_dumps (void);
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);
-int translate_sys2libc_fd (int fd, int for_write);
+int translate_sys2libc_fd (gnupg_fd_t fd, int for_write);
+int translate_sys2libc_fd_int (int fd, int for_write);
+
#ifdef HAVE_W32_SYSTEM
diff --git a/g10/ChangeLog b/g10/ChangeLog
index 6c6e5afd3..86d1da562 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,9 @@
+2007-07-12 Werner Koch <[email protected]>
+
+ * gpg.c (main): Use translate_sys2libc_fd_int when passing an int
+ value.
+ * gpgv.c (main): Ditto.
+
2007-07-05 Werner Koch <[email protected]>
* card-util.c (card_generate_subkey, card_store_subkey): Enable
diff --git a/g10/gpg.c b/g10/gpg.c
index a8563821c..49c29c992 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -2160,19 +2160,19 @@ main (int argc, char **argv )
case oDebugLevel: debug_level = pargs.r.ret_str; break;
case oStatusFD:
- set_status_fd( translate_sys2libc_fd (pargs.r.ret_int, 1) );
+ set_status_fd( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
break;
case oStatusFile:
set_status_fd ( open_info_file (pargs.r.ret_str, 1) );
break;
case oAttributeFD:
- set_attrib_fd(translate_sys2libc_fd (pargs.r.ret_int, 1));
+ set_attrib_fd(translate_sys2libc_fd_int (pargs.r.ret_int, 1));
break;
case oAttributeFile:
set_attrib_fd ( open_info_file (pargs.r.ret_str, 1) );
break;
case oLoggerFD:
- log_set_fd (translate_sys2libc_fd (pargs.r.ret_int, 1));
+ log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
break;
case oLoggerFile:
logfile = pargs.r.ret_str;
@@ -2436,14 +2436,14 @@ main (int argc, char **argv )
set_passphrase_from_string(pargs.r.ret_str);
break;
case oPasswdFD:
- pwfd = translate_sys2libc_fd (pargs.r.ret_int, 0);
+ pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
break;
case oPasswdFile:
pwfd = open_info_file (pargs.r.ret_str, 0);
break;
case oPasswdRepeat: opt.passwd_repeat=pargs.r.ret_int; break;
case oCommandFD:
- opt.command_fd = translate_sys2libc_fd (pargs.r.ret_int, 0);
+ opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
break;
case oCommandFile:
opt.command_fd = open_info_file (pargs.r.ret_str, 0);
diff --git a/g10/gpgv.c b/g10/gpgv.c
index a2343ae85..9b1fe2aed 100644
--- a/g10/gpgv.c
+++ b/g10/gpgv.c
@@ -154,7 +154,7 @@ main( int argc, char **argv )
case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
case oStatusFD: set_status_fd( pargs.r.ret_int ); break;
case oLoggerFD:
- log_set_fd (translate_sys2libc_fd (pargs.r.ret_int, 1));
+ log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
break;
case oHomedir: opt.homedir = pargs.r.ret_str; break;
case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
diff --git a/sm/ChangeLog b/sm/ChangeLog
index d17afc615..2b0b820bb 100644
--- a/sm/ChangeLog
+++ b/sm/ChangeLog
@@ -1,3 +1,10 @@
+2007-07-12 Werner Koch <[email protected]>
+
+ * gpgsm.c (check_special_filename): Use translate_sys2libc_fd_int
+ when passing an int value.
+ * server.c (cmd_encrypt, cmd_decrypt, cmd_verify, cmd_import)
+ (cmd_export, cmd_message, cmd_genkey): Translate file descriptors.
+
2007-07-05 Werner Koch <[email protected]>
* Makefile.am (common_libs): Changed order of libs.
diff --git a/sm/gpgsm.c b/sm/gpgsm.c
index cf1ec4a30..4e880c814 100644
--- a/sm/gpgsm.c
+++ b/sm/gpgsm.c
@@ -1741,7 +1741,7 @@ check_special_filename (const char *fname, int for_write)
for (i=0; isdigit (fname[i]); i++ )
;
if ( !fname[i] )
- return translate_sys2libc_fd (atoi (fname), for_write);
+ return translate_sys2libc_fd_int (atoi (fname), for_write);
}
return -1;
}
diff --git a/sm/server.c b/sm/server.c
index 6f11b2734..f301dd301 100644
--- a/sm/server.c
+++ b/sm/server.c
@@ -29,6 +29,7 @@
#include <assuan.h>
#include "gpgsm.h"
+#include "sysutils.h"
#define set_error(e,t) assuan_set_error (ctx, gpg_error (e), (t))
@@ -409,14 +410,14 @@ cmd_encrypt (assuan_context_t ctx, char *line)
FILE *out_fp;
int rc;
- inp_fd = assuan_get_input_fd (ctx);
+ inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
if (inp_fd == -1)
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
- out_fd = assuan_get_output_fd (ctx);
+ out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
if (out_fd == -1)
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
- out_fp = fdopen ( dup(out_fd), "w");
+ out_fp = fdopen (dup (out_fd), "w");
if (!out_fp)
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
@@ -460,14 +461,14 @@ cmd_decrypt (assuan_context_t ctx, char *line)
FILE *out_fp;
int rc;
- inp_fd = assuan_get_input_fd (ctx);
+ inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
if (inp_fd == -1)
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
- out_fd = assuan_get_output_fd (ctx);
+ out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
if (out_fd == -1)
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
- out_fp = fdopen ( dup(out_fd), "w");
+ out_fp = fdopen (dup(out_fd), "w");
if (!out_fp)
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
rc = gpgsm_decrypt (ctrl, inp_fd, out_fp);
@@ -496,8 +497,8 @@ cmd_verify (assuan_context_t ctx, char *line)
{
int rc;
ctrl_t ctrl = assuan_get_pointer (ctx);
- int fd = assuan_get_input_fd (ctx);
- int out_fd = assuan_get_output_fd (ctx);
+ int fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
+ int out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
FILE *out_fp = NULL;
if (fd == -1)
@@ -538,10 +539,10 @@ cmd_sign (assuan_context_t ctx, char *line)
int detached;
int rc;
- inp_fd = assuan_get_input_fd (ctx);
+ inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
if (inp_fd == -1)
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
- out_fd = assuan_get_output_fd (ctx);
+ out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
if (out_fd == -1)
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
@@ -575,7 +576,7 @@ cmd_import (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
int rc;
- int fd = assuan_get_input_fd (ctx);
+ int fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
if (fd == -1)
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
@@ -653,7 +654,7 @@ cmd_export (assuan_context_t ctx, char *line)
}
else
{
- int fd = assuan_get_output_fd (ctx);
+ int fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
FILE *out_fp;
if (fd == -1)
@@ -733,12 +734,14 @@ static int
cmd_message (assuan_context_t ctx, char *line)
{
int rc;
+ assuan_fd_t sysfd;
int fd;
ctrl_t ctrl = assuan_get_pointer (ctx);
- rc = assuan_command_parse_fd (ctx, line, &fd);
+ rc = assuan_command_parse_fd (ctx, line, &sysfd);
if (rc)
return rc;
+ fd = translate_sys2libc_fd (sysfd, 0);
if (fd == -1)
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
ctrl->server_local->message_fd = fd;
@@ -785,7 +788,7 @@ do_listkeys (assuan_context_t ctx, char *line, int mode)
if (ctrl->server_local->list_to_output)
{
- int outfd = assuan_get_output_fd (ctx);
+ int outfd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
if ( outfd == -1 )
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
@@ -853,10 +856,10 @@ cmd_genkey (assuan_context_t ctx, char *line)
FILE *out_fp;
int rc;
- inp_fd = assuan_get_input_fd (ctx);
+ inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0);
if (inp_fd == -1)
return set_error (GPG_ERR_ASS_NO_INPUT, NULL);
- out_fd = assuan_get_output_fd (ctx);
+ out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1);
if (out_fd == -1)
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);