diff options
-rw-r--r-- | plop.c | 75 |
1 files changed, 75 insertions, 0 deletions
@@ -0,0 +1,75 @@ +#include <netdb.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <unistd.h> + +int main(int argc, char ** argv) +{ + struct addrinfo hints = { + .ai_family = AF_UNSPEC, + .ai_socktype = SOCK_STREAM, + .ai_flags = AI_PASSIVE, + }; + + struct addrinfo * result; + struct addrinfo * it; + + if (2 != argc) + { + return 4; + } + + if (0 != getaddrinfo(NULL, argv[1], &hints, &result)) + { + return 1; // TODO: Handle errors properly + } + + int server; + + for (it = result; it != NULL; it = it->ai_next) + { + server = socket(it->ai_family, it->ai_socktype, it->ai_protocol); + + if (-1 == server) + continue; + + if (0 == bind(server, it->ai_addr,it->ai_addrlen)) + break; + + close(server); + } + + if (it == NULL) + { + return 2; // TODO: Handle errors properly + } + + freeaddrinfo(result); + + if (-1 == listen(server, 5)) + { + return 3; // TODO: Handle errors properly + } + + int client; + static const char * response = + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "\r\n" + "plop\n"; + + for (;;) + { + if (-1 != (client = accept(server, NULL, NULL))) + { + if (-1 == send(client, response, strlen(response), 0)) + { + // TODO: Handle errors properly + } + + // Ignore the close-related error mess. + close(client); + } + } +} |