aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2025-10-07 17:03:10 +0200
committerWerner Koch <[email protected]>2025-10-07 17:03:10 +0200
commit0b170a499a87abc4a18b6f7d76beb44901fa0cdd (patch)
tree4eb915b74a5c011d8b95d9fd08c76323c46ae897
parentUpdate NEWS (diff)
downloadlibgpg-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.c51
-rw-r--r--src/gpg-error.c6
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 ()));