1
0
Fork 0
mirror of https://repo.or.cz/socat.git synced 2025-06-18 06:46:51 +00:00

Added options posixmq-maxmsg and posixmq-msgsize

This commit is contained in:
Gerhard Rieger 2024-09-10 20:16:36 +02:00
parent 663a6bb012
commit 25d2f746d9
7 changed files with 79 additions and 10 deletions

View file

@ -49,6 +49,9 @@ Features:
queue before starting to transfer data. queue before starting to transfer data.
Test: LINUX_POSIXMQ_FLUSH Test: LINUX_POSIXMQ_FLUSH
New options posixmq-maxmsg, posixmq-msgsize.
Tests: POSIXMQ_MAXMSG POSIXMQ_MSGSIZE
Building: Building:
Disabling certain features during configure could break build process. Disabling certain features during configure could break build process.

View file

@ -2168,7 +2168,7 @@ label(OPTION_NETNS)dit(bf(tt(netns=<net-namespace-name>)))
Before opening the address it tries to switch to the named network namespace. Before opening the address it tries to switch to the named network namespace.
After opening the address it switches back to the previous namespace. After opening the address it switches back to the previous namespace.
(link(Example with TCP forwarder)(EXAMPLE_OPTION_NETNS), (link(Example with TCP forwarder)(EXAMPLE_OPTION_NETNS),
link(example with virtual network connection)(EXAMPLE_TUN_NETNS).nl() link(example with virtual network connection)(EXAMPLE_TUN_NETNS)).nl()
Only on Linux; requires root; use option tt(--experimental).nl() Only on Linux; requires root; use option tt(--experimental).nl()
enddit() enddit()
@ -3495,6 +3495,14 @@ label(OPTION_POSIXMQ_PRIORITY)dit(bf(tt(posixmq-priority (mq-prio))))
label(OPTION_POSIXMQ_FLUSH)dit(bf(tt(posixmq-flush (mq-flush)))) label(OPTION_POSIXMQ_FLUSH)dit(bf(tt(posixmq-flush (mq-flush))))
"Consumes" (drops) all messages currently in the queue before starting "Consumes" (drops) all messages currently in the queue before starting
transfers. transfers.
label(OPTION_POSIXMQ_MAXMSG)dit(bf(tt(posixmq-maxmsg (mq-maxmsg))))
Sets the maxmsg parameter of the POSIX message queue when creating it.
Note: You need root or CAP_SYS_RESOURCE to exceed the default value
(<tt>/proc/sys/fs/mqueue/msg_default</tt>).
label(OPTION_POSIXMQ_MSGSIZE)dit(bf(tt(posixmq-msgsize (mq-msgsize))))
Sets the msgsize parameter of the POSIX message queue when creating it.
Note: You need root or CAP_SYS_RESOURCE to exceed the default value
(<tt>/proc/sys/fs/mqueue/msgsize_default</tt>).
enddit() enddit()

View file

@ -15106,8 +15106,8 @@ tf="$td/test$N.stdout"
te="$td/test$N.stderr" te="$td/test$N.stderr"
tdiff="$td/test$N.diff" tdiff="$td/test$N.diff"
da="test$N $(date) $RANDOM" da="test$N $(date) $RANDOM"
CMD0="$TRACE $SOCAT $opts TCP4-LISTEN:$PORT,reuseaddr EXEC:'$FILAN -s',nofork" CMD0="$TRACE $SOCAT $opts -t $T4 TCP4-LISTEN:$PORT,reuseaddr EXEC:'$FILAN -s',nofork"
CMD1="$TRACE $SOCAT $opts -t $T4 - TCP4:localhost:$PORT" CMD1="$TRACE $SOCAT $opts -t $T8 - TCP4:localhost:$PORT"
printf "test $F_n $TEST... " $N printf "test $F_n $TEST... " $N
eval "$CMD0" >/dev/null 2>"${te}0" & eval "$CMD0" >/dev/null 2>"${te}0" &
pid0=$! pid0=$!

View file

@ -25,8 +25,10 @@ const struct addrdesc xioaddr_posixmq_read = { "POSIXMQ-READ", 1+XIO
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_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_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 optdesc opt_posixmq_priority = { "posixmq-priority", "mq-pri", 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_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 }; const struct optdesc opt_posixmq_flush = { "posixmq-flush", "mq-flush", OPT_POSIXMQ_FLUSH, GROUP_POSIXMQ, PH_EARLY, TYPE_BOOL, OFUNC_SPEC, 0, 0, 0 };
const struct optdesc opt_posixmq_maxmsg = { "posixmq-maxmsg", "mq-maxmsg", OPT_POSIXMQ_MAXMSG, GROUP_POSIXMQ, PH_OPEN, TYPE_LONG, OFUNC_SPEC, 0, 0, 0 };
const struct optdesc opt_posixmq_msgsize = { "posixmq-msgsize", "mq-msgsize", OPT_POSIXMQ_MSGSIZE, GROUP_POSIXMQ, PH_OPEN, TYPE_LONG, OFUNC_SPEC, 0, 0, 0 };
/* _read(): open immediately, stay in transfer loop /* _read(): open immediately, stay in transfer loop
_recv(): wait until data (how we know there is??), oneshot, opt.fork _recv(): wait until data (how we know there is??), oneshot, opt.fork
@ -47,11 +49,12 @@ static int xioopen_posixmq(
bool opt_unlink_early = false; bool opt_unlink_early = false;
bool nonblock = 0; bool nonblock = 0;
bool flush = false; bool flush = false;
struct mq_attr attr = { 0 };
bool setopts = false;
int oflag; int oflag;
bool opt_o_excl = false; bool opt_o_excl = false;
mode_t opt_mode = 0666; mode_t opt_mode = 0666;
mqd_t mqd; mqd_t mqd;
struct mq_attr attr;
int _errno; int _errno;
bool dofork = false; bool dofork = false;
int maxchildren = 0; int maxchildren = 0;
@ -100,6 +103,47 @@ static int xioopen_posixmq(
retropt_bool(opts, OPT_O_EXCL, &opt_o_excl); retropt_bool(opts, OPT_O_EXCL, &opt_o_excl);
retropt_mode(opts, OPT_PERM, &opt_mode); retropt_mode(opts, OPT_PERM, &opt_mode);
retropt_bool(opts, OPT_POSIXMQ_FLUSH, &flush); retropt_bool(opts, OPT_POSIXMQ_FLUSH, &flush);
retropt_long(opts, OPT_POSIXMQ_MAXMSG, &attr.mq_maxmsg) ||
(setopts = true);
retropt_long(opts, OPT_POSIXMQ_MSGSIZE, &attr.mq_msgsize) ||
(setopts = true);
/* When only one of mq-maxmsg and mq-msgsize options has been provided,
we must nevertheless set the other option value in strucht mq_attr.
For this we have to find the default, read it from /proc fs */
if (setopts) {
int pfd;
const static char *PROC_MAXMSG = "/proc/sys/fs/mqueue/msg_default";
const static char *PROC_MSGSIZE = "/proc/sys/fs/mqueue/msgsize_default";
char buff[21]; /* fit a 64bit num in decimal */
ssize_t bytes;
if (attr.mq_maxmsg == 0) {
if ((pfd = Open(PROC_MAXMSG, O_RDONLY, 0)) < 0) {
Warn2("open(\"%s\", O_RDONLY, 0): %s", PROC_MAXMSG, strerror(errno));
} else if ((bytes = Read(pfd, buff, sizeof(buff)-1)) < 0) {
Warn4("read(%d /* \"%s\" */, buff, "F_Zd"): %s",
pfd, PROC_MAXMSG, sizeof(buff)-1, strerror (errno));
Close(pfd);
} else {
sscanf(buff, "%ld", &attr.mq_maxmsg);
Close(pfd);
}
}
if (attr.mq_msgsize == 0) {
if ((pfd = Open(PROC_MSGSIZE, O_RDONLY, 0)) < 0) {
Warn2("open(\"%s\", O_RDONLY, 0): %s", PROC_MSGSIZE, strerror(errno));
} else if ((bytes = Read(pfd, buff, sizeof(buff)-1)) < 0) {
Warn4("read(%d /* \"%s\" */, buff, "F_Zd"): %s",
pfd, PROC_MSGSIZE, sizeof(buff)-1, strerror (errno));
Close(pfd);
} else {
sscanf(buff, "%ld", &attr.mq_msgsize);
Close(pfd);
}
}
}
retropt_bool(opts, OPT_UNLINK_EARLY, &opt_unlink_early); retropt_bool(opts, OPT_UNLINK_EARLY, &opt_unlink_early);
if (opt_unlink_early) { if (opt_unlink_early) {
@ -126,12 +170,18 @@ static int xioopen_posixmq(
} }
/* Now open the message queue */ /* Now open the message queue */
Debug3("mq_open(\"%s\", %d, "F_mode", NULL)", name, oflag, opt_mode); if (setopts)
mqd = mq_open(name, oflag, opt_mode, NULL); Debug8("%s: mq_open(\"%s\", "F_mode", "F_mode", {flags=%ld, maxmsg=%ld, msgsize=%ld, curmsgs=%ld} )", argv[0], name, oflag, opt_mode, attr.mq_flags, attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs);
else
Debug4("%s: mq_open(\"%s\", "F_mode", "F_mode", NULL)", argv[0], name, oflag, opt_mode);
mqd = mq_open(name, oflag, opt_mode, setopts ? &attr : NULL);
_errno = errno; _errno = errno;
Debug1("mq_open() -> %d", mqd); Debug1("mq_open() -> %d", mqd);
if (mqd < 0) { if (mqd < 0) {
Error3("%s: mq_open(\"%s\"): %s", argv[0], name, strerror(errno)); if (setopts)
Error9("%s: mq_open(\"%s\", "F_mode", "F_mode", {flags=%ld, maxmsg=%ld, msgsize=%ld, curmsgs=%ld} ): %s", argv[0], name, oflag, opt_mode, attr.mq_flags, attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs, strerror(errno));
else
Error5("%s: mq_open(\"%s\", "F_mode", "F_mode", NULL): %s", argv[0], name, oflag, opt_mode, strerror(errno));
errno = _errno; errno = _errno;
return STAT_RETRYLATER; return STAT_RETRYLATER;
} }

View file

@ -10,6 +10,8 @@ extern const struct addrdesc xioaddr_posixmq_read;
extern const struct addrdesc xioaddr_posixmq_receive; extern const struct addrdesc xioaddr_posixmq_receive;
extern const struct addrdesc xioaddr_posixmq_send; extern const struct addrdesc xioaddr_posixmq_send;
extern const struct optdesc opt_posixmq_maxmsg;
extern const struct optdesc opt_posixmq_msgsize;
extern const struct optdesc opt_posixmq_priority; extern const struct optdesc opt_posixmq_priority;
extern const struct optdesc opt_posixmq_flush; extern const struct optdesc opt_posixmq_flush;

View file

@ -1032,8 +1032,10 @@ const struct optname optionnames[] = {
#endif #endif
IF_ANY ("mode", &opt_perm) IF_ANY ("mode", &opt_perm)
#if WITH_POSIXMQ #if WITH_POSIXMQ
IF_ANY ("mq-flush", &opt_posixmq_flush) IF_ANY ("mq-flush", &opt_posixmq_flush)
IF_ANY ("mq-prio", &opt_posixmq_priority) IF_ANY ("mq-maxmsg", &opt_posixmq_maxmsg)
IF_ANY ("mq-msgsize", &opt_posixmq_msgsize)
IF_ANY ("mq-prio", &opt_posixmq_priority)
#endif #endif
#ifdef TCP_MAXSEG #ifdef TCP_MAXSEG
IF_TCP ("mss", &opt_tcp_maxseg) IF_TCP ("mss", &opt_tcp_maxseg)
@ -1350,6 +1352,8 @@ const struct optname optionnames[] = {
#endif #endif
#if WITH_POSIXMQ #if WITH_POSIXMQ
IF_ANY ("posixmq-flush", &opt_posixmq_flush) IF_ANY ("posixmq-flush", &opt_posixmq_flush)
IF_ANY ("posixmq-maxmsg", &opt_posixmq_maxmsg)
IF_ANY ("posixmq-msgsize", &opt_posixmq_msgsize)
IF_ANY ("posixmq-priority", &opt_posixmq_priority) IF_ANY ("posixmq-priority", &opt_posixmq_priority)
#endif #endif
#if (WITH_IP4 || WITH_IP6) && HAVE_RESOLV_H && WITH_RES_PRIMARY #if (WITH_IP4 || WITH_IP6) && HAVE_RESOLV_H && WITH_RES_PRIMARY

View file

@ -483,6 +483,8 @@ enum e_optcode {
OPT_MAX_CHILDREN, OPT_MAX_CHILDREN,
#if WITH_POSIXMQ #if WITH_POSIXMQ
OPT_POSIXMQ_FLUSH, OPT_POSIXMQ_FLUSH,
OPT_POSIXMQ_MAXMSG,
OPT_POSIXMQ_MSGSIZE,
OPT_POSIXMQ_PRIORITY, OPT_POSIXMQ_PRIORITY,
#endif #endif
#ifdef NLDLY #ifdef NLDLY