/** * Eugene Marinelli */ #include #include #include #include #include #include #include #include #include #include #include #include #include void server(void (*request_handler)(char*,char*), int* servSock, char* address) { if ((*servSock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("socket"); return; } struct sockaddr_un saun, fsaun; saun.sun_family = AF_UNIX; strcpy(saun.sun_path, address); unlink(saun.sun_path); int len = sizeof(saun.sun_family) + strlen(saun.sun_path) + 1; if (bind(*servSock, (struct sockaddr *)&saun, len) < 0) { perror("server: bind"); return; } while (1) { if (listen(*servSock, 5) < 0) { perror("server: listen"); return; } int ns; unsigned fromlen; if ((ns = accept(*servSock, (struct sockaddr *)&fsaun, &fromlen)) < 0) { perror("server: accept"); } int recv_len = 0; char request[128]; char response_buf[4096]; /* Main server loop. */ while ((recv_len = recv(ns, request, 128, 0)) > 0) { request[recv_len] = 0; request_handler(response_buf, request); if (send(ns, response_buf, strlen(response_buf), 0) == -1) { perror("send"); break; } } } }