1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2009 Index Data
3 * See the file LICENSE for details.
7 * \brief Small HTTP server
11 #include <yaz/comstack.h>
14 #include <yaz/sock_man.h>
17 typedef struct yaz_nano_srv_s *yaz_nano_srv_t;
18 typedef struct yaz_nano_pkg_s *yaz_nano_pkg_t;
20 struct yaz_nano_pkg_s {
28 struct yaz_nano_srv_s {
29 COMSTACK *cs_listeners;
32 yaz_sock_man_t sock_man;
35 void yaz_nano_srv_destroy(yaz_nano_srv_t p)
40 for (i = 0; i < p->num_listeners; i++)
41 if (p->cs_listeners[i])
42 cs_close(p->cs_listeners[i]);
43 yaz_sock_man_destroy(p->sock_man);
44 nmem_destroy(p->nmem);
48 yaz_nano_srv_t yaz_nano_srv_create(const char **listeners_str)
50 NMEM nmem = nmem_create();
51 yaz_nano_srv_t p = nmem_malloc(nmem, sizeof(*p));
53 for (i = 0; listeners_str[i]; i++)
58 nmem_malloc(nmem, p->num_listeners * sizeof(*p->cs_listeners));
59 for (i = 0; i < p->num_listeners; i++)
62 const char *where = listeners_str[i];
63 COMSTACK l = cs_create_host(where, 2, &ap);
64 p->cs_listeners[i] = 0; /* not OK (yet) */
67 yaz_log(YLOG_WARN|YLOG_ERRNO, "cs_create_host(%s) failed", where);
71 if (cs_bind(l, ap, CS_SERVER) < 0)
73 if (cs_errno(l) == CSYSERR)
74 yaz_log(YLOG_FATAL|YLOG_ERRNO, "Failed to bind to %s", where);
76 yaz_log(YLOG_FATAL, "Failed to bind to %s: %s", where,
81 p->cs_listeners[i] = l; /* success */
84 p->sock_man = yaz_sock_man_new();
86 /* check if all are OK */
87 for (i = 0; i < p->num_listeners; i++)
88 if (!p->cs_listeners[i])
90 yaz_nano_srv_destroy(p);
94 for (i = 0; i < p->num_listeners; i++)
98 chan = yaz_sock_chan_new(p->sock_man, cs_fileno(p->cs_listeners[i]),
100 yaz_poll_read | yaz_poll_except);
105 Z_GDU *yaz_nano_pkg_req(yaz_nano_pkg_t pkg)
107 return pkg->request_gdu;
110 Z_GDU *yaz_nano_pkg_response(yaz_nano_pkg_t pkg)
112 return pkg->response_gdu;
115 ODR yaz_nano_pkg_encode(yaz_nano_pkg_t pkg)
117 return pkg->encode_odr;
120 int yaz_nano_pkg_listener_id(yaz_nano_pkg_t pkg)
122 return pkg->listener_id;
125 yaz_nano_pkg_t yaz_nano_srv_get_pkg(yaz_nano_srv_t p)
130 void yaz_nano_srv_put_pkg(yaz_nano_srv_t p, yaz_nano_pkg_t pkg)
138 * c-file-style: "Stroustrup"
139 * indent-tabs-mode: nil
141 * vim: shiftwidth=4 tabstop=8 expandtab