aboutsummaryrefslogtreecommitdiff
path: root/src/inetd-bi.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-11-28 12:09:15 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2009-11-28 13:15:51 +0200
commit36a53f1875a097fa16bceaf674dc627d916651df (patch)
treeee33a5cf08231f11a3b31e0f16652229d5add561 /src/inetd-bi.c
parent69bc6e88c7babf356efbacbdc2230de407c27590 (diff)
downloadpies-36a53f1875a097fa16bceaf674dc627d916651df.tar.gz
pies-36a53f1875a097fa16bceaf674dc627d916651df.tar.bz2
Handle per-tcpmux ACL's. Optionally pass socket data via environment variables.
* src/inetd-bi.c (tcpmux): Consult the component's ACL before deciding whether to handle the connection. * src/pies.c (str_to_socket_type): Rewrite using strtotok. (socket_type_to_str): New function (str_to_cf): New flags: sockenv and resolve. Use strtotok. (main): Log_tag defaults to program instance name. * src/pies.h: Include socket-related headers. (CF_SOCKENV, CF_RESOLVE): New flags. (pies_sockaddr_storage): New union. (check_acl): New proto. (progman_run_comp): Change signature. (socket_type_to_str): New proto. * src/progman.c (struct prog): New members sa_storage, sa_len. (prog_sockenv): New function. (progman_run_comp): Call prog_sockenv. Initialize sa_storage and sa_len of the created struct prog. (prog_start): Call prog_sockenv. Do not close 2 if logging to stderr. (check_acl): Remove static. (_prog_accept): Use union pies_sockaddr_storage. Pass socket address in pinst->v.p.sa_storage and pinst->v.p.sa_len. (sockenv_hint, envsize): New variables. (add_env): New function. (env_setup): Remove. (environ_setup): New function. * src/socket.c: Remove unnecessary includes.
Diffstat (limited to 'src/inetd-bi.c')
-rw-r--r--src/inetd-bi.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/inetd-bi.c b/src/inetd-bi.c
index 30423de..d002e4c 100644
--- a/src/inetd-bi.c
+++ b/src/inetd-bi.c
@@ -320,6 +320,9 @@ tcpmux (int fd, struct component const *comp)
char service[MAX_SERV_LEN + 1];
size_t len;
struct component *srv_comp;
+ union pies_sockaddr_storage sa;
+ socklen_t salen = sizeof (sa);
+ int rc;
/* Read service name */
if ((len = fd_getline (fd, service, MAX_SERV_LEN)) < 0)
@@ -344,10 +347,30 @@ tcpmux (int fd, struct component const *comp)
return;
}
+ rc = getpeername (fd, (struct sockaddr *) &sa, &salen);
+ if (rc)
+ logmsg (LOG_ERR, _("%s: cannot get peer name: %s"),
+ comp->tag, strerror (errno));
+
+ if (comp->acl)
+ {
+ if (rc)
+ {
+ fd_write (fd, "-Service not available\r\n");
+ return;
+ }
+
+ if (check_acl (comp->acl, (struct sockaddr *) &sa, salen))
+ {
+ fd_write (fd, "-Service not available\r\n");
+ return;
+ }
+ }
+
if (srv_comp->flags & CF_TCPMUXPLUS)
fd_write (fd, "+Go\r\n");
-
- progman_run_comp (srv_comp, fd);
+
+ progman_run_comp (srv_comp, fd, &sa, salen);
}

Return to:

Send suggestions and report system problems to the System administrator.