diff options
Diffstat (limited to 'dpid')
-rw-r--r-- | dpid/dpid.c | 348 | ||||
-rw-r--r-- | dpid/dpid.h | 30 | ||||
-rw-r--r-- | dpid/dpid_common.h | 2 | ||||
-rw-r--r-- | dpid/dpidc | 16 | ||||
-rw-r--r-- | dpid/main.c | 64 |
5 files changed, 191 insertions, 269 deletions
diff --git a/dpid/dpid.c b/dpid/dpid.c index 8d325694..70f59a62 100644 --- a/dpid/dpid.c +++ b/dpid/dpid.c @@ -19,11 +19,13 @@ * Main functions to set-up dpi information and to initialise sockets */ #include <errno.h> -#include <stdlib.h> /* for exit */ -#include <fcntl.h> /* for F_SETFD, F_GETFD, FD_CLOEXEC */ +#include <stdlib.h> /* for exit */ +#include <fcntl.h> /* for F_SETFD, F_GETFD, FD_CLOEXEC */ #include <sys/stat.h> #include <sys/wait.h> +#include <sys/socket.h> + #include <unistd.h> #include "dpid_common.h" #include "dpid.h" @@ -37,70 +39,11 @@ volatile sig_atomic_t caught_sigchld = 0; -/*! Return the basename of a filename - */ -static char *get_basename(char *filename) -{ - char *p; - - if (filename && (p = strrchr(filename, '/'))) { - filename = p + 1; - } - return filename; -} - -/*! Close and remove the sockets in the - * given dpi attribute list - */ -void rm_dpi_sockets(struct dp *dpi_attr_list, int numdpis) -{ - int i; - - for (i = 0; i < numdpis; i++) { - a_Misc_close_fd(dpi_attr_list[i].socket); - (void) unlink(dpi_attr_list[i].sockpath); - } -} - -/*! Close and remove inactive dpi sockets - * \Return - * Number of active dpis. +/*! Remove UDS filenames */ -int rm_inactive_dpi_sockets(struct dp *dpi_attr_list, int numdpis) +void cleanup() { - int i, active = 0; - for (i = 0; i < numdpis; i++) { - if (dpi_attr_list[i].pid == 1) { - a_Misc_close_fd(dpi_attr_list[i].socket); - (void) unlink(dpi_attr_list[i].sockpath); - } else - active++; - } - return (active); -} - -/*! Remove sockets - */ -void cleanup(char *socket_dir) -{ - DIR *dir; - struct dirent *dir_entry = NULL; - char *sockpath; - - dir = opendir(socket_dir); - if (dir == NULL) { - ERRMSG("cleanup", "opendir", errno); - return; - } - while ( (dir_entry = readdir(dir)) != NULL ) { - if (dir_entry->d_name[0] == '.') - continue; - sockpath = dStrconcat(socket_dir, "/", dir_entry->d_name, NULL); - unlink(sockpath); - dFree(sockpath); - } - closedir(dir); } /*! Free memory used to describe @@ -116,10 +59,6 @@ void free_dpi_attr(struct dp *dpi_attr) dFree(dpi_attr->path); dpi_attr->path = NULL; } - if (dpi_attr->sockpath != NULL) { - dFree(dpi_attr->sockpath); - dpi_attr->sockpath = NULL; - } } /*! Free memory used by the plugin list @@ -306,7 +245,7 @@ int get_dpi_attr(char *dpi_dir, char *service, struct dp *dpi_attr) dpi_attr->path = dStrconcat(service_dir, "/", dir_entry->d_name, NULL); dpi_attr->id = dStrdup(service); - dpi_attr->sockpath = NULL; + dpi_attr->port = 0; dpi_attr->pid = 1; if (strstr(dpi_attr->path, ".filter") != NULL) dpi_attr->filter = 1; @@ -573,127 +512,122 @@ int fill_services_list(struct dp *attlist, int numdpis, Dlist **services_list) return (dList_length(*services_list)); } -/*! Initialise the service request socket - * \Return: - * \li Number of sockets (1 == success) +/*! Bind a socket port on localhost. Try to be close to base_port. + * \Return + * \li listening socket file descriptor on success * \li -1 on failure */ -int init_srs_socket(char *sockdir) +int bind_socket_fd(int base_port, int *p_port) { - int retval = -1; - struct sockaddr_un srs_sa; - size_t sun_path_len; - socklen_t addr_sz; + int sock_fd, port; + struct sockaddr_in sin; + //size_t sock_buflen = 8192; + int ok = 0, last_port = base_port + 50; - srs_name = dStrconcat(sockdir, "/", SRS_NAME, NULL); - FD_ZERO(&sock_set); + if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + ERRMSG("bind_socket_fd", "socket", errno); + return (-1); /* avoids nested ifs */ + } + /* Set the socket FD to close on exec */ + fcntl(sock_fd, F_SETFD, FD_CLOEXEC | fcntl(sock_fd, F_GETFD)); - /* Initialise srs, service request socket on startup */ - if ((srs = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1) { - ERRMSG("init_srs_socket", "socket", errno); - return (retval); /* avoids nesting ifs too deeply */ + /* set some buffering to increase the transfer's speed */ + //setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, + // &sock_buflen, (socklen_t)sizeof(sock_buflen)); + + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + /* Try to bind a port on localhost */ + for (port = base_port; port <= last_port; ++port) { + sin.sin_port = htons(port); + if ((bind(sock_fd, (struct sockaddr *)&sin, sizeof(sin))) == -1) { + if (errno == EADDRINUSE || errno == EADDRNOTAVAIL) + continue; + ERRMSG("bind_socket_fd", "bind", errno); + } else if (listen(sock_fd, QUEUE) == -1) { + ERRMSG("bind_socket_fd", "listen", errno); + } else { + *p_port = port; + ok = 1; + break; + } + } + if (port > last_port) { + MSG_ERR("Hey! Can't find an available port from %d to %d\n", + base_port, last_port); } - /* Set srs to close on exec */ - fcntl(srs, F_SETFD, FD_CLOEXEC | fcntl(srs, F_GETFD)); - srs_sa.sun_family = AF_LOCAL; + return ok ? sock_fd : -1; +} - sun_path_len = sizeof(srs_sa.sun_path); - if (strlen(srs_name) > sun_path_len) { - ERRMSG("init_srs_socket", "srs_name is too long", 0); - MSG_ERR("\n - it should be <= %lu chars", (ulong_t)sun_path_len); - MSG_ERR("\n - srs_name = %s\n", srs_name); - return(retval); +/*! Save the current port in a file so dillo can find it. + * \Return: + * \li -1 on failure + */ +int save_comm_keys(int srs_port) +{ + int fd; + char *fname, ret = -1, port_str[16]; + + fname = dStrconcat(dGethomedir(), "/", dotDILLO_DPID_COMM_KEYS, NULL); + fd = open(fname, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + dFree(fname); + if (fd == -1) { + MSG("save_comm_keys: open %s\n", dStrerror(errno)); + } else { + snprintf(port_str, 8, "%d\n", srs_port); + if (CKD_WRITE(fd, port_str) != -1) + ret = 1; } - strncpy(srs_sa.sun_path, srs_name, sun_path_len); - addr_sz = (socklen_t) D_SUN_LEN(&srs_sa); - if ((bind(srs, (struct sockaddr *) &srs_sa, addr_sz)) == -1) { - if (errno == EADDRINUSE) { - ERRMSG("init_srs_socket", "bind", errno); - MSG_ERR("srs_sa.sun_path = %s\n", srs_sa.sun_path); - dpi_errno = dpid_srs_addrinuse; - } else { - ERRMSG("init_srs_socket", "bind", errno); - MSG_ERR("srs_sa.sun_path = %s\n", srs_sa.sun_path); + return ret; +} + +/*! Initialise the service request socket (IDS) + * \Return: + * \li Number of sockets (1 == success) + * \li -1 on failure + */ +int init_ids_srs_socket() +{ + int srs_port, ret = -1; + + FD_ZERO(&sock_set); + + if ((srs_fd = bind_socket_fd(DPID_BASE_PORT, &srs_port)) != -1) { + /* save port number */ + if (save_comm_keys(srs_port) != -1) { + FD_SET(srs_fd, &sock_set); + ret = 1; } - } else if (chmod(srs_sa.sun_path, S_IRUSR | S_IWUSR) == -1) { - ERRMSG("init_srs_socket", "chmod", errno); - MSG_ERR("srs_sa.sun_path = %s\n", srs_sa.sun_path); - } else if (listen(srs, QUEUE) == -1) { - ERRMSG("init_srs_socket", "listen", errno); - } else { - retval = 1; } - FD_SET(srs, &sock_set); - return (retval); + return ret; } -/*! Initialise a single dpi socket +/*! Initialize a single dpi socket * \Return * \li 1 on success * \li -1 on failure */ -int init_dpi_socket(struct dp *dpi_attr, char *sockdir) +int init_dpi_socket(struct dp *dpi_attr) { - int caught_error = 0, s; - char *dpi_nm; /* pointer to basename in dpi_attr->path */ - struct sockaddr_un sa; - size_t sp_len; - socklen_t addr_sz; - size_t sock_buflen = 8192; - - sp_len = sizeof(sa.sun_path); - if ((s = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1) { - ERRMSG("init_all_dpi_sockets", "socket", errno); - return (-1); /* avoids nested ifs */ - } - /* Set the socket FD to close on exec */ - fcntl(s, F_SETFD, FD_CLOEXEC | fcntl(s, F_GETFD)); + int s_fd, port, ret = -1; - /* set some buffering to increase the transfer's speed */ - setsockopt(s, SOL_SOCKET, SO_SNDBUF, - &sock_buflen, (socklen_t)sizeof(sock_buflen)); - - dpi_attr->socket = s; - dpi_attr->sa.sun_family = AF_LOCAL; - dpi_nm = get_basename(dpi_attr->path); - - dpi_attr->sockpath = dStrconcat(sockdir, "/", dpi_nm, "-XXXXXX", NULL); - a_Misc_mkfname(dpi_attr->sockpath); - if (strlen(dpi_attr->sockpath) > sp_len) { - ERRMSG("init_all_dpi_sockets", "socket path is too long", 0); - MSG_ERR("\n - it should be <= %lu chars", (ulong_t)sp_len); - MSG_ERR("\n - socket path = %s\n", dpi_attr->sockpath); - return(-1); - } - strncpy(dpi_attr->sa.sun_path, dpi_attr->sockpath, sp_len); - addr_sz = (socklen_t) D_SUN_LEN(&dpi_attr->sa); - - if ((bind(s, (struct sockaddr *) &dpi_attr->sa, addr_sz)) == -1) { - ERRMSG("init_all_dpi_sockets", "bind", errno); - MSG_ERR("%s\n", dpi_attr->sa.sun_path); - caught_error = 1; - } else if (chmod(dpi_attr->sa.sun_path, S_IRUSR | S_IWUSR) == -1) { - ERRMSG("init_all_dpi_sockets", "chmod", errno); - MSG_ERR("%s\n", dpi_attr->sa.sun_path); - caught_error = 1; - } else if (listen(s, QUEUE) == -1) { - ERRMSG("init_all_dpi_sockets", "listen", errno); - caught_error = 1; - } - - if (caught_error) { - return (-1); - } else { - FD_SET(s, &sock_set); - return (1); + if ((s_fd = bind_socket_fd(DPID_BASE_PORT, &port)) != -1) { + dpi_attr->sock_fd = s_fd; + dpi_attr->port = port; + FD_SET(s_fd, &sock_set); + ret = 1; } + + return ret; } /*! Setup sockets for the plugins and add them to - * to the set of sockets (sock_set) watched by select. + * the set of sockets (sock_set) watched by select. * \Return * \li Number of sockets on success * \li -1 on failure @@ -702,17 +636,13 @@ int init_dpi_socket(struct dp *dpi_attr, char *sockdir) * \Uses * numdpis, srs, srs_name */ -int init_all_dpi_sockets(struct dp *dpi_attr_list, char *sockdir) +int init_all_dpi_sockets(struct dp *dpi_attr_list) { int i; - struct sockaddr_un sa; - size_t sp_len; - - sp_len = sizeof(sa.sun_path); /* Initialise sockets for each dpi */ for (i = 0; i < numdpis; i++) { - if (init_dpi_socket(dpi_attr_list + i, sockdir) == -1) + if (init_dpi_socket(dpi_attr_list + i) == -1) return (-1); numsocks++; } @@ -741,7 +671,7 @@ void handle_sigchld(void) for (i = 0; i < numdpis; i++) { if (waitpid(dpi_attr_list[i].pid, &status, WNOHANG) > 0) { dpi_attr_list[i].pid = 1; - FD_SET(dpi_attr_list[i].socket, &sock_set); + FD_SET(dpi_attr_list[i].sock_fd, &sock_set); numsocks++; } } @@ -772,43 +702,34 @@ void est_dpi_sigchld(void) void stop_active_dpis(struct dp *dpi_attr_list, int numdpis) { static char *DpiBye_cmd = NULL; - int i, dpi_socket, rc; - struct sockaddr_un dpi_addr; - struct sockaddr_un sa; - size_t sun_path_len, addr_len; + int i, sock_fd; + struct sockaddr_in sin; if (!DpiBye_cmd) DpiBye_cmd = a_Dpip_build_cmd("cmd=%s", "DpiBye"); - sun_path_len = sizeof(sa.sun_path); - - dpi_addr.sun_family = AF_LOCAL; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); for (i = 0; i < numdpis; i++) { /* Skip inactive dpis and filters */ if (dpi_attr_list[i].pid == 1 || dpi_attr_list[i].filter) continue; - if ((dpi_socket = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1) { + if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { ERRMSG("stop_active_dpis", "socket", errno); + continue; } - if (strlen(dpi_attr_list[i].sockpath) > sun_path_len) { - ERRMSG("stop_active_dpis", "socket path is too long", 0); - MSG_ERR("\n - it should be <= %lu chars",(ulong_t)sun_path_len); - MSG_ERR("\n - socket path = %s\n", dpi_attr_list[i].sockpath); - } - strncpy(dpi_addr.sun_path, dpi_attr_list[i].sockpath, sun_path_len); - addr_len = D_SUN_LEN(&dpi_addr); - if (connect(dpi_socket, (struct sockaddr *) &dpi_addr, addr_len) == -1) { + sin.sin_port = htons(dpi_attr_list[i].port); + if (connect(sock_fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) { ERRMSG("stop_active_dpis", "connect", errno); - MSG_ERR("%s\n", dpi_addr.sun_path); - } - rc = write(dpi_socket, DpiBye_cmd, strlen(DpiBye_cmd)); - if (rc == -1) { + MSG_ERR("%s\n", dpi_attr_list[i].path); + } else if (write(sock_fd, DpiBye_cmd, strlen(DpiBye_cmd)) == -1) { MSG("stop_active_dpis: Error on sending BYE command: %s\n", dStrerror(errno)); } - a_Misc_close_fd(dpi_socket); + a_Misc_close_fd(sock_fd); } } @@ -821,8 +742,8 @@ void ignore_dpi_sockets(struct dp *dpi_attr_list, int numdpis) int i; for (i = 0; i < numdpis; i++) { - FD_CLR(dpi_attr_list[i].socket, &sock_set); - a_Misc_close_fd(dpi_attr_list[i].socket); + FD_CLR(dpi_attr_list[i].sock_fd, &sock_set); + a_Misc_close_fd(dpi_attr_list[i].sock_fd); } } @@ -833,20 +754,19 @@ void ignore_dpi_sockets(struct dp *dpi_attr_list, int numdpis) * \Return * Number of available dpis */ -int register_all_cmd(char *sockdir) +int register_all_cmd() { stop_active_dpis(dpi_attr_list, numdpis); - rm_dpi_sockets(dpi_attr_list, numdpis); free_plugin_list(&dpi_attr_list, numdpis); free_services_list(services_list); services_list = NULL; numdpis = 0; numsocks = 1; /* the srs socket */ FD_ZERO(&sock_set); - FD_SET(srs, &sock_set); + FD_SET(srs_fd, &sock_set); numdpis = register_all(&dpi_attr_list); fill_services_list(dpi_attr_list, numdpis, &services_list); - numsocks = init_all_dpi_sockets(dpi_attr_list, sockdir); + numsocks = init_all_dpi_sockets(dpi_attr_list); return (numdpis); } @@ -855,7 +775,7 @@ int register_all_cmd(char *sockdir) * \Return * message on success, NULL on failure */ -char *get_message(int sock, char *dpi_tag) +char *get_message(int sock_fd, char *dpi_tag) { char *msg, *d_cmd; @@ -864,7 +784,7 @@ char *get_message(int sock, char *dpi_tag) ERRMSG("get_message", "failed to parse msg", 0); d_cmd = a_Dpip_build_cmd("cmd=%s msg=%s", "DpiError", "Failed to parse request"); - (void) CKD_WRITE(sock, d_cmd); + (void) CKD_WRITE(sock_fd, d_cmd); dFree(d_cmd); } return (msg); @@ -889,40 +809,30 @@ int service_match(const struct service *A, const char *B) } /*! - * Send socket path that matches dpi_id to client + * Send socket port that matches dpi_id to client */ -void send_sockpath(int sock, char *dpi_tag, struct dp *dpi_attr_list) +void send_sockport(int sock_fd, char *dpi_tag, struct dp *dpi_attr_list) { int i; - char *dpi_id; - char *d_cmd; + char *dpi_id, *d_cmd, port_str[16]; struct service *serv; - dReturn_if_fail((dpi_id = get_message(sock, dpi_tag)) != NULL); + dReturn_if_fail((dpi_id = get_message(sock_fd, dpi_tag)) != NULL); serv = dList_find_custom(services_list,dpi_id,(dCompareFunc)service_match); if (serv == NULL || (i = serv->dp_index) == -1) for (i = 0; i < numdpis; i++) if (!strncmp(dpi_attr_list[i].id, dpi_id, - dpi_attr_list[i].id - strchr(dpi_attr_list[i].id, '.'))) + dpi_attr_list[i].id - strchr(dpi_attr_list[i].id, '.'))) break; if (i < numdpis) { /* found */ - if (access(dpi_attr_list[i].path, F_OK) == -1) { - ERRMSG("send_sockpath", "access", errno); - MSG_ERR(" - %s\n", dpi_attr_list[i].sockpath); - d_cmd = a_Dpip_build_cmd("cmd=%s msg=%s", - "DpiError", "Plugin currently unavailable"); - (void) CKD_WRITE(sock, d_cmd); - dFree(d_cmd); - } else { - d_cmd = a_Dpip_build_cmd("cmd=%s msg=%s", - "send_data", dpi_attr_list[i].sockpath); - (void) CKD_WRITE(sock, d_cmd); - dFree(d_cmd); - } + snprintf(port_str, 8, "%d", dpi_attr_list[i].port); + d_cmd = a_Dpip_build_cmd("cmd=%s msg=%s", "send_data", port_str); + (void) CKD_WRITE(sock_fd, d_cmd); + dFree(d_cmd); } dFree(dpi_id); diff --git a/dpid/dpid.h b/dpid/dpid.h index 5c5aa3f8..7302356b 100644 --- a/dpid/dpid.h +++ b/dpid/dpid.h @@ -6,9 +6,10 @@ #define DPID_H #include <sys/socket.h> -#include <sys/select.h> /* for fd_set */ +#include <sys/select.h> /* for fd_set */ #include <sys/un.h> -#include <signal.h> /* for sig_atomic_t */ +#include <signal.h> /* for sig_atomic_t */ +#include <netinet/in.h> /* for ntohl, IPPORT_USERRESERVED and stuff */ #include "d_size.h" @@ -16,21 +17,22 @@ #define PATH_LEN 50 #define CMDLEN 20 #define MSGLEN 50 +#define DPID_BASE_PORT (IPPORT_USERRESERVED + 20) + /*! \TODO: Should read this from dillorc */ #define SRS_NAME "dpid.srs" char *srs_name; -/*! dpid service request socket */ -int srs; +/*! dpid's service request socket file descriptor */ +int srs_fd; /*! plugin state information */ struct dp { char *id; char *path; - char *sockpath; - int socket; - struct sockaddr_un sa; + int sock_fd; + int port; pid_t pid; int filter; }; @@ -62,9 +64,7 @@ extern volatile sig_atomic_t caught_sigchld; void rm_dpi_sockets(struct dp *dpi_attr_list, int numdpis); -int rm_inactive_dpi_sockets(struct dp *dpi_attr_list, int numdpis); - -void cleanup(char *socket_dir); +void cleanup(); void free_dpi_attr(struct dp *dpi_attr); @@ -82,11 +82,11 @@ int register_all(struct dp **attlist); int fill_services_list(struct dp *attlist, int numdpis, Dlist **services_list); -int init_srs_socket(char *sockdir); +int init_ids_srs_socket(); -int init_dpi_socket(struct dp *dpi_attr, char *sockdir); +int init_dpi_socket(struct dp *dpi_attr); -int init_all_dpi_sockets(struct dp *dpi_attr_list, char *sockdir); +int init_all_dpi_sockets(struct dp *dpi_attr_list); void dpi_sigchld(int sig); @@ -98,12 +98,12 @@ void stop_active_dpis(struct dp *dpi_attr_list, int numdpis); void ignore_dpi_sockets(struct dp *dpi_attr_list, int numdpis); -int register_all_cmd(char *sockdir); +int register_all_cmd(); char *get_message(int sock, char *dpi_tag); int service_match(const struct service *A, const char *B); -void send_sockpath(int sock, char * dpi_tag, struct dp *dpi_attr_list); +void send_sockport(int sock_fd, char * dpi_tag, struct dp *dpi_attr_list); #endif diff --git a/dpid/dpid_common.h b/dpid/dpid_common.h index 5a792b04..65b8bc89 100644 --- a/dpid/dpid_common.h +++ b/dpid/dpid_common.h @@ -23,6 +23,8 @@ #define dotDILLO_DPI ".dillo/dpi" #define dotDILLO_DPIDRC ".dillo/dpidrc" +#define dotDILLO_DPID_COMM_KEYS ".dillo/dpid_comm_keys" + #define ERRMSG(CALLER, CALLED, ERR)\ errmsg(CALLER, CALLED, ERR, __FILE__, __LINE__) #define _ERRMSG(CALLER, CALLED, ERR) @@ -7,14 +7,20 @@ # stop: Stops dpid. use strict; -use IO::Socket::UNIX; +use IO::Socket::INET; # Get socket directory name -open(DSD, "<$ENV{HOME}/.dillo/dpi_socket_dir"); -my $dir = <DSD>; +#open(DSD, "<$ENV{HOME}/.dillo/dpi_socket_dir"); +#my $dir = <DSD>; +#close(DSD); + +# Get dpid's listening port from saved file +open(DSD, "<$ENV{HOME}/.dillo/dpid_comm_keys"); +my $port = <DSD>; close(DSD); +print "Got: localhost:$port\n"; -my $socket = IO::Socket::UNIX->new(Peer => "$dir/dpid.srs", Type => SOCK_STREAM, Timeout => 1000 ) or die "new: $@"; +my $socket = IO::Socket::INET->new(Peer => "localhost:$port", Type => SOCK_STREAM, Timeout => 1000 ) or die "new: $@"; $socket->autoflush(1); @@ -23,7 +29,7 @@ my %dpi_command = ( "stop" => "<dpi cmd='DpiBye' '>", ); -if ( exists($dpi_command{$ARGV[0]}) ) { +if ( $#ARGV == 0 && exists($dpi_command{$ARGV[0]}) ) { print $socket $dpi_command{$ARGV[0]}; } else { close($socket); diff --git a/dpid/main.c b/dpid/main.c index 7ecae76a..fcb11cef 100644 --- a/dpid/main.c +++ b/dpid/main.c @@ -15,11 +15,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <errno.h> /* for ckd_write */ -#include <unistd.h> /* for ckd_write */ -#include <stdlib.h> /* for exit */ -#include <assert.h> /* for assert */ -#include <sys/stat.h> /* for umask */ +#include <errno.h> /* for ckd_write */ +#include <unistd.h> /* for ckd_write */ +#include <stdlib.h> /* for exit */ +#include <assert.h> /* for assert */ +#include <sys/stat.h> /* for umask */ #include "dpid_common.h" #include "dpid.h" @@ -45,7 +45,7 @@ static int start_filter_plugin(struct dp dpi_attr) csz = (socklen_t) sizeof(clnt_addr); - newsock = accept(dpi_attr.socket, (struct sockaddr *) &clnt_addr, &csz); + newsock = accept(dpi_attr.sock_fd, (struct sockaddr *) &clnt_addr, &csz); if (newsock == -1) ERRMSG("start_plugin", "accept", errno); @@ -90,12 +90,12 @@ static int start_filter_plugin(struct dp dpi_attr) static void start_server_plugin(struct dp dpi_attr) { - if (dup2(dpi_attr.socket, STDIN_FILENO) == -1) { + if (dup2(dpi_attr.sock_fd, STDIN_FILENO) == -1) { ERRMSG("start_plugin", "dup2", errno); MSG_ERR("ERROR in child proc for %s\n", dpi_attr.path); exit(1); } - if (a_Misc_close_fd(dpi_attr.socket) == -1) { + if (a_Misc_close_fd(dpi_attr.sock_fd) == -1) { ERRMSG("start_plugin", "close", errno); MSG_ERR("ERROR in child proc for %s\n", dpi_attr.path); exit(1); @@ -220,7 +220,6 @@ static int get_open_max(void) int main(void) { int i, n = 0, open_max; - char *dirname = NULL, *sockdir = NULL; int dpid_idle_timeout = 60 * 60; /* default, in seconds */ struct timeval select_timeout; sigset_t mask_none; @@ -250,6 +249,7 @@ int main(void) /* Get list of available dpis */ numdpis = register_all(&dpi_attr_list); +#if 0 /* Get name of socket directory */ dirname = a_Dpi_sockdir_file(); if ((sockdir = init_sockdir(dirname)) == NULL) { @@ -257,14 +257,16 @@ int main(void) MSG_ERR("Failed to create socket directory\n"); exit(1); } +#endif /* Init and get services list */ fill_services_list(dpi_attr_list, numdpis, &services_list); /* Remove any sockets that may have been leftover from a crash */ - cleanup(sockdir); + //cleanup(); + /* Initialise sockets */ - if ((numsocks = init_srs_socket(sockdir)) == -1) { + if ((numsocks = init_ids_srs_socket()) == -1) { switch (dpi_errno) { case dpid_srs_addrinuse: MSG_ERR("dpid refuses to start, possibly because:\n"); @@ -272,11 +274,12 @@ int main(void) MSG_ERR("\t2) A previous dpid didn't clean up on exit.\n"); exit(1); default: - ERRMSG("main", "init_srs_sockets failed", 0); + //ERRMSG("main", "init_srs_socket failed", 0); + ERRMSG("main", "init_ids_srs_socket failed", 0); exit(1); } } - numsocks = init_all_dpi_sockets(dpi_attr_list, sockdir); + numsocks = init_all_dpi_sockets(dpi_attr_list); //est_terminator(); /* Do we still want to clean up on an abnormal exit? */ est_dpi_sigchld(); @@ -308,7 +311,7 @@ int main(void) continue; stop_active_dpis(dpi_attr_list, numdpis); - cleanup(sockdir); + //cleanup(); exit(0); } } while (n == -1 && errno == EINTR); @@ -318,42 +321,42 @@ int main(void) exit(1); } /* If the service req socket is selected then service the req. */ - if (FD_ISSET(srs, &selected_set)) { - int sock; - socklen_t csz; - struct sockaddr_un clnt_addr; + if (FD_ISSET(srs_fd, &selected_set)) { + int sock_fd; + socklen_t sin_sz; + struct sockaddr_in sin; char *req = NULL; --n; assert(n >= 0); - csz = (socklen_t) sizeof(clnt_addr); - sock = accept(srs, (struct sockaddr *) &clnt_addr, &csz); - if (sock == -1) { + sin_sz = (socklen_t) sizeof(sin); + sock_fd = accept(srs_fd, (struct sockaddr *)&sin, &sin_sz); + if (sock_fd == -1) { ERRMSG("main", "accept", errno); MSG_ERR("accept on srs socket failed\n"); MSG_ERR("service pending connections, and continue\n"); } else { int command; - req = get_request(sock); - command = get_command(sock, req); + req = get_request(sock_fd); + command = get_command(sock_fd, req); switch (command) { case BYE_CMD: stop_active_dpis(dpi_attr_list, numdpis); - cleanup(sockdir); + //cleanup(); exit(0); break; case CHECK_SERVER_CMD: - send_sockpath(sock, req, dpi_attr_list); + send_sockport(sock_fd, req, dpi_attr_list); break; case REGISTER_ALL_CMD: - register_all_cmd(sockdir); + register_all_cmd(); break; case UNKNOWN_CMD: { char *d_cmd = a_Dpip_build_cmd("cmd=%s msg=%s", "DpiError", "Unknown command"); - (void) CKD_WRITE(sock, d_cmd); + (void) CKD_WRITE(sock_fd, d_cmd); dFree(d_cmd); ERRMSG("main", "Unknown command", 0); MSG_ERR(" for request: %s\n", req); @@ -365,14 +368,14 @@ int main(void) } if (req) free(req); - a_Misc_close_fd(sock); + a_Misc_close_fd(sock_fd); } } /* While there's a request on one of the plugin sockets * find the matching plugin and start it. */ for (i = 0; n > 0 && i < numdpis; i++) { - if (FD_ISSET(dpi_attr_list[i].socket, &selected_set)) { + if (FD_ISSET(dpi_attr_list[i].sock_fd, &selected_set)) { --n; assert(n >= 0); @@ -386,11 +389,12 @@ int main(void) * on its socket */ numsocks--; assert(numsocks >= 0); - FD_CLR(dpi_attr_list[i].socket, &sock_set); + FD_CLR(dpi_attr_list[i].sock_fd, &sock_set); if ((dpi_attr_list[i].pid = fork()) == -1) { ERRMSG("main", "fork", errno); /* exit(1); */ } else if (dpi_attr_list[i].pid == 0) { + /* child */ (void) sigprocmask(SIG_SETMASK, &mask_none, NULL); start_server_plugin(dpi_attr_list[i]); } |