mirror of
https://repo.or.cz/socat.git
synced 2025-07-13 07:03:25 +00:00
Fixed o-creat, o-excl, and o-cloexec with POSIXMQ-*
This commit is contained in:
parent
25d2f746d9
commit
1ea37d48c2
12 changed files with 83 additions and 68 deletions
|
@ -20,10 +20,10 @@ static int _posixmq_unlink(const char *name, int level);
|
|||
|
||||
static int xioopen_posixmq(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, const struct addrdesc *addrdesc);
|
||||
|
||||
const struct addrdesc xioaddr_posixmq_bidir = { "POSIXMQ-BIDIRECTIONAL", 1+XIO_RDWR, xioopen_posixmq, GROUP_FD|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY, XIO_RDWR, 0, 0 HELP(":<mqname>") };
|
||||
const struct addrdesc xioaddr_posixmq_read = { "POSIXMQ-READ", 1+XIO_RDONLY, xioopen_posixmq, GROUP_FD|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY, XIO_RDONLY, 0, 0 HELP(":<mqname>") };
|
||||
const struct addrdesc xioaddr_posixmq_receive = { "POSIXMQ-RECEIVE", 1+XIO_RDONLY, xioopen_posixmq, GROUP_FD|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY|GROUP_CHILD, XIO_RDONLY, XIOREAD_RECV_ONESHOT, 0 HELP(":<mqname>") };
|
||||
const struct addrdesc xioaddr_posixmq_send = { "POSIXMQ-SEND", 1+XIO_WRONLY, xioopen_posixmq, GROUP_FD|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY|GROUP_CHILD, XIO_WRONLY, 0, 0 HELP(":<mqname>") };
|
||||
const struct addrdesc xioaddr_posixmq_bidir = { "POSIXMQ-BIDIRECTIONAL", 1+XIO_RDWR, xioopen_posixmq, GROUP_FD|GROUP_OPEN|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY, XIO_RDWR, 0, 0 HELP(":<mqname>") };
|
||||
const struct addrdesc xioaddr_posixmq_read = { "POSIXMQ-READ", 1+XIO_RDONLY, xioopen_posixmq, GROUP_FD|GROUP_OPEN|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY, XIO_RDONLY, 0, 0 HELP(":<mqname>") };
|
||||
const struct addrdesc xioaddr_posixmq_receive = { "POSIXMQ-RECEIVE", 1+XIO_RDONLY, xioopen_posixmq, GROUP_FD|GROUP_OPEN|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY|GROUP_CHILD, XIO_RDONLY, XIOREAD_RECV_ONESHOT, 0 HELP(":<mqname>") };
|
||||
const struct addrdesc xioaddr_posixmq_send = { "POSIXMQ-SEND", 1+XIO_WRONLY, xioopen_posixmq, GROUP_FD|GROUP_OPEN|GROUP_NAMED|GROUP_POSIXMQ|GROUP_RETRY|GROUP_CHILD, XIO_WRONLY, 0, 0 HELP(":<mqname>") };
|
||||
|
||||
const struct optdesc opt_posixmq_priority = { "posixmq-priority", "mq-prio", OPT_POSIXMQ_PRIORITY, GROUP_POSIXMQ, PH_INIT, TYPE_BOOL, OFUNC_OFFSET, XIO_OFFSETOF(para.posixmq.prio), XIO_SIZEOF(para.posixmq.prio), 0 };
|
||||
const struct optdesc opt_posixmq_flush = { "posixmq-flush", "mq-flush", OPT_POSIXMQ_FLUSH, GROUP_POSIXMQ, PH_EARLY, TYPE_BOOL, OFUNC_SPEC, 0, 0, 0 };
|
||||
|
@ -52,7 +52,11 @@ static int xioopen_posixmq(
|
|||
struct mq_attr attr = { 0 };
|
||||
bool setopts = false;
|
||||
int oflag;
|
||||
bool opt_o_creat = true;
|
||||
bool opt_o_excl = false;
|
||||
#ifdef O_CLOEXEC
|
||||
bool opt_o_cloexec = true;
|
||||
#endif
|
||||
mode_t opt_mode = 0666;
|
||||
mqd_t mqd;
|
||||
int _errno;
|
||||
|
@ -61,10 +65,6 @@ static int xioopen_posixmq(
|
|||
bool with_intv = false;
|
||||
int result = 0;
|
||||
|
||||
if (!xioparms.experimental) {
|
||||
Error1("%s: use option --experimental to acknowledge unmature state", argv[0]);
|
||||
return STAT_NORETRY;
|
||||
}
|
||||
if (argc != 2) {
|
||||
xio_syntax(argv[0], 1, argc-1, addrdesc->syntax);
|
||||
return STAT_NORETRY;
|
||||
|
@ -83,7 +83,10 @@ static int xioopen_posixmq(
|
|||
with_intv = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (dirs == XIO_RDWR) {
|
||||
/* Bidirectional ADDRESS in unidirectional mode? Adapt dirs */
|
||||
dirs = (xioflags & XIO_ACCMODE);
|
||||
}
|
||||
retropt_int(opts, OPT_MAX_CHILDREN, &maxchildren);
|
||||
if (! dofork && maxchildren) {
|
||||
Error("option max-children not allowed without option fork");
|
||||
|
@ -100,8 +103,12 @@ static int xioopen_posixmq(
|
|||
Error1("strdup(\"%s\"): out of memory", name);
|
||||
}
|
||||
|
||||
retropt_bool(opts, OPT_O_EXCL, &opt_o_excl);
|
||||
retropt_mode(opts, OPT_PERM, &opt_mode);
|
||||
retropt_bool(opts, OPT_O_CREAT, &opt_o_creat);
|
||||
retropt_bool(opts, OPT_O_EXCL, &opt_o_excl);
|
||||
#ifdef O_CLOEXEC
|
||||
retropt_bool(opts, OPT_O_CLOEXEC, &opt_o_cloexec);
|
||||
#endif
|
||||
retropt_mode(opts, OPT_PERM, &opt_mode);
|
||||
retropt_bool(opts, OPT_POSIXMQ_FLUSH, &flush);
|
||||
retropt_long(opts, OPT_POSIXMQ_MAXMSG, &attr.mq_maxmsg) ||
|
||||
(setopts = true);
|
||||
|
@ -154,8 +161,12 @@ static int xioopen_posixmq(
|
|||
sfd->howtoend = END_CLOSE;
|
||||
sfd->dtype = XIODATA_POSIXMQ | oneshot;
|
||||
|
||||
oflag = O_CREAT;
|
||||
if (opt_o_excl) oflag |= O_EXCL;
|
||||
oflag = 0;
|
||||
if (opt_o_creat) oflag |= O_CREAT;
|
||||
if (opt_o_excl) oflag |= O_EXCL;
|
||||
#ifdef O_CLOEXEC
|
||||
if (opt_o_cloexec) oflag |= O_CLOEXEC; /* does not seem to work (Ubuntu-20) */
|
||||
#endif
|
||||
switch (dirs) {
|
||||
case XIO_RDWR: oflag |= O_RDWR; break;
|
||||
case XIO_RDONLY: oflag |= O_RDONLY; break;
|
||||
|
@ -185,6 +196,7 @@ static int xioopen_posixmq(
|
|||
errno = _errno;
|
||||
return STAT_RETRYLATER;
|
||||
}
|
||||
/* applyopts_cloexec(mqd, opts); */ /* does not seem to work too (Ubuntu-20) */
|
||||
sfd->fd = mqd;
|
||||
|
||||
Debug1("mq_getattr(%d, ...)", mqd);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue