/* * Subscribing code */ static int camqp_read_body(camqp_config_t *conf, /* {{{ */ size_t body_size, const char *content_type) { char body[body_size + 1]; char *body_ptr; size_t received; amqp_frame_t frame; int status; memset(body, 0, sizeof(body)); body_ptr = &body[0]; received = 0; while (received < body_size) { status = amqp_simple_wait_frame(conf->connection, &frame); if (status < 0) { status = (-1) * status; ERROR("amqp plugin: amqp_simple_wait_frame failed: %s", STRERROR(status)); camqp_close_connection(conf); return status; } if (frame.frame_type != AMQP_FRAME_BODY) { NOTICE("amqp plugin: Unexpected frame type: %#" PRIx8, frame.frame_type); return -1; } if ((body_size - received) < frame.payload.body_fragment.len) { WARNING("amqp plugin: Body is larger than indicated by header."); return -1; } memcpy(body_ptr, frame.payload.body_fragment.bytes, frame.payload.body_fragment.len); body_ptr += frame.payload.body_fragment.len; received += frame.payload.body_fragment.len; } /* while (received < body_size) */ if (strcasecmp("text/collectd", content_type) == 0) { status = cmd_handle_putval(stderr, body); if (status != 0) ERROR("amqp plugin: cmd_handle_putval failed with status %i.", status); return status; } else if (strcasecmp("application/json", content_type) == 0) { ERROR("amqp plugin: camqp_read_body: Parsing JSON data has not " "been implemented yet. FIXME!"); return 0; } else { ERROR("amqp plugin: camqp_read_body: Unknown content type \"%s\".", content_type); return EINVAL; } /* not reached */ return 0; } /* }}} int camqp_read_body */
static void *us_handle_client (void *arg) { int fdin; int fdout; FILE *fhin, *fhout; fdin = *((int *) arg); free (arg); arg = NULL; DEBUG ("unixsock plugin: us_handle_client: Reading from fd #%i", fdin); fdout = dup (fdin); if (fdout < 0) { char errbuf[1024]; ERROR ("unixsock plugin: dup failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); close (fdin); pthread_exit ((void *) 1); } fhin = fdopen (fdin, "r"); if (fhin == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); close (fdin); close (fdout); pthread_exit ((void *) 1); return ((void *) 1); } fhout = fdopen (fdout, "w"); if (fhout == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); fclose (fhin); /* this closes fdin as well */ close (fdout); pthread_exit ((void *) 1); return ((void *) 1); } /* change output buffer to line buffered mode */ if (setvbuf (fhout, NULL, _IOLBF, 0) != 0) { char errbuf[1024]; ERROR ("unixsock plugin: setvbuf failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); fclose (fhin); fclose (fhout); pthread_exit ((void *) 1); return ((void *) 0); } while (42) { char buffer[1024]; char buffer_copy[1024]; char *fields[128]; int fields_num; int len; errno = 0; if (fgets (buffer, sizeof (buffer), fhin) == NULL) { if ((errno == EINTR) || (errno == EAGAIN)) continue; if (errno != 0) { char errbuf[1024]; WARNING ("unixsock plugin: failed to read from socket #%i: %s", fileno (fhin), sstrerror (errno, errbuf, sizeof (errbuf))); } break; } len = strlen (buffer); while ((len > 0) && ((buffer[len - 1] == '\n') || (buffer[len - 1] == '\r'))) buffer[--len] = '\0'; if (len == 0) continue; sstrncpy (buffer_copy, buffer, sizeof (buffer_copy)); fields_num = strsplit (buffer_copy, fields, sizeof (fields) / sizeof (fields[0])); if (fields_num < 1) { fprintf (fhout, "-1 Internal error\n"); fclose (fhin); fclose (fhout); pthread_exit ((void *) 1); return ((void *) 1); } if (strcasecmp (fields[0], "getval") == 0) { cmd_handle_getval (fhout, buffer); } else if (strcasecmp (fields[0], "getthreshold") == 0) { handle_getthreshold (fhout, buffer); } else if (strcasecmp (fields[0], "putval") == 0) { cmd_handle_putval (fhout, buffer); } else if (strcasecmp (fields[0], "listval") == 0) { cmd_handle_listval (fhout, buffer); } else if (strcasecmp (fields[0], "putnotif") == 0) { handle_putnotif (fhout, buffer); } else if (strcasecmp (fields[0], "flush") == 0) { cmd_handle_flush (fhout, buffer); } else { if (fprintf (fhout, "-1 Unknown command: %s\n", fields[0]) < 0) { char errbuf[1024]; WARNING ("unixsock plugin: failed to write to socket #%i: %s", fileno (fhout), sstrerror (errno, errbuf, sizeof (errbuf))); break; } } } /* while (fgets) */ DEBUG ("unixsock plugin: us_handle_client: Exiting.."); fclose (fhin); fclose (fhout); pthread_exit ((void *) 0); return ((void *) 0); } /* void *us_handle_client */