diff options
author | Werner Koch <wk@gnupg.org> | 2010-03-08 18:05:37 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2010-03-08 18:05:37 +0100 |
commit | 40a78fab0c224bfb92097a6d7f93c0893740d190 (patch) | |
tree | 3d8b2bb9ad0346fa80f04cf7bab3181d55bff31e /common | |
parent | More cleanups (diff) | |
download | gnupg2-40a78fab0c224bfb92097a6d7f93c0893740d190.tar.xz gnupg2-40a78fab0c224bfb92097a6d7f93c0893740d190.zip |
Use macros for iobuf ioctls.
Diffstat (limited to 'common')
-rw-r--r-- | common/ChangeLog | 10 | ||||
-rw-r--r-- | common/iobuf.c | 99 | ||||
-rw-r--r-- | common/iobuf.h | 27 |
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 )? \ |