tomc_p("---------");
}
-#define HALLO "hallo there from dumb-client"
-
-void write_hallo(void)
-{
- printf("writing hallo\n");
- ssize_t wrote =
- write(sfd, HALLO, sizeof HALLO);
- printf("wrote %d bytes.\n", wrote);
-}
-
static char write_buf[100];
static char socket_buf[100];
int write_len = strlen(write_buf); \
ssize_t wrote = \
write(sfd, write_buf, write_len); \
+ tomc_p("wrote '%s' (%d)", write_buf, write_len); \
if(wrote != write_len){ \
perror("[tomc] write size mismatch"); \
exit(EXIT_FAILURE); \
- } \
+ }}
+
+
+#define SOCK_READ { \
+ int size = read(sfd, socket_buf, 100); \
+ if(read == 0) { \
+ tomc_p("didn't actually get anything."); \
+ socket_buf[0] = '\0'; \
+ } \
+ socket_buf[size] = '\0'; \
}
-
-#define SOCK_READ { read(sfd, socket_buf, 100); }
#define SOCK_READ_X(X){ \
SOCK_READ; \
if(strcmp(socket_buf, X) != 0){ \
tomc_p("protocol error. instead of ACK we got '%s'", socket_buf); \
exit(EXIT_FAILURE); \
} \
+ tomc_p("got an ACK"); \
}
#define SOCK_ACK {SOCK_READ_X("ACK")};
#define SOCK_REQUEST(X) { \
SOCK_ACK;
}
-static void write_start(void)
-{
-
-}
-
-static void write_stop(void)
-{
- SOCK_REQUEST("stop");
-}
-
-static void write_kill(void)
-{
- SOCK_REQUEST("kill");
-}
-
-static void write_status(void)
-{
- SOCK_REQUEST("status");
-}
-
static void write_requests(void)
{
write_client();
load_jobs();
}
-/* These defines are here to improve the local readability */
+#define SEND_ACK { \
+ int size; \
+ if(size = write(asfd, "ACK", sizeof "ACK") != sizeof "ACK") { \
+ tomd_p("didn't send as much as we though (%d != %d)", size, sizeof "ACK"); \
+ } \
+ }
+
#define CHDIR 0
#define DONT_CHDIR 1
#define CLOSE_PIPES 0
daemon(DONT_CHDIR, DONT_CLOSE_PIPES);
}
+#define READ_SOCKET {\
+ int size = read(asfd, buf, 100); \
+ buf[size] = '\0'; \
+ }
+
+static int validate_sender(int asfd, char *buf)
+{
+ READ_SOCKET;
+ if(strcmp(buf, "client:tomc") == 0){
+ SEND_ACK;
+ return 0;
+ }
+ tomd_p("received '%s' instead of client:tomc", buf);
+ return -1;
+}
+
+enum requests { KILL, STATUS, STOP, START, UNKNOWN};
+#define X(a, b) { a, b }
+static struct {
+ char *str;
+ enum requests request;
+} request_types[] =
+ {
+ X("kill", KILL),
+ X("status", STATUS),
+ X("start", START),
+ X("stop", STOP),
+ X(NULL, -1)
+ };
+#undef X
+
+static void handle_request(int asfd, char *buf)
+{
+ READ_SOCKET;
+ enum requests request = UNKNOWN;
+ int i = 0;
+ while(1){
+ if(request_types[i].str == NULL){
+ break;
+ }
+
+ tomd_p("loop [%d]: comparing '%s' to '%s'",
+ i, buf, request_types[i].str);
+ if(strcmp(buf, request_types[i].str) == 0){
+ request = request_types[i].request;
+ break;
+ }
+
+ i++;
+ }
+
+ if(request == UNKNOWN){
+ tomd_p("unknown request type!");
+ return;
+ }
+
+ SEND_ACK;
+ READ_SOCKET;
+ // cross reference given name against known services
+ tomd_p("looking up '%s'", buf);
+ SEND_ACK;
+ /* lookup_job(buf); */
+}
+
+static void handle_connection(int asfd)
+{
+ char buf[100] = {};
+
+ if(validate_sender(asfd, buf) != 0){
+ tomd_p("invalid sender.");
+ return;
+ }
+
+ tomd_p("validated client");
+ handle_request(asfd, buf);
+
+ close(asfd);
+}
+
static void run(void)
{
/* loop: */
exit(EXIT_FAILURE);
}
+ int i = 0;
for(;;){
struct sockaddr addr;
- socklen_t size;
+ /* sometimes gives EINVAL if not initialized. */
+ socklen_t size = sizeof(addr);
+ tomd_p("accept loop [%d]", i++);
+ errno = 0;
int accept_sfd =
accept(sfd,
&addr, /* requester info */
&size); /* len of requester info */
if(accept_sfd < 0){
+ if(errno == EINVAL){
+ tomd_p("EINVAL");
+ }
perror("[tomd] accept socket");
exit(EXIT_FAILURE);
}
-
- /* int getsockname(accept_sfd, */
- /* addr, */
- /* size); */
-
- tomd_p("accepted socket connection from '%s'",
- ((struct sockaddr_un *) &addr)->sun_path);
-
- char accept_buf[100] = {};
- read(accept_sfd, accept_buf, 100);
- tomd_p("got message '%s', accept_buf");
- close(accept_sfd);
+ handle_connection(accept_sfd);
}
}