From f5d1239d28cf6847c7663883028ad5e4306ddbcd Mon Sep 17 00:00:00 2001 From: Sergey Popov Date: Fri, 6 Apr 2012 16:05:31 +0400 Subject: [PATCH] quick and dirty draft implementation of server-side UNIX socket handler --- daemon/yasnd-sock.c | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/daemon/yasnd-sock.c b/daemon/yasnd-sock.c index c518336..c7b6ceb 100644 --- a/daemon/yasnd-sock.c +++ b/daemon/yasnd-sock.c @@ -1,7 +1,103 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "yasnd-log.h" + +const char sock_path[]="./demo_socket"; +pthread_t server_thread_handle; // server socket thread handle +int socket_fd; // server socket descriptor + +void* connection_handler(void* param) +{ + // Get connection descriptor + int connection_fd=*(int*)param; + + int nbytes; + char buffer[256]; + char tmpbuf[512]; + + nbytes = read(connection_fd, buffer, 256); + buffer[nbytes] = 0; + + sprintf(tmpbuf,"MESSAGE FROM CLIENT: %s\n", buffer); + log_event(tmpbuf); + + close(connection_fd); + + pthread_exit(0); +} + +void* server_socket(void* param) +{ + struct sockaddr_un address; + int connection_fd; + socklen_t address_length; + + pthread_t child_handle; // connection thread handle + + socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); + if(socket_fd < 0) + { + log_event("socket creation failed"); + return (void*)1; + } + + // Remove old socket file + unlink(sock_path); + + // start with a clean address structure + memset(&address, 0, sizeof(struct sockaddr_un)); + + address.sun_family = AF_UNIX; + snprintf(address.sun_path, UNIX_PATH_MAX, sock_path); + + if(bind(socket_fd, + (struct sockaddr *) &address, + sizeof(struct sockaddr_un)) != 0) + { + log_event("bind() call failed"); + return (void*)1; + } + + if(listen(socket_fd, 5) != 0) + { + log_event("listen() call failed"); + return (void*)1; + } + + while((connection_fd = accept(socket_fd, (struct sockaddr *) &address, &address_length)) > -1) + { + if(pthread_create(&child_handle,NULL,connection_handler,&connection_fd) != 0) + { + log_event("Client connection thread creation failed"); + } + else + pthread_detach(child_handle); + } + + return (void*)0; +} + int sock_init() { + if(pthread_create(&server_thread_handle,NULL,server_socket,NULL) != 0) + { + log_event("Server socket thread creation failed"); + } } void sock_close() { + // Terminate server socket handling thread + pthread_cancel(server_thread_handle); + // Close server socket + close(socket_fd); + // Remove unneeded socket file + unlink(sock_path); }