0
#define min(a,b) (a < b ? a : b)
0
#define ramp(a) (a > 0 ? a : 0)
0
-static int server_socket_unix(const char *path, int access_mask);
0
static void client_init(ebb_client *client);
0
static void set_nonblock(int fd)
0
@@ -469,29 +468,43 @@ void ebb_server_unlisten(ebb_server *server)
0
ev_io_stop(server->loop, &server->request_watcher);
0
- if(server->socketpath)
0
+ if(server->socketpath) {
0
unlink(server->socketpath);
0
+ server->socketpath = NULL;
0
int ebb_server_listen_on_fd(ebb_server *server, const int sfd)
0
+ if (listen(sfd, EBB_MAX_CLIENTS) < 0) {
0
+ assert(server->port == NULL);
0
+ assert(server->socketpath == NULL);
0
assert(server->open == FALSE);
0
server->request_watcher.data = server;
0
ev_init (&server->request_watcher, on_request);
0
ev_io_set (&server->request_watcher, server->fd, EV_READ | EV_ERROR);
0
ev_io_start (server->loop, &server->request_watcher);
0
int ebb_server_listen_on_port(ebb_server *server, const int port)
0
@@ -504,8 +517,6 @@ int ebb_server_listen_on_port(ebb_server *server, const int port)
0
setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void *)&flags, sizeof(flags));
0
setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&flags, sizeof(flags));
0
@@ -526,15 +537,64 @@ int ebb_server_listen_on_port(ebb_server *server, const int port)
0
- if (listen(sfd, EBB_MAX_CLIENTS) < 0) {
0
+ int ret = ebb_server_listen_on_fd(server, sfd);
0
+ assert(server->port == NULL);
0
+ server->port = malloc(sizeof(char)*8); /* for easy access to the port */
0
+ sprintf(server->port, "%d", port);
0
+ if(sfd > 0) close(sfd);
0
+int ebb_server_listen_on_unix_socket(ebb_server *server, const char *socketpath)
0
+ struct linger ling = {0, 0};
0
+ struct sockaddr_un addr;
0
+ int access_mask = 0777;
0
+ if(( sfd = socket(AF_UNIX, SOCK_STREAM, 0) ) == -1) {
0
+ /* Clean up a previous socket file if we left it around */
0
+ if(lstat(socketpath, &tstat) == 0 && S_ISSOCK(tstat.st_mode))
0
+ setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void *)&flags, sizeof(flags));
0
+ setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&flags, sizeof(flags));
0
+ setsockopt(sfd, SOL_SOCKET, SO_LINGER, (void *)&ling, sizeof(ling));
0
+ * the memset call clears nonstandard fields in some impementations
0
+ * that otherwise mess things up.
0
+ memset(&addr, 0, sizeof(addr));
0
+ addr.sun_family = AF_UNIX;
0
+ strcpy(addr.sun_path, socketpath);
0
+ old_umask = umask( ~(access_mask & 0777) );
0
+ if( bind(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
0
int ret = ebb_server_listen_on_fd(server, sfd);
0
- server->port = malloc(sizeof(char)*8); /* for easy access to the port */
0
- sprintf(server->port, "%d", port);
0
+ assert(server->socketpath == NULL);
0
+ server->socketpath = strdup(socketpath);
0
@@ -543,14 +603,12 @@ error:
0
-int ebb_server_listen_on_socket(ebb_server *server, const char *socketpath)
0
+int ebb_server_clients_in_use_p(ebb_server *server)
0
- // int fd = server_socket_unix(socketpath, 0755);
0
- // if(fd < 0) return 0;
0
- // server->socketpath = strdup(socketpath);
0
- // server_listen(server);
0
+ for(i = 0; i < EBB_MAX_CLIENTS; i++)
0
+ if(server->clients[i].in_use) return TRUE;
0
@@ -669,68 +727,4 @@ int ebb_client_read(ebb_client *client, char *buffer, int length)
0
client->nread_from_body += read;
0
-/* The following socket creation routines are modified and stolen from memcached */
0
-static int server_socket_unix(const char *path, int access_mask) {
0
- struct linger ling = {0, 0};
0
- struct sockaddr_un addr;
0
- if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
0
- if ((flags = fcntl(sfd, F_GETFL, 0)) < 0 ||
0
- fcntl(sfd, F_SETFL, flags | O_NONBLOCK) < 0) {
0
- perror("setting O_NONBLOCK");
0
- * Clean up a previous socket file if we left it around
0
- if (lstat(path, &tstat) == 0) {
0
- if (S_ISSOCK(tstat.st_mode))
0
- setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void *)&flags, sizeof(flags));
0
- setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&flags, sizeof(flags));
0
- setsockopt(sfd, SOL_SOCKET, SO_LINGER, (void *)&ling, sizeof(ling));
0
- * the memset call clears nonstandard fields in some impementations
0
- * that otherwise mess things up.
0
- memset(&addr, 0, sizeof(addr));
0
- addr.sun_family = AF_UNIX;
0
- strcpy(addr.sun_path, path);
0
- old_umask=umask( ~(access_mask&0777));
0
- if (bind(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
0
- if (listen(sfd, EBB_MAX_CLIENTS) == -1) {
0
\ No newline at end of file
Comments
No one has commented yet.