aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/sysutils.c32
-rw-r--r--common/sysutils.h3
-rw-r--r--tools/gpgtar.c31
3 files changed, 15 insertions, 51 deletions
diff --git a/common/sysutils.c b/common/sysutils.c
index 042387297..5dfbb72e7 100644
--- a/common/sysutils.c
+++ b/common/sysutils.c
@@ -584,20 +584,11 @@ translate_sys2libc_fd_int (int fd, int for_write)
* (2) Integer representation (by %d of printf).
* (3) Hex representation which starts as "0x".
*
- * FOR_WRITE is 1 for a file for writing, 0 otherwise.
- *
- * There are two use cases for the function:
- *
- * - R_HD != NULL, R_FD == NULL:
- * Return the value in *R_HD.
- *
- * - R_HD == NULL, R_FD != NULL:
- * Return the value in *R_FD, after translating to a file descriptor.
+ * Then, fill R_SYSHD, according to the value of a file reference.
*
*/
gpg_error_t
-gnupg_sys2libc_fdstr (const char *fdstr, int for_write,
- gnupg_fd_t *r_hd, int *r_fd)
+gnupg_parse_fdstr (const char *fdstr, es_syshd_t *r_syshd)
{
int fd = -1;
#ifdef HAVE_W32_SYSTEM
@@ -614,10 +605,8 @@ gnupg_sys2libc_fdstr (const char *fdstr, int for_write,
if (fd >= 0)
{
- if (r_hd)
- *r_hd = (gnupg_fd_t)(uintptr_t)fd;
- else if (r_fd)
- *r_fd = fd;
+ r_syshd->type = ES_SYSHD_FD;
+ r_syshd->u.fd = fd;
return 0;
}
@@ -638,18 +627,13 @@ gnupg_sys2libc_fdstr (const char *fdstr, int for_write,
if (errno != 0 || endptr == fdstr || *endptr != '\0')
return gpg_error (GPG_ERR_INV_ARG);
- if (r_hd)
- *r_hd = hd;
- else if (r_fd)
- *r_fd = translate_sys2libc_fd (hd, for_write);
+ r_syshd->type = ES_SYSHD_HANDLE;
+ r_syshd->u.handle = hd;
return 0;
#else
- (void)for_write;
fd = atoi (fdstr);
- if (r_hd)
- *r_hd = fd;
- else if (r_fd)
- *r_fd = fd;
+ r_syshd->type = ES_SYSHD_FD;
+ r_syshd->u.fd = fd;
return 0;
#endif
}
diff --git a/common/sysutils.h b/common/sysutils.h
index 95cbc0bec..7fd01bae1 100644
--- a/common/sysutils.h
+++ b/common/sysutils.h
@@ -74,8 +74,7 @@ void gnupg_sleep (unsigned int seconds);
void gnupg_usleep (unsigned int usecs);
int translate_sys2libc_fd (gnupg_fd_t fd, int for_write);
int translate_sys2libc_fd_int (int fd, int for_write);
-gpg_error_t gnupg_sys2libc_fdstr (const char *fdstr, int for_write,
- gnupg_fd_t *r_hd, int *r_fd);
+gpg_error_t gnupg_parse_fdstr (const char *fdstr, es_syshd_t *r_syshd);
int check_special_filename (const char *fname, int for_write, int notranslate);
FILE *gnupg_tmpfile (void);
void gnupg_reopen_std (const char *pgmname);
diff --git a/tools/gpgtar.c b/tools/gpgtar.c
index 01efacc7d..ace5e5978 100644
--- a/tools/gpgtar.c
+++ b/tools/gpgtar.c
@@ -511,49 +511,30 @@ main (int argc, char **argv)
* status fd is passed verbatim to gpg. */
if (opt.status_fd)
{
- int fd = -1;
+ es_syshd_t syshd;
-#ifdef HAVE_W32_SYSTEM
- gnupg_fd_t hd;
-
- err = gnupg_sys2libc_fdstr (opt.status_fd, 1, &hd, NULL);
- if ((uintptr_t)hd == 1)
- fd = 1;
- else if ((uintptr_t)hd == 2)
- fd = 2;
-#else
- err = gnupg_sys2libc_fdstr (opt.status_fd, 1, NULL, &fd);
-#endif
+ err = gnupg_parse_fdstr (opt.status_fd, &syshd);
if (err)
log_fatal ("status-fd is invalid: %s\n", gpg_strerror (err));
- if (fd == 1)
+ if (syshd.type == ES_SYSHD_FD && syshd.u.fd == 1)
{
opt.status_stream = es_stdout;
if (!skip_crypto)
log_fatal ("using stdout for the status-fd is not possible\n");
}
- else if (fd == 2)
+ else if (syshd.type == ES_SYSHD_FD && syshd.u.fd == 2)
opt.status_stream = es_stderr;
else
{
- es_syshd_t syshd;
-
-#ifdef HAVE_W32_SYSTEM
- syshd.type = ES_SYSHD_HANDLE;
- syshd.u.handle = hd;
-#else
- syshd.type = ES_SYSHD_FD;
- syshd.u.fd = fd;
-#endif
opt.status_stream = es_sysopen (&syshd, "w");
if (opt.status_stream)
es_setvbuf (opt.status_stream, NULL, _IOLBF, 0);
}
if (!opt.status_stream)
{
- log_fatal ("can't open fd %d for status output: %s\n",
- fd, strerror (errno));
+ log_fatal ("can't open fd %s for status output: %s\n",
+ opt.status_fd, strerror (errno));
}
}