Example #1
0
int
main (int argc, char **argv)
{
    struct sockaddr_in sin;
    int     i, s, f, port = 8875;
    int     location = 0;
    int     sys_log = 1;
    int     background = 0;

#if HAVE_POLL
    struct pollfd ufd;
#else
    fd_set  set;
#endif /* HAVE_POLL */
    socklen_t sinsize;

#ifndef WIN32
    struct sigaction sa;
#endif
    unsigned int iface = INADDR_ANY;

#if defined(WIN32) && !defined(__CYGWIN__)
    WSADATA wsa;

    WSAStartup (MAKEWORD (1, 1), &wsa);
#endif /* !WIN32 */

    metafile[0] = 0;

    while ((i = getopt (argc, argv, "hfl:vp:c:s")) != EOF)
    {
	switch (i)
	{
	case 'l':
	    iface = inet_addr (optarg);
	    break;
	case 'p':
	    port = atoi (optarg);
	    break;
	case 'c':
	    strcpy (metafile, optarg);
	    break;
	case 'f':
	    background ^= 1;
	    break;
	case 's':
	    sys_log ^= 1;
	    break;
	case 'v':
	    printf ("%s metaserver version %s\n", PACKAGE, VERSION);
	    exit (1);
	default:
	    usage ();
	}
    }

    /* read in the host list */
    if (!metafile[0])
    {
	if (!argv[optind])
	    hosts[numhosts++] = strdup ("127.0.0.1:8888");	/* use default host */
	else
	{
	    while (argv[optind])
	    {
		hosts[numhosts++] = strdup (argv[optind]);
		optind++;
	    }
	}
    }
    else
	read_metafile (metafile);

#ifndef WIN32
    /* set some signal handlers so we can shut down gracefully */
    memset (&sa, 0, sizeof (sa));
    sa.sa_handler = handler;
    sigaction (SIGINT, &sa, 0);
    sigaction (SIGTERM, &sa, 0);

#ifndef __CYGWIN__
    sa.sa_flags = SA_RESTART;
#endif

    sigaction (SIGHUP, &sa, NULL);
#endif

    memset (&sin, 0, sizeof (sin));
    sin.sin_port = htons (port);
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = iface;

    s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s < 0)
    {
	perror ("socket");
	exit (1);
    }
    if (bind (s, (struct sockaddr *) &sin, sizeof (sin)) < 0)
    {
	perror ("bind");
	exit (1);
    }
    if (listen (s, 50) < 0)
    {
	perror ("listen");
	exit (1);
    }

#ifndef WIN32
    if (background && fork ())
	_exit (0);
#endif

#if HAVE_SYSLOG
    if (sys_log)
	openlog ("metaserver", LOG_PID, LOG_LOCAL6);
#endif

    location = 0;
#if HAVE_POLL
    memset (&ufd, 0, sizeof (ufd));
    ufd.fd = s;
    ufd.events = POLLIN | POLLHUP;
#endif /* HAVE_POLL */
    for (;;)
    {
#if HAVE_POLL
	i = poll (&ufd, 1, -1);
#else
	FD_ZERO (&set);
	FD_SET (s, &set);
	i = select (s + 1, &set, 0, 0, 0);
#endif /* HAVE_POLL */
	if (i == -1)
	{
	    /* re-read configuration files */
	    if (sig_meta)
	    {
		for (i = 0; i < numhosts; i++)
		    free (hosts[i]);
		numhosts = 0;
		location = 0;
		sig_meta = 0;
		read_metafile (metafile);
		continue;
	    }
	    perror (
#if HAVE_POLL
		       "poll"
#else
		       "select"
#endif
		);
	    break;
	}

	sinsize = sizeof (sin);
	f = accept (s, (struct sockaddr *) &sin, &sinsize);
	if (f < 0)
	{
	    perror ("accept");
	    break;
	}
	WRITE (f, hosts[location], strlen (hosts[location]));
	WRITE (f, "\n", 1);
#if HAVE_SYSLOG
	if (sys_log)
	    syslog (LOG_ERR, "Redirecting %s to %s", inet_ntoa (sin.sin_addr),
		    hosts[location]);
#endif
	location = (location + 1) % numhosts;
	CLOSE (f);
    }
    CLOSE (s);
#if HAVE_SYSLOG
    closelog ();
#endif
    exit (0);
}
Example #2
0
File: hfsdump.c Project: Shmuma/z
int dump_by_meta(const char *metafile)
{
	void 		*val;
	size_t		val_len;
	item_value_u 	val_history;
	hfs_trend_t  	val_trends;

	int fd, i;
	char *datafile = NULL;
	hfs_meta_t *meta = NULL;
	hfs_meta_item_t *ip = NULL;
	hfs_time_t ts;
	hfs_off_t ofs;

	if ((meta = read_metafile(metafile, NULL)) == NULL)
		return -1; // Somethig real bad happend :(

	if (meta->blocks == 0) {
		fprintf(stderr, "%s: No data!\n", metafile);
		free_meta(meta);
		return -1;
	}

	if (is_trend_type(meta->last_type)) {
		val = &val_trends;
		val_len = sizeof(val_trends);
	}
	else {
		val = &val_history;
		val_len = sizeof(val_history);
	}

	datafile = get_datafile(metafile);     

	if ((fd = open (datafile, O_RDONLY)) == -1) {
		fprintf(stderr, "%s: file open failed: %s\n", datafile, strerror(errno));
		free_meta(meta);
		free(datafile);
		return -1;
	}

	for (i = 0; i < meta->blocks; i++) {
		ip = meta->meta + i;
		ts = ip->start;

		if ((ofs = find_meta_ofs (ts, meta, NULL)) == -1) {
			fprintf(stderr, "%s: %d: unable to get offset in file\n",
				datafile, (int)ts);
			free_meta(meta);
			free(datafile);
			close(fd);
			return -1;
		}

		if (lseek (fd, ofs, SEEK_SET) == -1) {
			fprintf(stderr, "%s: unable to change file offset: %s\n",
				datafile, strerror(errno));
			free_meta(meta);
			free(datafile);
			close(fd);
			return -1;
		}

		while (read (fd, val, val_len) > 0) {

			if (!is_valid_val(val, val_len)) {
				ts += ip->delay;
				continue;
			}

			printf("time=%d\tdelay=%d\ttype=%d\t",
				(int)ts, ip->delay, ip->type);

			if (is_trend_type(ip->type)) {
				printf("count=%d\tmax=", val_trends.count);
				show_value(ip->type, val_trends.max);
				printf("\tmin=");
				show_value(ip->type, val_trends.min);
				printf("\tavg=");
				show_value(ip->type, val_trends.avg);
			}
			else {
				printf("value=");
				show_value(ip->type, val_history);
			}
			printf("\n");
			ts += ip->delay;

			if (ts > ip->end)
				break;
		}
	}

	free_meta(meta);
	free(datafile);
	close(fd);
	return 0;
}