93 lines
2.2 KiB
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;
|
|
}
|
|
}
|