* This is a generic function to set up a master socket for listening on
* a TCP port. The server shuts down if the bind fails.
*
- * If a negative number is specified, a Unix domain socket is created.
*/
int ig_tcp_server(int port_number, int queue_len)
{
struct sockaddr_in sin;
- struct sockaddr_un addr;
int s, i;
- int is_unix = 0;
- if (port_number < 0) {
- is_unix = 1;
- }
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = INADDR_ANY;
+ sin.sin_port = htons((u_short)port_number);
- if (is_unix) {
- memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- sprintf(addr.sun_path, USOCKPATH, 0-port_number);
- }
- else {
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = INADDR_ANY;
- sin.sin_port = htons((u_short)port_number);
+ s = socket(PF_INET, SOCK_STREAM,
+ (getprotobyname("tcp")->p_proto));
+
+ if (s < 0) {
+ lprintf(1, "citserver: Can't create a socket: %s\n",
+ strerror(errno));
+ return(-1);
}
- if (is_unix) {
- s = socket(AF_UNIX, SOCK_STREAM, 0);
+ i = 1;
+ setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
+
+ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+ lprintf(1, "citserver: Can't bind: %s\n",
+ strerror(errno));
+ return(-1);
}
- else {
- s = socket(PF_INET, SOCK_STREAM,
- (getprotobyname("tcp")->p_proto));
+
+ if (listen(s, queue_len) < 0) {
+ lprintf(1, "citserver: Can't listen: %s\n", strerror(errno));
+ return(-1);
}
+ return(s);
+}
+
+
+
+/*
+ * Create a Unix domain socket and listen on it
+ */
+int ig_uds_server(char *sockpath, int queue_len)
+{
+ struct sockaddr_un addr;
+ int s;
+
+ unlink(sockpath);
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ safestrncpy(addr.sun_path, sockpath, sizeof addr.sun_path);
+
+ s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
lprintf(1, "citserver: Can't create a socket: %s\n",
strerror(errno));
return(-1);
}
- /* Set the SO_REUSEADDR socket option, because it makes sense. */
- if (!is_unix) {
- i = 1;
- setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
- }
-
- if (is_unix) {
- if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- lprintf(1, "citserver: Can't bind: %s\n",
- strerror(errno));
- return(-1);
- }
- }
- else {
- if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
- lprintf(1, "citserver: Can't bind: %s\n",
- strerror(errno));
- return(-1);
- }
+ if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+ lprintf(1, "citserver: Can't bind: %s\n",
+ strerror(errno));
+ return(-1);
}
if (listen(s, queue_len) < 0) {
*/
void sysdep_master_cleanup(void) {
struct ServiceFunctionHook *serviceptr;
- char sockpath[256];
/*
* close all protocol master sockets
close(serviceptr->msock);
/* If it's a Unix domain socket, remove the file. */
- if (serviceptr->tcp_port < 0) {
- sprintf(sockpath, USOCKPATH, 0-(serviceptr->tcp_port));
- lprintf(9, "Removing <%s>\n", sockpath);
- unlink(sockpath);
+ if (serviceptr->sockpath != NULL) {
+ unlink(serviceptr->sockpath);
}
}
}
* Bind the server to our favorite ports.
*/
CtdlRegisterServiceHook(config.c_port_number, /* TCP */
+ NULL,
citproto_begin_session,
do_command_loop);
- CtdlRegisterServiceHook(0-config.c_port_number, /* Unix */
+ CtdlRegisterServiceHook(0, /* TCP */
+ "citadel.socket",
citproto_begin_session,
do_command_loop);