static char *ibsystat_serv(void) { void *umad; void *mad; int attr, mod, size; DEBUG("starting to serve..."); while ((umad = mad_receive_via(buf, -1, srcport))) { if (umad_status(buf)) { DEBUG("drop mad with status %x: %s", umad_status(buf), strerror(umad_status(buf))); continue; } mad = umad_get_mad(umad); attr = mad_get_field(mad, 0, IB_MAD_ATTRID_F); mod = mad_get_field(mad, 0, IB_MAD_ATTRMOD_F); DEBUG("got packet: attr 0x%x mod 0x%x", attr, mod); size = mk_reply(attr, (uint8_t *) mad + IB_VENDOR_RANGE2_DATA_OFFS, sizeof(buf) - umad_size() - IB_VENDOR_RANGE2_DATA_OFFS); if (server_respond(umad, IB_VENDOR_RANGE2_DATA_OFFS + size) < 0) DEBUG("respond failed"); } DEBUG("server out"); return 0; }
// Server Listen Function void server_listen() { // Pipe Descriptor int to_server = 0; // Create Pipe mkfifo(WKP, 0600); // Open Pipe to_server = open(WKP, O_RDONLY); // Respond server_respond(to_server); }
/* * return response for a request */ DBUF *server_response (XML *xml, char *req) { char *url, *ch; DBUF *console_response (XML *, char *); extern char Software[]; if (strstarts (req, "GET ")) url = req + 4; else if (strstarts (req, "POST ")) url = req + 5; else return (NULL); #ifdef __RECEIVER__ ch = xml_get_text (xml, "Phineas.Receiver.Url"); if (strstarts (url, ch)) { if (url == req + 5) /* this a POST? */ { debug ("getting ebXML response\n"); if ((ch = ebxml_process_req (xml, req)) != NULL) return (dbuf_setbuf (NULL, ch, strlen (ch))); } return (server_respond (200, "<h3>%s</h3>Receiver", Software)); } #endif #ifdef __CONSOLE__ ch = xml_get_text (xml, "Phineas.Console.Url"); if (strstarts (url, ch) || strstarts (url, "/favicon.ico")) return (console_response (xml, req)); #endif if ((ch = strchr (url, '\n')) == NULL) ch = url + strlen (url); warn ("request not found for %.*s\n", ch - url, url); return (server_respond (400, "404 - <bold>%.*s</bold> not found", ch - url, url)); }
/* * TASK to handle an incoming request */ int server_request (void *parm) { SERVERPARM *s; DBUF *req, *res; char *curl; s = (SERVERPARM *) parm; curl = xml_get_text (s->xml, "Phineas.Console.Url"); res = NULL; while ((req = server_receive (s->conn)) != NULL) { debug ("received %d bytes\n", dbuf_size (req)); if (dbuf_size (req) == 0) { dbuf_free (req); net_close (s->conn); return (-1); } dbuf_putc (req, 0); /* * log the request, but filter out GET requests for the console... * noise */ if (!(*curl && strstarts (dbuf_getbuf (req) + 4, curl))) server_logrequest (s->conn, dbuf_size (req), dbuf_getbuf (req)); if ((res = server_response (s->xml, dbuf_getbuf (req))) == NULL) { res = server_respond (500, "<h3>Failure processing ebXML request</h3>"); } server_header (res); net_write (s->conn, dbuf_getbuf (res), dbuf_size (res)); dbuf_free (res); dbuf_free (req); } net_close (s->conn); debug ("request completed\n"); return (0); }