summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2010-03-08 18:05:37 +0100
committerWerner Koch <wk@gnupg.org>2010-03-08 18:05:37 +0100
commit40a78fab0c224bfb92097a6d7f93c0893740d190 (patch)
tree3d8b2bb9ad0346fa80f04cf7bab3181d55bff31e /common
parentMore cleanups (diff)
downloadgnupg2-40a78fab0c224bfb92097a6d7f93c0893740d190.tar.xz
gnupg2-40a78fab0c224bfb92097a6d7f93c0893740d190.zip
Use macros for iobuf ioctls.
Diffstat (limited to 'common')
-rw-r--r--common/ChangeLog10
-rw-r--r--common/iobuf.c99
-rw-r--r--common/iobuf.h27
3 files changed, 66 insertions, 70 deletions
diff --git a/common/ChangeLog b/common/ChangeLog
index 388b6de47..7408123ec 100644
--- a/common/ChangeLog
+++ b/common/ChangeLog
@@ -1,5 +1,13 @@
2010-03-08 Werner Koch <wk@g10code.com>
+ * iobuf.h (iobuf_ioctl_t): New. Use the new macros instead of the
+ hard wired values.
+ * iobuf.c (iobuf_append): Remove.
+ (iobuf_fdopen): Factor code out to ...
+ (do_iobuf_fdopen): ... new.
+ (iobuf_fdopen_nc): New.
+ (iobuf_open_fd_or_name): Implement using iobuf_fdopen_nc.
+
* iobuf.c (INVALID_FD): Replace by GNUPG_INVALID_FD.
(fp_or_fd_t): Replace by gnupg_fd_t.
(my_fileno): Replace by the FD2INT macro.
@@ -250,7 +258,7 @@
* iobuf.c: Port David's changes from 1.4:
(fd_cache_invalidate): Pass return code from close back.
- (direct_open, iobuf_ioctl): Check that eturn value.
+ (direct_open, iobuf_ioctl): Check that return value.
(fd_cache_synchronize): New.
(iobuf_ioctl): Add new sub command 4 (fsync).
diff --git a/common/iobuf.c b/common/iobuf.c
index 759a49889..87af2868f 100644
--- a/common/iobuf.c
+++ b/common/iobuf.c
@@ -1159,15 +1159,7 @@ iobuf_open_fd_or_name (gnupg_fd_t fd, const char *fname, const char *mode)
if (fd == -1)
a = iobuf_open (fname);
else
- {
- int fd2;
-
- fd2 = dup (fd);
- if (fd2 == -1)
- a = NULL;
- else
- a = iobuf_fdopen (fd2, mode);
- }
+ a = iobuf_fdopen_nc (fd, mode);
return a;
}
@@ -1214,36 +1206,50 @@ iobuf_open (const char *fname)
return a;
}
-/****************
- * Create a head iobuf for reading or writing from/to a file
- * Returns: NULL if an error occures and sets ERRNO.
- */
-iobuf_t
-iobuf_fdopen (int fd, const char *mode)
+
+static iobuf_t
+do_iobuf_fdopen (int fd, const char *mode, int keep_open)
{
iobuf_t a;
gnupg_fd_t fp;
file_filter_ctx_t *fcx;
size_t len;
- fp = (gnupg_fd_t) fd;
+ fp = INT2FD (fd);
a = iobuf_alloc (strchr (mode, 'w') ? 2 : 1, IOBUF_BUFFER_SIZE);
fcx = xmalloc (sizeof *fcx + 20);
fcx->fp = fp;
fcx->print_only_name = 1;
+ fcx->keep_open = keep_open;
sprintf (fcx->fname, "[fd %d]", fd);
a->filter = file_filter;
a->filter_ov = fcx;
file_filter (fcx, IOBUFCTRL_DESC, NULL, (byte *) & a->desc, &len);
file_filter (fcx, IOBUFCTRL_INIT, NULL, NULL, &len);
if (DBG_IOBUF)
- log_debug ("iobuf-%d.%d: fdopen `%s'\n", a->no, a->subno, fcx->fname);
- iobuf_ioctl (a, 3, 1, NULL); /* disable fd caching */
+ log_debug ("iobuf-%d.%d: fdopen%s `%s'\n",
+ a->no, a->subno, keep_open? "_nc":"", fcx->fname);
+ iobuf_ioctl (a, IOBUF_IOCTL_NO_CACHE, 1, NULL);
return a;
}
+/* Create a head iobuf for reading or writing from/to a file Returns:
+ * NULL and sets ERRNO if an error occured. */
+iobuf_t
+iobuf_fdopen (int fd, const char *mode)
+{
+ return do_iobuf_fdopen (fd, mode, 0);
+}
+
+iobuf_t
+iobuf_fdopen_nc (int fd, const char *mode)
+{
+ return do_iobuf_fdopen (fd, mode, 1);
+}
+
+
iobuf_t
iobuf_sockopen (int fd, const char *mode)
{
@@ -1263,7 +1269,7 @@ iobuf_sockopen (int fd, const char *mode)
sock_filter (scx, IOBUFCTRL_INIT, NULL, NULL, &len);
if (DBG_IOBUF)
log_debug ("iobuf-%d.%d: sockopen `%s'\n", a->no, a->subno, scx->fname);
- iobuf_ioctl (a, 3, 1, NULL); /* disable fd caching */
+ iobuf_ioctl (a, IOBUF_IOCTL_NO_CACHE, 1, NULL);
#else
a = iobuf_fdopen (fd, mode);
#endif
@@ -1311,40 +1317,6 @@ iobuf_create (const char *fname)
return a;
}
-/****************
- * append to an iobuf; if the file does not exist, create it.
- * cannot be used for stdout.
- * Note: This is not used.
- */
-#if 0 /* not used */
-iobuf_t
-iobuf_append (const char *fname)
-{
- iobuf_t a;
- FILE *fp;
- file_filter_ctx_t *fcx;
- size_t len;
-
- if (!fname)
- return NULL;
- else if (!(fp = direct_open (fname, "ab")))
- return NULL;
- a = iobuf_alloc (2, IOBUF_BUFFER_SIZE);
- fcx = m_alloc (sizeof *fcx + strlen (fname));
- fcx->fp = fp;
- strcpy (fcx->fname, fname);
- a->real_fname = m_strdup (fname);
- a->filter = file_filter;
- a->filter_ov = fcx;
- file_filter (fcx, IOBUFCTRL_DESC, NULL, (byte *) & a->desc, &len);
- file_filter (fcx, IOBUFCTRL_INIT, NULL, NULL, &len);
- if (DBG_IOBUF)
- log_debug ("iobuf-%d.%d: append `%s'\n", a->no, a->subno,
- a->desc?a->desc:"?");
-
- return a;
-}
-#endif
iobuf_t
iobuf_openrw (const char *fname)
@@ -1376,12 +1348,15 @@ iobuf_openrw (const char *fname)
int
-iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval)
+iobuf_ioctl (iobuf_t a, iobuf_ioctl_t cmd, int intval, void *ptrval)
{
- if (cmd == 1)
- { /* keep system filepointer/descriptor open */
+ if (cmd == IOBUF_IOCTL_KEEP_OPEN)
+ {
+ /* Keep system filepointer/descriptor open. This was used in
+ the past by http.c; this ioctl is not directly used
+ anymore. */
if (DBG_IOBUF)
- log_debug ("iobuf-%d.%d: ioctl `%s' keep=%d\n",
+ log_debug ("iobuf-%d.%d: ioctl `%s' keep_open=%d\n",
a ? a->no : -1, a ? a->subno : -1,
a && a->desc ? a->desc : "?",
intval);
@@ -1401,8 +1376,8 @@ iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval)
}
#endif
}
- else if (cmd == 2)
- { /* invalidate cache */
+ else if (cmd == IOBUF_IOCTL_INVALIDATE_CACHE)
+ {
if (DBG_IOBUF)
log_debug ("iobuf-*.*: ioctl `%s' invalidate\n",
ptrval ? (char *) ptrval : "?");
@@ -1413,8 +1388,8 @@ iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval)
return 0;
}
}
- else if (cmd == 3)
- { /* disallow/allow caching */
+ else if (cmd == IOBUF_IOCTL_NO_CACHE)
+ {
if (DBG_IOBUF)
log_debug ("iobuf-%d.%d: ioctl `%s' no_cache=%d\n",
a ? a->no : -1, a ? a->subno : -1,
@@ -1436,7 +1411,7 @@ iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval)
}
#endif
}
- else if (cmd == 4)
+ else if (cmd == IOBUF_IOCTL_FSYNC)
{
/* Do a fsync on the open fd and return any errors to the caller
of iobuf_ioctl. Note that we work on a file name here. */
diff --git a/common/iobuf.h b/common/iobuf.h
index 936481fc1..1d863fdcd 100644
--- a/common/iobuf.h
+++ b/common/iobuf.h
@@ -1,5 +1,6 @@
/* iobuf.h - I/O buffer
- * Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ * 2010 Free Software Foundation, Inc.
*
* This file is part of GNUPG.
*
@@ -25,7 +26,7 @@
#define DBG_IOBUF iobuf_debug_mode
-
+/* Filter control modes. */
#define IOBUFCTRL_INIT 1
#define IOBUFCTRL_FREE 2
#define IOBUFCTRL_UNDERFLOW 3
@@ -34,6 +35,17 @@
#define IOBUFCTRL_CANCEL 6
#define IOBUFCTRL_USER 16
+
+/* Command codes for iobuf_ioctl. */
+typedef enum
+ {
+ IOBUF_IOCTL_KEEP_OPEN = 1, /* Uses intval. */
+ IOBUF_IOCTL_INVALIDATE_CACHE = 2, /* Uses ptrval. */
+ IOBUF_IOCTL_NO_CACHE = 3, /* Uses intval. */
+ IOBUF_IOCTL_FSYNC = 4 /* Uses ptrval. */
+ } iobuf_ioctl_t;
+
+
typedef struct iobuf_struct *iobuf_t;
typedef struct iobuf_struct *IOBUF; /* Compatibility with gpg 1.4. */
@@ -89,11 +101,12 @@ iobuf_t iobuf_open_fd_or_name (gnupg_fd_t fd, const char *fname,
const char *mode);
iobuf_t iobuf_open (const char *fname);
iobuf_t iobuf_fdopen (int fd, const char *mode);
+iobuf_t iobuf_fdopen_nc (int fd, const char *mode);
iobuf_t iobuf_sockopen (int fd, const char *mode);
iobuf_t iobuf_create (const char *fname);
iobuf_t iobuf_append (const char *fname);
iobuf_t iobuf_openrw (const char *fname);
-int iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval);
+int iobuf_ioctl (iobuf_t a, iobuf_ioctl_t cmd, int intval, void *ptrval);
int iobuf_close (iobuf_t iobuf);
int iobuf_cancel (iobuf_t iobuf);
@@ -140,10 +153,10 @@ void iobuf_set_partial_block_mode (iobuf_t a, size_t len);
void iobuf_skip_rest (iobuf_t a, unsigned long n, int partial);
-/* get a byte form the iobuf; must check for eof prior to this function
- * this function returns values in the range 0 .. 255 or -1 to indicate EOF
- * iobuf_get_noeof() does not return -1 to indicate EOF, but masks the
- * returned value to be in the range 0 ..255.
+/* Get a byte from the iobuf; must check for eof prior to this
+ * function. This function returns values in the range 0 .. 255 or -1
+ * to indicate EOF. iobuf_get_noeof() does not return -1 to indicate
+ * EOF, but masks the returned value to be in the range 0 .. 255.
*/
#define iobuf_get(a) \
( ((a)->nofast || (a)->d.start >= (a)->d.len )? \