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); }
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; }