AC_LANG(C)
-YAZ_INIT([static threads],[3.0.25])
+YAZ_INIT([static threads],[3.0.29])
if test -z "$YAZLIB"; then
AC_MSG_ERROR([YAZ development libraries missing])
fi
if (errno == EINTR)
continue;
else
- abort();
+ {
+ yaz_log(YLOG_ERRNO|YLOG_WARN, "select");
+ return 0;
+ }
}
for (p = *iochans; p; p = p->next)
{
static int is_inprogress(void)
{
#ifdef WIN32
- if (WSAGetLastError() != WSAEWOULDBLOCK)
+ if (WSAGetLastError() == WSAEWOULDBLOCK)
return 1;
#else
- if (errno != EINPROGRESS)
+ if (errno == EINPROGRESS)
return 1;
#endif
return 0;
pazpar2_add_channel(c);
}
+static int listener_socket = 0;
+
/* Create a http-channel listener, syntax [host:]port */
-void http_init(const char *addr)
+int http_init(const char *addr)
{
IOCHAN c;
int l;
hostname[len] = '\0';
if (!(he = gethostbyname(hostname))){
yaz_log(YLOG_FATAL, "Unable to resolve '%s'", hostname);
- exit(1);
+ return 1;
}
memcpy(&myaddr.sin_addr.s_addr, he->h_addr_list[0], he->h_length);
myaddr.sin_port = htons(port);
if (!(p = getprotobyname("tcp"))) {
- abort();
+ return 1;
}
if ((l = socket(PF_INET, SOCK_STREAM, p->p_proto)) < 0)
yaz_log(YLOG_FATAL|YLOG_ERRNO, "socket");
if (setsockopt(l, SOL_SOCKET, SO_REUSEADDR, (char*)
&one, sizeof(one)) < 0)
- abort();
+ return 1;
if (bind(l, (struct sockaddr *) &myaddr, sizeof myaddr) < 0)
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "bind");
- exit(1);
+ return 1;
}
if (listen(l, SOMAXCONN) < 0)
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "listen");
- exit(1);
+ return 1;
}
+ listener_socket = l;
+
c = iochan_create(l, http_accept, EVENT_INPUT | EVENT_EXCEPT);
pazpar2_add_channel(c);
+ return 0;
+}
+
+void http_close_server(void)
+{
+ /* break the event_loop (select) by closing down the HTTP listener sock */
+ if (listener_socket)
+ {
+#ifdef WIN32
+ closesocket(listener_socket);
+#else
+ close(listener_socket);
+#endif
+ }
}
void http_set_proxyaddr(char *host, char *base_url)
};
void http_set_proxyaddr(char *url, char *baseurl);
-void http_init(const char *addr);
+int http_init(const char *addr);
+void http_close_server(void);
void http_addheader(struct http_response *r,
const char *name, const char *value);
struct http_header * http_header_append(struct http_channel *ch,
static void cmd_exit(struct http_channel *c)
{
yaz_log(YLOG_WARN, "exit");
- exit(0);
+ http_close_server();
}
static void cmd_init(struct http_channel *c)
stat->num_clients = count;
}
-void start_http_listener(void)
+int start_http_listener(void)
{
char hp[128] = "";
struct conf_server *ser = global_parameters.server;
sprintf(hp + strlen(hp), "%d", ser->port);
}
}
- http_init(hp);
+ return http_init(hp);
}
void start_proxy(void)
#include "database.h"
#include "settings.h"
#include <yaz/daemon.h>
+#include <yaz/sc.h>
void child_handler(void *data)
{
#endif
-int main(int argc, char **argv)
+static int sc_main(yaz_sc_t s, int argc, char **argv)
{
int daemon = 0;
int ret;
}
global_parameters.server = config->servers;
- start_http_listener();
+ ret = start_http_listener();
+ if (ret)
+ return ret; /* error starting http listener */
+
+ yaz_sc_running(s);
+
yaz_daemon("pazpar2",
(global_parameters.debug_mode ? YAZ_DAEMON_DEBUG : 0) +
(daemon ? YAZ_DAEMON_FORK : 0) + YAZ_DAEMON_KEEPALIVE,
}
+static void sc_stop(yaz_sc_t s)
+{
+
+}
+
+int main(int argc, char **argv)
+{
+ int ret;
+ yaz_sc_t s = yaz_sc_create("pazpar2", "Pazpar Metasearcher");
+
+ ret = yaz_sc_program(s, argc, argv, sc_main, sc_stop);
+
+ yaz_sc_destroy(&s);
+ exit(ret);
+}
+
/*
* Local variables:
* c-basic-offset: 4
void session_apply_setting(struct session *se, char *dbname, char *setting, char *value);
const char *session_setting_oneval(struct session_database *db, int offset);
-void start_http_listener(void);
+int start_http_listener(void);
void start_proxy(void);
void pazpar2_add_channel(IOCHAN c);