static gboolean daap_request_stream (GIOChannel *chan, gchar *path, gchar *host, guint request_id, guint *size) { guint status; gchar *request, *header = NULL; request = daap_generate_request (path, host, request_id); daap_send_request (chan, request); g_free (request); daap_receive_header (chan, &header); if (!header) { return FALSE; } status = get_server_status (header); if (HTTP_OK != status) { g_free (header); return FALSE; } *size = get_data_length (header); g_free (header); return TRUE; }
static cc_data_t * daap_request_data (GIOChannel *chan, const gchar *path, gchar *host, guint request_id) { guint status; gchar *request, *header = NULL; cc_data_t *retval; request = daap_generate_request (path, host, request_id); daap_send_request (chan, request); g_free (request); daap_receive_header (chan, &header); if (!header) { return NULL; } status = get_server_status (header); switch (status) { case UNKNOWN_SERVER_STATUS: case HTTP_BAD_REQUEST: case HTTP_FORBIDDEN: case HTTP_NO_CONTENT: case HTTP_NOT_FOUND: retval = NULL; break; case HTTP_OK: default: retval = daap_handle_data (chan, header); break; } g_free (header); return retval; }
int main(int argc, char **argv) { int c, server = 0; char *listen = NULL, *port = PORT_NUM; struct addrinfo hints; int e; enum { STATEDIR_OPT = CHAR_MAX + 1 }; static const struct option longopts[] = { {"disable", no_argument, NULL, 'd'}, {"maintenance", no_argument, NULL, 'm'}, {"enable", no_argument, NULL, 'e'}, {"server", no_argument, NULL, 's'}, {"listen", required_argument, NULL, 'l'}, {"port", required_argument, NULL, 'p'}, {"state", required_argument, NULL, STATEDIR_OPT}, {"version", no_argument, NULL, 'V'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; set_program_name(argv[0]); atexit(close_stdout); memset(&rtc, 0, sizeof(struct runtime_config)); rtc.argv = argv; rtc.statedir = F5GS_RUNDIR; while ((c = getopt_long(argc, argv, "dmesl:p:Vh", longopts, NULL)) != -1) { switch (c) { case 'd': rtc.send_signal = state_signals[STATE_DISABLE]; break; case 'm': rtc.send_signal = state_signals[STATE_MAINTENANCE]; break; case 'e': rtc.send_signal = state_signals[STATE_ENABLE]; break; case 's': server = 1; break; case 'l': listen = optarg; break; case 'p': port = optarg; break; case STATEDIR_OPT: rtc.statedir = optarg; break; case 'V': printf("%s version %s", PACKAGE_NAME, PACKAGE_VERSION); #ifdef USE_SYSTEMD puts(" with systemd support"); #else puts(""); #endif return EXIT_SUCCESS; case 'h': usage(stdout); default: usage(stderr); } } if (signal(state_signals[STATE_DISABLE], catch_signals) == SIG_ERR || signal(state_signals[STATE_MAINTENANCE], catch_signals) == SIG_ERR || signal(state_signals[STATE_ENABLE], catch_signals) == SIG_ERR) err(EXIT_FAILURE, "cannot set signal handler"); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; e = getaddrinfo(listen, port, &hints, &(rtc.res)); if (e) { warnx("getaddrinfo: %s port %s: %s", listen, port, gai_strerror(e)); exit(EXIT_FAILURE); } if (rtc.send_signal && server) change_state(&rtc, getpid()); else if (server) { rtc.msg_type = STATE_UNKNOWN; rtc.msg_len = strlen(state_messages[STATE_UNKNOWN]); } else if (rtc.send_signal) { char *eptr; pid_t pid; FILE *pidfd; char *pid_file = construct_pidfile(&rtc); if (!(pidfd = fopen(pid_file, "r"))) err(EXIT_FAILURE, "cannot open pid file: %s", pid_file); fscanf(pidfd, "%d", &pid); if (close_stream(pidfd)) #ifdef USE_SYSTEMD sd_journal_send("MESSAGE=close failed", "PID_FILE=%s", pid_file, "MESSAGE_ID=%s", SD_ID128_CONST_STR(MESSAGE_ERROR), "STRERROR=%s", strerror(errno), "PRIORITY=3", NULL); #else syslog(LOG_ERR, "close failed: %s: %s", pid_file, strerror(errno)); #endif free(pid_file); if (change_state(&rtc, pid)) { if (errno == 0) { errx(EXIT_FAILURE, "execution of %s failed", F5GS_PRE); } else { err(EXIT_FAILURE, "sending signal failed"); } } openlog(PACKAGE_NAME, LOG_PID, LOG_DAEMON); eptr = getenv("USER"); if (eptr != NULL) #ifdef USE_SYSTEMD sd_journal_send("MESSAGE=signal was sent", "MESSAGE_ID=%s", SD_ID128_CONST_STR(MESSAGE_STATE_CHANGE), "USER=%s", eptr, "PRIORITY=6", NULL); #else syslog(LOG_INFO, "signal was sent by USER: %s", eptr); #endif eptr = getenv("SUDO_USER"); if (eptr != NULL) #ifdef USE_SYSTEMD sd_journal_send("MESSAGE=signal was sent", "MESSAGE_ID=%s", SD_ID128_CONST_STR(MESSAGE_STATE_CHANGE), "SUDO_USER=%s", eptr, "PRIORITY=6", NULL); #else syslog(LOG_INFO, "signal was sent by SUDO_USER: %s", eptr); #endif } if (server) run_server(&rtc); printf("current status is: %s\n", get_server_status(&rtc)); freeaddrinfo(rtc.res); return EXIT_SUCCESS; }