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>
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 struct yaz_poll_fd *fds;
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 nmem_destroy(p->nmem);
47 yaz_nano_srv_t yaz_nano_srv_create(const char **listeners_str)
49 NMEM nmem = nmem_create();
50 yaz_nano_srv_t p = nmem_malloc(nmem, sizeof(*p));
52 for (i = 0; listeners_str[i]; i++)
59 nmem_malloc(nmem, p->num_listeners * sizeof(*p->cs_listeners));
60 for (i = 0; i < p->num_listeners; i++)
63 const char *where = listeners_str[i];
64 COMSTACK l = cs_create_host(where, 2, &ap);
65 p->cs_listeners[i] = 0; /* not OK (yet) */
68 yaz_log(YLOG_WARN|YLOG_ERRNO, "cs_create_host(%s) failed", where);
72 if (cs_bind(l, ap, CS_SERVER) < 0)
74 if (cs_errno(l) == CSYSERR)
75 yaz_log(YLOG_FATAL|YLOG_ERRNO, "Failed to bind to %s", where);
77 yaz_log(YLOG_FATAL, "Failed to bind to %s: %s", where,
82 p->cs_listeners[i] = l; /* success */
85 /* check if all are OK */
86 for (i = 0; i < p->num_listeners; i++)
87 if (!p->cs_listeners[i])
89 yaz_nano_srv_destroy(p);
93 for (i = 0; i < p->num_listeners; i++)
95 struct socket_chan *chan =
96 socket_chan_new(p, cs_fileno(p->cs_listeners[i]),
98 socket_chan_set_mask(chan, yaz_poll_read | yaz_poll_except);
103 Z_GDU *yaz_nano_pkg_req(yaz_nano_pkg_t pkg)
105 return pkg->request_gdu;
108 Z_GDU *yaz_nano_pkg_response(yaz_nano_pkg_t pkg)
110 return pkg->response_gdu;
113 ODR yaz_nano_pkg_encode(yaz_nano_pkg_t pkg)
115 return pkg->encode_odr;
118 int yaz_nano_pkg_listener_id(yaz_nano_pkg_t pkg)
120 return pkg->listener_id;
123 yaz_nano_pkg_t yaz_nano_srv_get_pkg(yaz_nano_srv_t p)
128 struct yaz_poll_fd *fds;
129 struct socket_chan *chan = p->chan_list;
130 for (chan = p->chan_list; chan; chan = chan->next)
132 fds = xmalloc(num_fds * sizeof(*fds));
133 for (i = 0, chan = p->chan_list; chan; chan = chan->next)
135 fds[i].input_mask = chan->mask;
136 fds[i].fd = chan->fd;
137 fds[i].client_data = chan;
139 ret = yaz_poll(fds, num_fds, 0, 0);
142 yaz_log(YLOG_WARN, "yaz_poll error");
146 yaz_log(YLOG_LOG, "yaz_poll timeout");
150 for (i = 0, chan = p->chan_list; chan; chan = chan->next)
152 if (fds[i].output_mask)
154 yaz_log(YLOG_LOG, "event on chan=%p", chan);
162 void yaz_nano_srv_put_pkg(yaz_nano_srv_t p, yaz_nano_pkg_t pkg)
170 * c-file-style: "Stroustrup"
171 * indent-tabs-mode: nil
173 * vim: shiftwidth=4 tabstop=8 expandtab