Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}