socat: allow more complex command line options
authorDobroslaw Kijowski <dobo90@gmail.com>
Wed, 27 Jan 2021 19:50:51 +0000 (20:50 +0100)
committerDobroslaw Kijowski <dobo90@gmail.com>
Wed, 27 Jan 2021 20:24:38 +0000 (21:24 +0100)
Current implementation of socat's init service doesn't allow to run more
complex configurations. As an example there's no possibility to execute
following command:

  socat TCP-LISTEN:8080,fork,reuseaddr,bind=192.168.1.1 \
    EXEC:"/sbin/ip netns exec somenetns socat STDIO TCP:10.0.0.1:80"

In such command the first line is argv[1] and the second line is
argv[2]. SocatOptions config option is a string. As as a consequence of
this each word will be passed as a separate argv element. Socat won't be
able to parse arguments correctly.

In order to mitigate this issue, we can also accept SocatOptions as a
list of strings. Following config file will work correctly:

config socat 'tunnel_8080_into_somenetns'
option enable '1'
list SocatOptions 'TCP-LISTEN:8080,fork,reuseaddr,bind=192.168.1.1'
list SocatOptions 'EXEC:"/sbin/ip netns exec somenetns socat STDIO TCP:10.0.0.1:80"'

While we're at it, pass stdout and stderr into logread.

Signed-off-by: Dobroslaw Kijowski <dobo90@gmail.com>
net/socat/Makefile
net/socat/files/socat.init

index faf8d302e14c49936977e86a0136bef95f31136b..081563f32fb7095ef0be7cd8a008f364ec60ec56 100644 (file)
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=socat
 PKG_VERSION:=1.7.3.4
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://www.dest-unreach.org/socat/download
index b4129357377a57f47751885b2353090332c9c6b7..a4d3c8224a57e893c715a4281e6f2cf6e11e3524 100644 (file)
@@ -12,11 +12,18 @@ validate_section_socat()
 {
        uci_load_validate socat socat "$1" "$2" \
                'enable:bool:1' \
-               'SocatOptions:string'
+               'SocatOptions:or(string, list(string))'
+}
+
+append_param_command()
+{
+       procd_append_param command "$1"
 }
 
 socat_instance()
 {
+       local is_list
+
        [ "$2" = 0 ] || {
                echo "validation failed"
                return 1
@@ -26,7 +33,14 @@ socat_instance()
 
        procd_open_instance
        procd_set_param command "$PROG"
-       procd_append_param command $SocatOptions
+       config_get is_list "$1" SocatOptions_LENGTH
+       if [ -z "$is_list" ]; then
+               procd_append_param command $SocatOptions
+       else
+               config_list_foreach "$1" SocatOptions append_param_command
+       fi
+       procd_set_param stdout 1
+       procd_set_param stderr 1
        procd_close_instance
 }