/**** POSIX *******************************************************************/ #include #include #include #include #include #include /**** RELABSD *****************************************************************/ #include #include /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ /******************************************************************************/ static int create_socket (int result [const restrict static 1]) { errno = 0; *result = socket(AF_UNIX, SOCK_STREAM, 0); if (*result == -1) { RELABSD_FATAL ( "Unable to create server socket: %s.", strerror(errno) ); return -1; } return 0; } static int bind_socket ( const char socket_name [const restrict static 1], const int socket ) { struct sockaddr_un addr; memset(&addr, 0, sizeof(struct sockaddr_un)); addr.sun_family = AF_UNIX; strncpy ( (void *) addr.sun_path, (const void *) socket_name, (sizeof(addr.sun_path) - 1) ); errno = 0; if ( bind ( socket, (const struct sockaddr *) &addr, (socklen_t) sizeof(struct sockaddr_un) ) == -1 ) { RELABSD_FATAL ( "Unable to bind communication socket to %s: %s.", socket_name, strerror(errno) ); return -1; } return 0; } /* static int set_socket_to_unblocking (const int socket) { int current_flags; errno = 0; current_flags = fcntl(socket, F_GETFD); if (current_flags == -1) { RELABSD_FATAL ( "Unable to get communication socket properties: %s.", strerror(errno) ); return -1; } errno = 0; current_flags = fcntl(socket, F_SETFD, (current_flags | O_NONBLOCK)); if (current_flags == -1) { RELABSD_FATAL ( "Unable to set communication socket properties: %s.", strerror(errno) ); return -2; } return 0; } */ static int set_socket_as_listener (const int socket) { errno = 0; if (listen(socket, 0) == -1) { RELABSD_FATAL ( "Unable to set server socket properties: %s.", strerror(errno) ); return -1; } return 0; } /******************************************************************************/ /**** EXPORTED FUNCTIONS ******************************************************/ /******************************************************************************/ int relabsd_server_create_communication_node ( const char socket_name [const restrict static 1], int socket [const restrict static 1] ) { if (create_socket(socket) < 0) { return -1; } if (bind_socket(socket_name, *socket) < 0) { (void) close(*socket); return -1; } if (set_socket_as_listener(*socket) < 0) { (void) close(*socket); return -1; } return 0; } void relabsd_server_destroy_communication_node ( const char socket_name [const restrict static 1], const int socket ) { errno = 0; if (close(socket) == -1) { RELABSD_WARNING ( "Could not properly close the communication socket: %s.", strerror(errno) ); } errno = 0; if (remove(socket_name) == -1) { RELABSD_ERROR ( "Could not remove communication node %s. Please delete it manually." " Error: %s.", socket_name, strerror(errno) ); } RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Destroyed communication node."); }