X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=pfix-srsd%2Fmain-srsd.c;h=917aa385d1ae1144d96f6f29bc4621787516330e;hb=ee166a1830b1ece4904c2d83ce4b861ce079f66a;hp=440e56f32d172969620c5ce971ab3463fd0cf7ed;hpb=785558696ffa16453be0b5b565c46b6426126d1e;p=apps%2Fpfixtools.git diff --git a/pfix-srsd/main-srsd.c b/pfix-srsd/main-srsd.c index 440e56f..917aa38 100644 --- a/pfix-srsd/main-srsd.c +++ b/pfix-srsd/main-srsd.c @@ -16,17 +16,20 @@ /* products derived from this software without specific prior written */ /* permission. */ /* */ -/* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND */ -/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE */ -/* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ -/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS */ -/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR */ -/* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF */ -/* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ -/* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN */ -/* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) */ -/* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF */ -/* THE POSSIBILITY OF SUCH DAMAGE. */ +/* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS */ +/* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ +/* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY */ +/* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL */ +/* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS */ +/* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) */ +/* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, */ +/* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN */ +/* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ +/* POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/* Copyright (c) 2006-2008 the Authors */ +/* see AUTHORS and source files for details */ /******************************************************************************/ /* @@ -43,7 +46,7 @@ #include "server.h" #define DAEMON_NAME "pfix-srsd" -#define DAEMON_VERSION "0.1" +#define DAEMON_VERSION "0.5" #define DEFAULT_ENCODER_PORT 10001 #define DEFAULT_DECODER_PORT 10002 #define RUNAS_USER "nobody" @@ -60,27 +63,12 @@ typedef struct srs_config_t { /* Server {{{1 */ -static const char* const decoder_ptr = "decoder"; -static const char* const encoder_ptr = "encoder"; - -static void *srsd_new_decoder(void) -{ - return (void*)decoder_ptr; -} - -static void *srsd_new_encoder(void) -{ - return (void*)encoder_ptr; -} - -static void *srsd_starter(server_t *server) -{ - return server->data; -} +static listener_t *decoder_ptr = NULL; +static listener_t *encoder_ptr = NULL; -int start_listener(int port, bool decoder) +static void *srsd_starter(listener_t *server) { - return start_server(port, decoder ? srsd_new_decoder : srsd_new_encoder, NULL); + return server; } @@ -107,74 +95,77 @@ void urldecode(char *s, char *end) *s++ = '\0'; } -int process_srs(server_t *srsd, void* vconfig) +int process_srs(client_t *srsd, void* vconfig) { srs_config_t* config = vconfig; - int res = buffer_read(&srsd->ibuf, srsd->fd, -1); + buffer_t *ibuf = client_input_buffer(srsd); + buffer_t *obuf = client_output_buffer(srsd); + bool decoder = (client_data(srsd) == decoder_ptr); + int res = client_read(srsd); if ((res < 0 && errno != EINTR && errno != EAGAIN) || res == 0) return -1; - while (srsd->ibuf.len > 4) { + while (ibuf->len > 4) { char buf[BUFSIZ], *p, *q, *nl; int err; - nl = strchr(srsd->ibuf.data + 4, '\n'); + nl = strchr(ibuf->data + 4, '\n'); if (!nl) { - if (srsd->ibuf.len > BUFSIZ) { + if (ibuf->len > BUFSIZ) { err("unreasonnable amount of data without a \\n"); return -1; } - if (srsd->obuf.len) { - server_rw(srsd); + if (obuf->len) { + client_io_rw(srsd); } return 0; } - if (strncmp("get ", srsd->ibuf.data, 4)) { - err("bad request, not starting with \"get \""); + if (strncmp("get ", ibuf->data, 4)) { + err("bad request, not starting with \"get \""); return -1; } - for (p = srsd->ibuf.data + 4; p < nl && isspace(*p); p++); + for (p = ibuf->data + 4; p < nl && isspace(*p); p++); for (q = nl++; q >= p && isspace(*q); *q-- = '\0'); if (p == q) { - buffer_addstr(&srsd->obuf, "400 empty request ???\n"); + buffer_addstr(obuf, "400 empty request ???\n"); warn("empty request"); goto skip; } urldecode(p, q); - if (srsd->data == (void*)decoder_ptr) { + if (decoder) { err = srs_reverse(config->srs, buf, ssizeof(buf), p); } else { err = srs_forward(config->srs, buf, ssizeof(buf), p, config->domain); } if (err == 0) { - buffer_addstr(&srsd->obuf, "200 "); - buffer_addstr(&srsd->obuf, buf); + buffer_addstr(obuf, "200 "); + buffer_addstr(obuf, buf); } else { switch (SRS_ERROR_TYPE(err)) { case SRS_ERRTYPE_SRS: case SRS_ERRTYPE_SYNTAX: - buffer_addstr(&srsd->obuf, "500 "); + buffer_addstr(obuf, "500 "); break; default: - buffer_addstr(&srsd->obuf, "400 "); + buffer_addstr(obuf, "400 "); break; } - buffer_addstr(&srsd->obuf, srs_strerror(err)); + buffer_addstr(obuf, srs_strerror(err)); } - buffer_addch(&srsd->obuf, '\n'); + buffer_addch(obuf, '\n'); skip: - buffer_consume(&srsd->ibuf, nl - srsd->ibuf.data); + buffer_consume(ibuf, nl - ibuf->data); } - if (srsd->obuf.len) { - server_rw(srsd); + if (obuf->len) { + client_io_rw(srsd); } return 0; } @@ -316,15 +307,15 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - info("starting %s v%s...", DAEMON_NAME, DAEMON_VERSION); + info("%s v%s...", DAEMON_NAME, DAEMON_VERSION); config.domain = argv[optind]; config.srs = srs_read_secrets(argv[optind + 1]); if (!config.srs || common_setup(pidfile, unsafe, RUNAS_USER, RUNAS_GROUP, daemonize) != EXIT_SUCCESS - || start_listener(port_enc, false) < 0 - || start_listener(port_dec, true) < 0) { + || (encoder_ptr = start_listener(port_enc)) == NULL + || (decoder_ptr = start_listener(port_dec)) == NULL) { return EXIT_FAILURE; } return server_loop(srsd_starter, NULL, process_srs, NULL, &config);