diff options
| author | Werner Koch <[email protected]> | 2025-10-07 17:03:10 +0200 |
|---|---|---|
| committer | Werner Koch <[email protected]> | 2025-10-07 17:03:10 +0200 |
| commit | 0b170a499a87abc4a18b6f7d76beb44901fa0cdd (patch) | |
| tree | 4eb915b74a5c011d8b95d9fd08c76323c46ae897 | |
| parent | Update NEWS (diff) | |
| download | libgpg-error-0b170a499a87abc4a18b6f7d76beb44901fa0cdd.tar.gz libgpg-error-0b170a499a87abc4a18b6f7d76beb44901fa0cdd.zip | |
estream: Extend the new share keyword to allow all modes.
* src/estream.c (X_SHARE_RW): Replace by ...
(X_SHARE_CUSTOM,X_SHARE_READ,X_SHARE_WRITE,X_SHARE_DEL): new.
(func_file_create_w32): Set share_mode accordingly.
(parse_mode): Extend the "share" keyword.
* src/gpg-error.c (main): Add option --openmode to allow testing of
the share modes.
--
Updates-commit: 2344947717d29170c918a195541db568648c7aa3
| -rw-r--r-- | src/estream.c | 51 | ||||
| -rw-r--r-- | src/gpg-error.c | 6 |
2 files changed, 42 insertions, 15 deletions
diff --git a/src/estream.c b/src/estream.c index 91216c2..f554bf8 100644 --- a/src/estream.c +++ b/src/estream.c @@ -162,7 +162,10 @@ #define X_POLLABLE (1 << 2) #define X_SEQUENTIAL (1 << 3) #define X_WIPE (1 << 4) -#define X_SHARE_RW (1 << 5) +#define X_SHARE_CUSTOM (1 << 5) +#define X_SHARE_READ (1 << 6) +#define X_SHARE_WRITE (1 << 7) +#define X_SHARE_DEL (1 << 8) /* Generally used types. */ @@ -2022,8 +2025,17 @@ func_file_create_w32 (void **cookie, HANDLE *rethd, const char *path, share_mode = FILE_SHARE_READ; } - if ((xflags & X_SHARE_RW)) - share_mode |= FILE_SHARE_READ | FILE_SHARE_WRITE; + /* Set custom share modes under Windows. */ + if ((xflags & X_SHARE_CUSTOM)) + { + share_mode = 0; + if ((xflags & X_SHARE_READ)) + share_mode |= FILE_SHARE_READ; + if ((xflags & X_SHARE_WRITE)) + share_mode |= FILE_SHARE_WRITE; + if ((xflags & X_SHARE_DEL)) + share_mode |= FILE_SHARE_DELETE; + } flags_and_attrs = 0; if ((xflags & X_SEQUENTIAL)) @@ -2126,10 +2138,12 @@ func_file_create_w32 (void **cookie, HANDLE *rethd, const char *path, * Indicate that the file will in general be access in sequential * way. On Windows FILE_FLAG_SEQUENTIAL_SCAN will thus be used. * - * share=rw + * share=[r][w][d][0] * - * Under Windows with "sysopen use FILE_SHARE_READ|FILE_SHARE_WRITE - * regardless of the open mode. + * Under Windows with the "sysopen" flag use FILE_SHARE_READ, + * FILE_SHARE_WRITE, or SHARE_MODE_DELETE depending on the given + * letters. If no letter or 0 is given, share mode 0 is used. The + * default is to use a share mode depending on the open mode. * * wipe * @@ -2275,15 +2289,24 @@ parse_mode (const char *modestr, } *r_xmode |= X_SEQUENTIAL; } - else if (!strncmp (modestr, "share=rw", 8)) + else if (!strncmp (modestr, "share=", 6)) { - modestr += 8; - if (*modestr && !strchr (" \t,", *modestr)) - { - _set_errno (EINVAL); - return -1; - } - *r_xmode |= X_SHARE_RW; + modestr += 6; + *r_xmode |= X_SHARE_CUSTOM; + for ( ; *modestr; modestr++) + switch (*modestr) + { + case 'w': *r_xmode |= X_SHARE_WRITE; break; + case 'r': *r_xmode |= X_SHARE_READ; break; + case 'd': *r_xmode |= X_SHARE_DEL; break; + case '0': *r_xmode &= ~(X_SHARE_READ|X_SHARE_WRITE|X_SHARE_DEL); + break; + case ' ': + case '\t': + _set_errno (EINVAL); + return -1; + default: break; /* Ignore other letters. */ + } } else if (!strncmp (modestr, "wipe", 4)) { diff --git a/src/gpg-error.c b/src/gpg-error.c index cb282b1..8562342 100644 --- a/src/gpg-error.c +++ b/src/gpg-error.c @@ -562,6 +562,7 @@ main (int argc, char *argv[]) CMD_LOCALE, CMD_GETREG, CMD_FOPEN, + OPT_OPENMODE, CMD_CHDIR, CMD_MKDIR }; @@ -590,6 +591,7 @@ main (int argc, char *argv[]) ARGPARSE_group (301, ("@\nOptions:\n ")), ARGPARSE_s_n (OPT_QUIET, "quiet", "Silence some output"), ARGPARSE_s_n (OPT_DESC, "desc", "Print with error description"), + ARGPARSE_s_s (OPT_OPENMODE, "openmode", "Specify the open mode"), ARGPARSE_end() }; gpgrt_argparse_t pargs = { &argc, &argv, ARGPARSE_FLAG_COMMAND }; @@ -605,6 +607,7 @@ main (int argc, char *argv[]) const char *s, *s2; const char *source_sym; const char *error_sym; + const char *openmode = "r,sysopen"; gpg_error_t err; gpgrt_init (); @@ -631,6 +634,7 @@ main (int argc, char *argv[]) case OPT_QUIET: quiet = 1; break; case OPT_DESC: desc = 1; break; + case OPT_OPENMODE: openmode = pargs.r.ret_str; break; default: pargs.err = ARGPARSE_PRINT_WARNING; break; } } @@ -703,7 +707,7 @@ main (int argc, char *argv[]) { gpgrt_stream_t fp; - fp = gpgrt_fopen (*argv, "r,sysopen"); + fp = gpgrt_fopen (*argv, openmode); if (!fp) log_error ("error opening '%s': %s\n", *argv, gpg_strerror (gpg_error_from_syserror ())); |
