mirror of
https://repo.or.cz/socat.git
synced 2025-05-22 21:02:41 +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
4
CHANGES
4
CHANGES
|
@ -41,6 +41,10 @@ Corrections:
|
|||
input lines. Changed Socat to explicitly print the newline in this
|
||||
case.
|
||||
|
||||
Fixed implementation of options o-creat, o-excl, and o-cloexec with
|
||||
POSIXMQ-* addresses.
|
||||
POSIXMQ addresses are no longer experimental.
|
||||
|
||||
Features:
|
||||
POSIXMQ-RECV now takes option o-nonblock; this, in combination with -T,
|
||||
makes it possible to terminate Socat in case the queue is empty.
|
||||
|
|
12
doc/socat.yo
12
doc/socat.yo
|
@ -779,8 +779,6 @@ label(ADDRESS_POSIXMQ_READ)dit(bf(tt(POSIXMQ-READ:/<mqueue>)))
|
|||
link(-U)(option_U) and link(dual addresses)(ADDRESS_DUAL).nl()
|
||||
Socat() provides this address type only on Linux because POSIX MQ is based
|
||||
on UNIX filedescriptors there.nl()
|
||||
This feature is new in version 1.8.0.0 and might change in the future,
|
||||
therefore it is link(experimental)(option_experimental).nl()
|
||||
Useful options:
|
||||
link(posixmq-priority)(OPTION_POSIXMQ_PRIORITY),
|
||||
link(unlink-early)(OPTION_UNLINK_EARLY),
|
||||
|
@ -793,7 +791,6 @@ dit(bf(tt(POSIXMQ-RECV:/<mqueue>)))
|
|||
This is a read-only address. See link(POSIXMQ-READ)(ADDRESS_POSIXMQ_READ)
|
||||
for more info.nl()
|
||||
Example: link(POSIX MQ recv with fork)(EXAMPLE_POSIXMQ_RECV_FORK)nl()
|
||||
This feature is link(experimental)(option_experimental).nl()
|
||||
Useful options:
|
||||
link(posixmq-priority)(OPTION_POSIXMQ_PRIORITY),
|
||||
link(fork)(OPTION_FORK),
|
||||
|
@ -806,7 +803,6 @@ label(ADDRESS_POSIXMQ_SEND)dit(bf(tt(POSIXMQ-SEND:/<mqueue>)))
|
|||
This is a write-only address. See link(POSIXMQ-READ)(ADDRESS_POSIXMQ_READ)
|
||||
for more info.nl()
|
||||
(link(Example)(EXAMPLE_POSIXMQ_SEND))nl()
|
||||
This feature is link(experimental)(option_experimental).nl()
|
||||
Useful options:
|
||||
link(posixmq-priority)(OPTION_POSIXMQ_PRIORITY),
|
||||
link(fork)(OPTION_FORK),
|
||||
|
@ -4458,14 +4454,14 @@ both devices. Use pppd on device tt(/var/run/ppp) then.
|
|||
label(EXAMPLE_POSIXMQ_SEND)
|
||||
mancommand(\.LP)
|
||||
mancommand(\.nf)
|
||||
mancommand(\fBsocat --experimental -u \\)
|
||||
mancommand(\fBsocat -u \\)
|
||||
mancommand(\.RS)
|
||||
mancommand(\fBSTDIO \\
|
||||
POSIXMQ-SEND:/queue1,unlink-early,mq-prio=10\fP)
|
||||
mancommand(\.RE)
|
||||
mancommand(\.fi)
|
||||
|
||||
htmlcommand(<hr><div class="shell">socat --experimental -u \
|
||||
htmlcommand(<hr><div class="shell">socat -u \
|
||||
STDIO \
|
||||
POSIXMQ-SEND:/queue1,unlink-early,mq-prio=10</div>)
|
||||
|
||||
|
@ -4477,7 +4473,7 @@ label(EXAMPLE_POSIXMQ_RECV_FORK)
|
|||
|
||||
mancommand(\.LP)
|
||||
mancommand(\.nf)
|
||||
mancommand(\fBsocat --experimental -u \\)
|
||||
mancommand(\fBsocat -u \\)
|
||||
mancommand(\.RS)
|
||||
mancommand(\fBPOSIXMQ-RECV:/queue1,fork,max-children=3 \\
|
||||
SYSTEM:"worker.sh"\fP)
|
||||
|
@ -4485,7 +4481,7 @@ mancommand(\fBPOSIXMQ-RECV:/queue1,fork,max-children=3 \\
|
|||
mancommand(\.RE)
|
||||
mancommand(\.fi)
|
||||
|
||||
htmlcommand(<hr><div class="shell">socat --experimental -u \
|
||||
htmlcommand(<hr><div class="shell">socat -u \
|
||||
POSIXMQ-RECV:/queue1,fork,max-children=3 \
|
||||
SYSTEM:"worker.sh"</div>)
|
||||
|
||||
|
|
62
test.sh
62
test.sh
|
@ -1038,7 +1038,7 @@ childprocess () {
|
|||
local l
|
||||
case "$1" in
|
||||
[1-9]*) ;;
|
||||
*) echo "childprocess \"$1\": not a number" >&2; exit 1 ;;
|
||||
*) echo "childprocess \"$1\": not a number" >&2; exit -1 ;;
|
||||
esac
|
||||
case "$UNAME" in
|
||||
AIX) l="$(ps -fade |grep "^........ ...... $(printf %6u $1)")" ;;
|
||||
|
@ -1065,7 +1065,7 @@ childpids () {
|
|||
if [ "X$1" = "X-r" ]; then recursive=1; shift; fi
|
||||
case "$1" in
|
||||
[1-9]*) ;;
|
||||
*) echo "childpids \"$1\": not a number" >&2; exit 1 ;;
|
||||
*) echo "childpids \"$1\": not a number" >&2; exit -1 ;;
|
||||
esac
|
||||
case "$UNAME" in
|
||||
AIX) l="$(ps -fade |grep "^........ ...... $(printf %6u $1)" |awk '{print($2);}')" ;;
|
||||
|
@ -16702,9 +16702,9 @@ te="$td/test$N.stderr"
|
|||
tdiff="$td/test$N.diff"
|
||||
da="test$N $(date) $RANDOM"
|
||||
tq=/test$N
|
||||
CMD0a="$TRACE $SOCAT --experimental $opts -u STDIO POSIXMQ-SEND:$tq,mq-prio=0,unlink-early"
|
||||
CMD0b="$TRACE $SOCAT --experimental $opts -u STDIO POSIXMQ-SEND:$tq,mq-prio=1"
|
||||
CMD1="$TRACE $SOCAT --experimental $opts -u POSIXMQ-READ:$tq,unlink-close STDIO"
|
||||
CMD0a="$TRACE $SOCAT $opts -u STDIO POSIXMQ-SEND:$tq,mq-prio=0,unlink-early"
|
||||
CMD0b="$TRACE $SOCAT $opts -u STDIO POSIXMQ-SEND:$tq,mq-prio=1"
|
||||
CMD1="$TRACE $SOCAT $opts -u POSIXMQ-READ:$tq,unlink-close STDIO"
|
||||
printf "test $F_n $TEST... " $N
|
||||
echo "$da 0" |$CMD0a 2>"${te}0a"
|
||||
rc0a=$?
|
||||
|
@ -16768,9 +16768,9 @@ te="$td/test$N.stderr"
|
|||
tdiff="$td/test$N.diff"
|
||||
da="test$N $(date) $RANDOM"
|
||||
tq=/test$N
|
||||
CMD0="$TRACE $SOCAT --experimental $opts -u POSIXMQ-RECV:$tq,unlink-early,fork STDIO"
|
||||
CMD1a="$TRACE $SOCAT --experimental $opts -u STDIO POSIXMQ-SEND:$tq"
|
||||
CMD1b="$TRACE $SOCAT --experimental $opts -u STDIO POSIXMQ-SEND:$tq,unlink-close"
|
||||
CMD0="$TRACE $SOCAT $opts -u POSIXMQ-RECV:$tq,unlink-early,fork STDIO"
|
||||
CMD1a="$TRACE $SOCAT $opts -u STDIO POSIXMQ-SEND:$tq"
|
||||
CMD1b="$TRACE $SOCAT $opts -u STDIO POSIXMQ-SEND:$tq,unlink-close"
|
||||
printf "test $F_n $TEST... " $N
|
||||
$CMD0 2>"${te}0" >"${tf}0" &
|
||||
pid0=$!
|
||||
|
@ -16837,9 +16837,9 @@ te="$td/test$N.stderr"
|
|||
tdiff="$td/test$N.diff"
|
||||
da="test$N $(date) $RANDOM"
|
||||
tq=/test$N
|
||||
CMD0="$TRACE $SOCAT --experimental $opts -u POSIXMQ-RECV:$tq,unlink-early,fork,max-children=1 SYSTEM:\"cat\ >>${tf}0;\ sleep\ 1\""
|
||||
CMD1a="$TRACE $SOCAT --experimental $opts -u STDIO POSIXMQ-SEND:$tq"
|
||||
CMD1b="$TRACE $SOCAT --experimental $opts -u STDIO POSIXMQ-SEND:$tq,unlink-close"
|
||||
CMD0="$TRACE $SOCAT $opts -u POSIXMQ-RECV:$tq,unlink-early,fork,max-children=1 SYSTEM:\"cat\ >>${tf}0;\ sleep\ 1\""
|
||||
CMD1a="$TRACE $SOCAT $opts -u STDIO POSIXMQ-SEND:$tq"
|
||||
CMD1b="$TRACE $SOCAT $opts -u STDIO POSIXMQ-SEND:$tq,unlink-close"
|
||||
printf "test $F_n $TEST... " $N
|
||||
eval $CMD0 2>"${te}0" >"${tf}0" &
|
||||
pid0=$!
|
||||
|
@ -16893,8 +16893,8 @@ NAME=POSIXMQ_SEND_MAXCHILDREN
|
|||
case "$TESTS" in
|
||||
*%$N%*|*%functions%*|*%fork%*|*%maxchildren%*|*%socket%*|*%posixmq%*|*%$NAME%*)
|
||||
TEST="$NAME: POSIX-MQ SEND with fork,max-children"
|
||||
# Start a POSIX-MQ receiver that creates a POSIX-MQ and transfers data from
|
||||
# there to an output file
|
||||
# Start a POSIX-MQ receiver that creates a POSIX-MQ and transfers data from it
|
||||
# to an output file
|
||||
# Run a POSIX-MQ sender that two times forks and invokes a data generator
|
||||
# for messages 1 and 3 in a shell process with some trailing sleep.
|
||||
# Afterwards write message 2 directly into output file; message 3 should be
|
||||
|
@ -16911,38 +16911,40 @@ te="$td/test$N.stderr"
|
|||
tdiff="$td/test$N.diff"
|
||||
da="test$N $(date) $RANDOM"
|
||||
tq=/test$N
|
||||
CMD0="$TRACE $SOCAT --experimental $opts -u POSIXMQ-READ:$tq,unlink-early STDIO"
|
||||
CMD1="$TRACE $SOCAT --experimental $opts -U POSIXMQ-SEND:$tq,fork,max-children=1,interval=0.1 SYSTEM:\"./socat\ --experimental\ -u\ POSIXMQ-RECV\:$tq-data\ -;\ sleep\ 1\""
|
||||
CMD1="$TRACE $SOCAT $opts -u POSIXMQ-READ:$tq,unlink-early STDIO"
|
||||
CMD2="$TRACE $SOCAT $opts -U POSIXMQ-SEND:$tq,fork,max-children=1,interval=0.1 SYSTEM:\"./socat\ -u\ POSIXMQ-RECV\:$tq-data\ -;\ sleep\ 1\""
|
||||
printf "test $F_n $TEST... " $N
|
||||
# create data for the generator
|
||||
echo "$da 1" |$SOCAT -u --experimental - POSIXMQ-SEND:$tq-data,unlink-early
|
||||
echo "$da 3" |$SOCAT -u --experimental - POSIXMQ-SEND:$tq-data
|
||||
eval $CMD0 2>"${te}0" >>"${tf}0" &
|
||||
pid0=$!
|
||||
relsleep 1
|
||||
eval $CMD1 2>"${te}1" &
|
||||
echo "$da 1" |$SOCAT -u - POSIXMQ-SEND:$tq-data,unlink-early 2>"${te}0a"
|
||||
echo "$da 3" |$SOCAT -u - POSIXMQ-SEND:$tq-data 2>"${te}0b"
|
||||
eval $CMD1 2>"${te}1" >>"${tf}1" &
|
||||
pid1=$!
|
||||
relsleep 1
|
||||
eval $CMD2 2>"${te}2" &
|
||||
pid2=$!
|
||||
sleep 0.5
|
||||
echo "$da 2" >>"${tf}0"
|
||||
echo "$da 2" >>"${tf}1"
|
||||
sleep 1 # as in SYSTEM
|
||||
kill $pid0 $(childpids $pid0) $pid1 $(childpids $pid1) 2>/dev/null
|
||||
kill $pid1 $(childpids $pid1) $pid2 $(childpids $pid2) 2>/dev/null
|
||||
wait 2>/dev/null
|
||||
$SOCAT -u --experimental /dev/null POSIXMQ-SEND:$tq-data,unlink-close
|
||||
if $ECHO "$da 1\n$da 2\n$da 3" |diff - ${tf}0 >${tdiff}0; then
|
||||
# remove the queues
|
||||
$SOCAT -u /dev/null POSIXMQ-SEND:$tq-data,unlink-close 2>"${te}3a"
|
||||
$SOCAT -u /dev/null POSIXMQ-SEND:$tq,unlink-close 2>"${te}3b"
|
||||
if $ECHO "$da 1\n$da 2\n$da 3" |diff - ${tf}1 >${tdiff}1; then
|
||||
$PRINTF "$OK\n"
|
||||
if [ "$VERBOSE" ]; then echo "$CMD0"; fi
|
||||
if [ "$DEBUG" ]; then cat "${te}0" >&2; fi
|
||||
if [ "$VERBOSE" ]; then echo "$CMD1"; fi
|
||||
if [ "$DEBUG" ]; then cat "${te}1" >&2; fi
|
||||
if [ "$VERBOSE" ]; then echo "$CMD2"; fi
|
||||
if [ "$DEBUG" ]; then cat "${te}2" >&2; fi
|
||||
ok
|
||||
else
|
||||
$PRINTF "$FAILED\n"
|
||||
echo "$CMD0"
|
||||
cat "${te}0" >&2
|
||||
echo "$CMD1"
|
||||
cat "${te}1" >&2
|
||||
echo "$CMD2"
|
||||
cat "${te}2" >&2
|
||||
echo "difference:" >&2
|
||||
cat ${tdiff}0 >&2
|
||||
cat ${tdiff}1 >&2
|
||||
failed
|
||||
fi
|
||||
fi # NUMCOND
|
||||
|
|
2
xio-fd.c
2
xio-fd.c
|
@ -31,7 +31,7 @@ const struct optdesc opt_o_noinherit = { "o-noinherit", "noinherit", OPT_O_NOINH
|
|||
const struct optdesc opt_o_noatime = { "o-noatime", "noatime", OPT_O_NOATIME, GROUP_OPEN|GROUP_FD, PH_FD, TYPE_BOOL, OFUNC_FCNTL, F_SETFL, O_NOATIME };
|
||||
#endif
|
||||
/****** for ALL addresses - with fcntl(F_SETFD) ******/
|
||||
const struct optdesc opt_cloexec = { "cloexec", NULL, OPT_CLOEXEC, GROUP_FD, PH_LATE, TYPE_BOOL, OFUNC_FCNTL, F_SETFD, FD_CLOEXEC };
|
||||
const struct optdesc opt_cloexec = { "cloexec", NULL, OPT_O_CLOEXEC, GROUP_FD, PH_LATE, TYPE_BOOL, OFUNC_FCNTL, F_SETFD, FD_CLOEXEC };
|
||||
/****** ftruncate() ******/
|
||||
/* this record is good for ftruncate() or ftruncate64() if available */
|
||||
#if HAVE_FTRUNCATE64
|
||||
|
|
|
@ -20,7 +20,7 @@ static int xioopen_open(int argc, const char *argv[], struct opt *opts, int xiof
|
|||
const struct optdesc opt_o_rdonly = { "o-rdonly", "rdonly", OPT_O_RDONLY, GROUP_OPEN, PH_OPEN, TYPE_BOOL, OFUNC_FLAG_PATTERN, O_RDONLY, O_ACCMODE };
|
||||
const struct optdesc opt_o_wronly = { "o-wronly", "wronly", OPT_O_WRONLY, GROUP_OPEN, PH_OPEN, TYPE_BOOL, OFUNC_FLAG_PATTERN, O_WRONLY, O_ACCMODE };
|
||||
const struct optdesc opt_o_rdwr = { "o-rdwr", "rdwr", OPT_O_RDWR, GROUP_OPEN, PH_OPEN, TYPE_BOOL, OFUNC_FLAG_PATTERN, O_RDWR, O_ACCMODE };
|
||||
const struct optdesc opt_o_create = { "o-create", "creat", OPT_O_CREATE, GROUP_OPEN, PH_OPEN, TYPE_BOOL, OFUNC_FLAG, O_CREAT };
|
||||
const struct optdesc opt_o_creat = { "o-creat", "creat", OPT_O_CREAT, GROUP_OPEN, PH_OPEN, TYPE_BOOL, OFUNC_FLAG, O_CREAT };
|
||||
const struct optdesc opt_o_excl = { "o-excl", "excl", OPT_O_EXCL, GROUP_OPEN, PH_OPEN, TYPE_BOOL, OFUNC_FLAG, O_EXCL };
|
||||
const struct optdesc opt_o_noctty = { "o-noctty", "noctty", OPT_O_NOCTTY, GROUP_OPEN, PH_OPEN, TYPE_BOOL, OFUNC_FLAG, O_NOCTTY };
|
||||
#ifdef O_SYNC
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
extern const struct optdesc opt_o_rdonly;
|
||||
extern const struct optdesc opt_o_wronly;
|
||||
extern const struct optdesc opt_o_rdwr;
|
||||
extern const struct optdesc opt_o_create;
|
||||
extern const struct optdesc opt_o_creat;
|
||||
extern const struct optdesc opt_o_excl;
|
||||
extern const struct optdesc opt_o_noctty;
|
||||
extern const struct optdesc opt_o_sync;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -799,7 +799,7 @@ int xiogetpacketinfo(struct single *sfd, int fd)
|
|||
PH_PASTSOCKET, PH_FD, PH_PREBIND, PH_BIND, PH_PASTBIND, PH_CONNECT,
|
||||
PH_CONNECTED, PH_LATE,
|
||||
OFUNC_OFFSET,
|
||||
OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_CLOEXEC
|
||||
OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_O_CLOEXEC
|
||||
Does not fork, does not retry.
|
||||
Alternate (alt) bind semantics are:
|
||||
with IP sockets: lowport (selects randomly a free port from 640 to 1023)
|
||||
|
@ -972,7 +972,7 @@ int _xioopen_connect(struct single *sfd, union sockaddr_union *us, size_t uslen,
|
|||
PH_PASTSOCKET, PH_FD, PH_PREBIND, PH_BIND, PH_PASTBIND, PH_CONNECT,
|
||||
PH_CONNECTED, PH_LATE,
|
||||
OFUNC_OFFSET,
|
||||
OPT_FORK, OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_CLOEXEC
|
||||
OPT_FORK, OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_O_CLOEXEC
|
||||
returns 0 on success.
|
||||
*/
|
||||
int xioopen_connect(struct single *sfd, union sockaddr_union *us, size_t uslen,
|
||||
|
@ -1072,7 +1072,7 @@ int xioopen_connect(struct single *sfd, union sockaddr_union *us, size_t uslen,
|
|||
applies and consumes the following option:
|
||||
PH_PASTSOCKET, PH_FD, PH_PREBIND, PH_BIND, PH_PASTBIND, PH_CONNECTED, PH_LATE
|
||||
OFUNC_OFFSET
|
||||
OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_CLOEXEC
|
||||
OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_O_CLOEXEC
|
||||
*/
|
||||
int _xioopen_dgram_sendto(/* them is already in xfd->peersa */
|
||||
union sockaddr_union *us, socklen_t uslen,
|
||||
|
|
|
@ -349,7 +349,7 @@ int xioopen_udp_sendto(
|
|||
applies and consumes the following option:
|
||||
PH_INIT, PH_PASTSOCKET, PH_FD, PH_PREBIND, PH_BIND, PH_PASTBIND, PH_CONNECTED, PH_LATE
|
||||
OFUNC_OFFSET
|
||||
OPT_BIND, OPT_SOURCEPORT, OPT_LOWPORT, OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_CLOEXEC
|
||||
OPT_BIND, OPT_SOURCEPORT, OPT_LOWPORT, OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_USER, OPT_GROUP, OPT_O_CLOEXEC
|
||||
*/
|
||||
int _xioopen_udp_sendto(const char *hostname, const char *servname,
|
||||
struct opt *opts,
|
||||
|
|
|
@ -675,7 +675,7 @@ static int xioopen_unix_client(
|
|||
PH_CONNECTED, PH_LATE, ?PH_CONNECT
|
||||
OFUNC_OFFSET,
|
||||
OPT_PROTOCOL_FAMILY, OPT_UNIX_TIGHTSOCKLEN, OPT_UNLINK_CLOSE, OPT_BIND,
|
||||
OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_CLOEXEC, OPT_USER, OPT_GROUP, ?OPT_FORK,
|
||||
OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_O_CLOEXEC, OPT_USER, OPT_GROUP, ?OPT_FORK,
|
||||
*/
|
||||
int
|
||||
_xioopen_unix_client(
|
||||
|
|
15
xioopts.c
15
xioopts.c
|
@ -352,7 +352,7 @@ const struct optname optionnames[] = {
|
|||
#endif /* SO_CKSUMRECV */
|
||||
/*IF_NAMED ("cleanup", &opt_cleanup)*/
|
||||
IF_TERMIOS("clocal", &opt_clocal)
|
||||
IF_ANY ("cloexec", &opt_cloexec)
|
||||
IF_ANY ("cloexec", &opt_cloexec)
|
||||
IF_ANY ("close", &opt_end_close)
|
||||
IF_OPENSSL("cn", &opt_openssl_commonname)
|
||||
IF_OPENSSL("commonname", &opt_openssl_commonname)
|
||||
|
@ -390,8 +390,8 @@ const struct optname optionnames[] = {
|
|||
# endif
|
||||
#endif /* defined(CRDLY) */
|
||||
IF_TERMIOS("cread", &opt_cread)
|
||||
IF_OPEN ("creat", &opt_o_create)
|
||||
IF_OPEN ("create", &opt_o_create)
|
||||
IF_OPEN ("creat", &opt_o_creat)
|
||||
IF_OPEN ("create", &opt_o_creat)
|
||||
IF_ANY ("crlf", &opt_crnl)
|
||||
IF_ANY ("crnl", &opt_crnl)
|
||||
IF_TERMIOS("crterase", &opt_echoe)
|
||||
|
@ -1135,8 +1135,8 @@ const struct optname optionnames[] = {
|
|||
#ifdef O_BINARY
|
||||
IF_OPEN ("o-binary", &opt_o_binary)
|
||||
#endif
|
||||
IF_OPEN ("o-creat", &opt_o_create)
|
||||
IF_OPEN ("o-create", &opt_o_create)
|
||||
IF_OPEN ("o-creat", &opt_o_creat)
|
||||
IF_OPEN ("o-create", &opt_o_creat)
|
||||
#ifdef O_DEFER
|
||||
IF_OPEN ("o-defer", &opt_o_defer)
|
||||
#endif
|
||||
|
@ -1194,7 +1194,8 @@ const struct optname optionnames[] = {
|
|||
#endif
|
||||
IF_OPEN ("o-trunc", &opt_o_trunc)
|
||||
IF_OPEN ("o-wronly", &opt_o_wronly)
|
||||
IF_OPEN ("o_create", &opt_o_create)
|
||||
IF_OPEN ("o_creat", &opt_o_creat)
|
||||
IF_OPEN ("o_create", &opt_o_creat)
|
||||
#ifdef O_DEFER
|
||||
IF_OPEN ("o_defer", &opt_o_defer)
|
||||
#endif
|
||||
|
@ -4230,7 +4231,7 @@ int applyopts_cloexec(int fd, struct opt *opts) {
|
|||
|
||||
if (!opts) return 0;
|
||||
|
||||
retropt_bool(opts, OPT_CLOEXEC, &docloexec);
|
||||
retropt_bool(opts, OPT_O_CLOEXEC, &docloexec);
|
||||
if (docloexec) {
|
||||
if (Fcntl_l(fd, F_SETFD, FD_CLOEXEC) < 0) {
|
||||
Warn2("fcntl(%d, F_SETFD, FD_CLOEXEC): %s", fd, strerror(errno));
|
||||
|
|
|
@ -272,7 +272,6 @@ enum e_optcode {
|
|||
OPT_CHROOT_EARLY, /* chroot() before file system access */
|
||||
/*OPT_CIBAUD,*/ /* termios.c_cflag */
|
||||
OPT_CLOCAL, /* termios.c_cflag */
|
||||
OPT_CLOEXEC,
|
||||
OPT_CONNECT_TIMEOUT, /* socket connect */
|
||||
OPT_COOL_WRITE,
|
||||
OPT_CR, /* customized */
|
||||
|
@ -555,7 +554,8 @@ enum e_optcode {
|
|||
OPT_O_ASYNC,
|
||||
#endif
|
||||
OPT_O_BINARY, /* Cygwin */
|
||||
OPT_O_CREATE,
|
||||
OPT_O_CLOEXEC,
|
||||
OPT_O_CREAT,
|
||||
#ifdef O_DEFER
|
||||
OPT_O_DEFER,
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue