localserv/src/localserv.c

93 lines
2.2 KiB
C

#include "server.h"
#include "client.h"
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
char *exe_name;
int server(char *path) {
int error;
error = server_init(path);
if (error) {
fprintf(stderr, "%s: server init failed: %s\n", exe_name, strerror(error));
return error;
}
while (true) {
error = server_listen();
if (error) {
fprintf(stderr, "%s: listen failed: %s\n", exe_name, strerror(error));
return error;
}
char* request = server_get_request();
printf("%s\n", request);
fflush(stdout);
char* response = NULL;
size_t len = 0;
ssize_t length = getline(&response, &len, stdin);
if (length == -1) {
fprintf(stderr, "%s: failed getting input\n", exe_name);
return -1;
}
response[length - 1] = '\0';
error = server_respond(response);
free(response);
if (error) {
fprintf(stderr, "%s: respond failed: %s\n", exe_name, strerror(error));
return error;
}
}
return 0;
}
int client(char *path, char *message) {
int error;
error = client_init(path);
if (error) {
fprintf(stderr, "%s: client init failed: %s\n", exe_name, strerror(error));
return error;
}
error = client_request(message);
if (error) {
fprintf(stderr, "%s: request failed: %s\n", exe_name, strerror(error));
return error;
}
printf("%s\n", client_get_response());
return 0;
}
int main(int argc, char *argv[]) {
exe_name = argv[0];
if (argc <= 1) {
// TODO: full help
fprintf(stderr, "%s: provide subcommand \"server\" or \"client\"", exe_name);
return -1;
} else if (strcmp(argv[1], "server") != 0 && strcmp(argv[1], "client") != 0) {
// TODO: full help
fprintf(stderr, "%s: command not recognized; provide subcommand \"server\" or \"client\"", exe_name);
return -1;
} else if (argc < 3) {
fprintf(stderr, "%s: provide a path", exe_name);
return -1;
}
if (strcmp(argv[1], "server") == 0) {
return server(argv[2]);
} else if (strcmp(argv[1], "client") == 0) {
if (argc < 4) {
fprintf(stderr, "%s client: provide a message", exe_name);
return -1;
}
return client(argv[2], argv[3]);
} else {
return -1;
}
}