summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiau <miaukatzemiau@priveasy.de>2011-12-02 08:25:14 (GMT)
committermiau <miaukatzemiau@priveasy.de>2011-12-02 08:25:14 (GMT)
commit6c242e521d822366238b45dae0eabdfc8f7b93f6 (patch)
tree2353c260c44f15d2bfaf06e35adb1a3c1c623019
parentb4b4c79cf6276e8d2cb851f4ea3d40102d11c5a4 (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-xhandler/hello6
-rw-r--r--src/broadcaster.c25
-rw-r--r--src/listener.c21
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");
contact: Jan Huwald // Impressum