diff options
author | miau <miaukatzemiau@priveasy.de> | 2011-12-02 08:25:14 (GMT) |
---|---|---|
committer | miau <miaukatzemiau@priveasy.de> | 2011-12-02 08:25:14 (GMT) |
commit | 6c242e521d822366238b45dae0eabdfc8f7b93f6 (patch) | |
tree | 2353c260c44f15d2bfaf06e35adb1a3c1c623019 | |
parent | b4b4c79cf6276e8d2cb851f4ea3d40102d11c5a4 (diff) |
read/write payloads via stdio
To allow binary save payload transmission:
- broadcaster reads the payload from stdin if the 2nd param is "-"
- listener passes the payload via stdin to all handlers
-rwxr-xr-x | handler/hello | 6 | ||||
-rw-r--r-- | src/broadcaster.c | 25 | ||||
-rw-r--r-- | src/listener.c | 21 |
3 files changed, 42 insertions, 10 deletions
diff --git a/handler/hello b/handler/hello index 92e1aa1..68ee5a4 100755 --- a/handler/hello +++ b/handler/hello @@ -4,6 +4,8 @@ LOGFILE="./hello.log" -echo "Someone called 'hello $1'!" >> "$LOGFILE" - +( echo -n "Someone called 'hello " + cat + echo "'!" +) >> "$LOGFILE" diff --git a/src/broadcaster.c b/src/broadcaster.c index c945b91..2f0e194 100644 --- a/src/broadcaster.c +++ b/src/broadcaster.c @@ -13,21 +13,36 @@ int main(int argc, char **argv) /* assemble packet, parse cmd line */ if (argc < 3 || argc > 4) { - fprintf(stderr, "usage: %s interface task [message]\n", argv[0]); + fprintf(stderr, "usage: %s interface task [message|-]\n", argv[0]); exit(1); } char buf[MAXBUFLEN], *task = argv[2], *message = (argc == 4) ? argv[3] : ""; int task_len = strlen(task), - total_len = task_len + 1 + strlen(message); + total_len = task_len + 1; + strcpy(buf, task); + buf[task_len] = 0; + if (strcmp(message, "-") == 0) { + /* read payload from stdin */ + int i; + while ((MAXBUFLEN-total_len > 0) + && ((i = read(0, &(buf[total_len]), MAXBUFLEN-total_len)) > 0)) + total_len += i; + if (i < 0) { + perror("read(stdin)"); + exit(1); + } + }else{ + /* use cmd line for payload */ + total_len += strlen(message); + if (total_len <= MAXBUFLEN) + strcpy(buf + 1 + task_len, message); + } if (total_len > MAXBUFLEN) { fprintf(stderr,"payload to long: max %d bytes, was %d\n", MAXBUFLEN, total_len); exit(1); } - strcpy(buf, task); - buf[task_len] = 0; - strcpy(buf + 1 + task_len, message); /* setup socket */ if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { diff --git a/src/listener.c b/src/listener.c index 3c2ee64..020b90e 100644 --- a/src/listener.c +++ b/src/listener.c @@ -64,16 +64,24 @@ int main(int argc, char **argv, char **envp) { /* decode packet & launch handler */ buf[numbytes] = '\0'; char *task = buf, - *cl_argv[3] = {task, (strlen(task)<numbytes) ? (buf+strlen(task)+1) : NULL, NULL }; - + *cl_argv[2] = {task, NULL}; if (task[0] == '/' || strstr(task, "..")) { fprintf(stderr, "payload tried directory traversal\n"); continue; } + + int fd_payload[2]; + pipe(fd_payload); switch (fork()) { case 0: - close(fd); // close socket handler, leave std io + /* redirect payload to stdio, leave stdout/err, close the rest */ + dup(fd_payload[0], 1); + close(fd_payload[0]); + close(fd_payload[1]); + close(fd); + + /* run our task task */ execve(task, cl_argv, envp); perror("exec"); exit(1); @@ -83,6 +91,13 @@ int main(int argc, char **argv, char **envp) { default: wait(); } + + /* write payload to child process */ + int tasklen = strlen(task); + if (tasklen < numbytes) + write(fd_payload[1], buf + tasklen + 1, numbytes - tasklen - 1); + close(fd_payload[1]); + close(fd_payload[0]); } perror("recvfrom"); |