Change from system() to execl() for user agent script. - bitreich-httpd - Bitreich HTTPD service
(HTM) git clone git://bitreich.org/bitreich-httpd git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-httpd
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
(DIR) commit d91240a05f9f9ccb93d93e7bea44fc7cbf79e779
(DIR) parent 19ed00841160bf4661c1a2533ce9008eef47090e
(HTM) Author: Christoph Lohmann <20h@r-36.net>
Date: Sun, 3 Sep 2023 20:55:01 +0200
Change from system() to execl() for user agent script.
Diffstat:
M bitreich-httpd.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
---
(DIR) diff --git a/bitreich-httpd.c b/bitreich-httpd.c
@@ -13,6 +13,7 @@
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
+#include <sys/wait.h>
#include <netdb.h>
#include <time.h>
@@ -138,12 +139,13 @@ main(int argc, char *argv[])
char *wwwbase, *wwwindex, *request, *ctype, *path, *le_file,
*le_base, clienth[NI_MAXHOST], clientp[NI_MAXSERV], *zuccbase,
*requested, *header, *headerval, *hosthdr;
- int rlen, i;
+ int rlen, i, user_agent_script_pid;
struct sockaddr_storage clt;
socklen_t cltlen = sizeof(clt);
time_t tim;
hosthdr = NULL;
+ user_agent_script_pid = -1;
wwwbase = "/bitreich/www";
wwwindex = "index.html";
@@ -194,11 +196,16 @@ main(int argc, char *argv[])
continue;
}
if (!strcasecmp(header, "user-agent")) {
- asprintf(&path,
- "/home/annna/bin/modules/http-user-agent/add-user-agent.sh '%s'",
- headerval);
- system(path);
- free(path);
+ user_agent_script_pid = fork();
+ switch (user_agent_script_pid) {
+ case -1:
+ perror("fork");
+ return 1;
+ case 0:
+ return execl("add-user-agent.sh",
+ "/home/annna/bin/modules/http-user-agent/add-user-agent.sh",
+ headerval, 0);
+ }
}
if (!strcasecmp(header, "host")) {
rlen = strlen(headerval);
@@ -279,6 +286,13 @@ main(int argc, char *argv[])
rlen = servefile(path, ctype, 1);
free(path);
+ if (user_agent_script_pid != -1) {
+ if (waitpid(user_agent_script_pid, NULL, 0) < 0) {
+ perror("waitpid");
+ return 1;
+ }
+ }
+
return rlen;
}