Create a gist now

Instantly share code, notes, and snippets.

@mlen /gen.rb
Last active Oct 9, 2015

What would you like to do?
quine generator in ruby
head = "#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
char *s = "
tail = <<'EOF'.sub('REPLACE_ME', head.inspect)
#define send_str(sock, str) (send((sock), (str), strlen((str)), 0))
#define send_chr(sock, chr) (send((sock), (chr), 1, 0))
void send_escaped(int sock, char *s) {
send_str(sock, "\"");
while (*s) {
switch (*s) {
case '\n':
send_str(sock, "\\n");
break;
case '\\':
case '"':
send_str(sock, "\\");
default:
send_chr(sock, s);
}
s++;
}
send_str(sock, "\";");
}
void handle_connection(int sock) {
send_str(sock, REPLACE_ME);
send_escaped(sock, s);
send_str(sock, s);
}
void die(char *err) {
perror(err);
exit(1);
}
int main() {
int fd;
int sock;
pid_t pid;
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t client_size = sizeof(client);
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(3000);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
die("socket()");
}
if (bind(fd, (struct sockaddr *)&server, sizeof(server)) < 0) {
die("bind()");
}
if (listen(fd, 128) < 0) {
die("listen()");
}
while (1) {
sock = accept(fd, (struct sockaddr *)&client, &client_size);
if (sock != -1) {
if ((pid = fork()) == -1) {
die("fork()");
} else if (pid == 0) {
handle_connection(sock);
shutdown(sock, SHUT_RDWR);
exit(0);
} else {
close(sock);
}
} else {
perror("accept()");
}
waitpid(-1, NULL, WNOHANG);
}
return 0;
}
EOF
print head + (tail.inspect + ";") + tail
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
char *s = "\n#define send_str(sock, str) (send((sock), (str), strlen((str)), 0))\n#define send_chr(sock, chr) (send((sock), (chr), 1, 0))\n\nvoid send_escaped(int sock, char *s) {\n send_str(sock, \"\\\"\");\n while (*s) {\n switch (*s) {\n case '\\n':\n send_str(sock, \"\\\\n\");\n break;\n case '\\\\':\n case '\"':\n send_str(sock, \"\\\\\");\n default:\n send_chr(sock, s);\n }\n s++;\n }\n send_str(sock, \"\\\";\");\n}\n\nvoid handle_connection(int sock) {\n send_str(sock, \"#include <stdlib.h>\\n#include <string.h>\\n#include <stdio.h>\\n#include <unistd.h>\\n#include <sys/socket.h>\\n#include <sys/types.h>\\n#include <netinet/in.h>\\n\\nchar *s = \");\n send_escaped(sock, s);\n send_str(sock, s);\n}\n\nvoid die(char *err) {\n perror(err);\n exit(1);\n}\n\nint main() {\n int fd;\n int sock;\n pid_t pid;\n struct sockaddr_in server;\n struct sockaddr_in client;\n socklen_t client_size = sizeof(client);\n\n bzero(&server, sizeof(server));\n server.sin_family = AF_INET;\n server.sin_port = htons(3000);\n server.sin_addr.s_addr = htonl(INADDR_ANY);\n\n if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {\n die(\"socket()\");\n }\n\n if (bind(fd, (struct sockaddr *)&server, sizeof(server)) < 0) {\n die(\"bind()\");\n }\n\n if (listen(fd, 128) < 0) {\n die(\"listen()\");\n }\n\n while (1) {\n sock = accept(fd, (struct sockaddr *)&client, &client_size);\n if (sock != -1) {\n\n if ((pid = fork()) == -1) {\n die(\"fork()\");\n } else if (pid == 0) {\n handle_connection(sock);\n shutdown(sock, SHUT_RDWR);\n exit(0);\n } else {\n close(sock);\n }\n } else {\n perror(\"accept()\");\n }\n\n waitpid(-1, NULL, WNOHANG);\n }\n\n return 0;\n}\n";
#define send_str(sock, str) (send((sock), (str), strlen((str)), 0))
#define send_chr(sock, chr) (send((sock), (chr), 1, 0))
void send_escaped(int sock, char *s) {
send_str(sock, "\"");
while (*s) {
switch (*s) {
case '\n':
send_str(sock, "\\n");
break;
case '\\':
case '"':
send_str(sock, "\\");
default:
send_chr(sock, s);
}
s++;
}
send_str(sock, "\";");
}
void handle_connection(int sock) {
send_str(sock, "#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>\n#include <netinet/in.h>\n\nchar *s = ");
send_escaped(sock, s);
send_str(sock, s);
}
void die(char *err) {
perror(err);
exit(1);
}
int main() {
int fd;
int sock;
pid_t pid;
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t client_size = sizeof(client);
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(3000);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
die("socket()");
}
if (bind(fd, (struct sockaddr *)&server, sizeof(server)) < 0) {
die("bind()");
}
if (listen(fd, 128) < 0) {
die("listen()");
}
while (1) {
sock = accept(fd, (struct sockaddr *)&client, &client_size);
if (sock != -1) {
if ((pid = fork()) == -1) {
die("fork()");
} else if (pid == 0) {
handle_connection(sock);
shutdown(sock, SHUT_RDWR);
exit(0);
} else {
close(sock);
}
} else {
perror("accept()");
}
waitpid(-1, NULL, WNOHANG);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment