#include #include #include #include #include #include #include #include #define STAT_ROOT "/fah/stats" /* non-forking version; if you don't like it -- change it */ int main(int ac, char **av) { int sk; int ask; struct sockaddr_in sa; struct sockaddr_in asa; unsigned int asa_len; unsigned char buf[4096]; FILE *fp; int rv; char fname[256]; DIR *dir; struct dirent *de; int on = 1; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(24936); sa.sin_addr.s_addr = INADDR_ANY; sk = socket(AF_INET, SOCK_STREAM, 0); if (sk == -1) { perror("socket"); exit(2); } rv = setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (rv == -1) { perror("setsockopt"); exit(3); } rv = bind(sk, (struct sockaddr *) &sa, sizeof(sa)); if (rv == -1) { perror("bind"); exit(4); } rv = listen(sk, 10); if (rv == -1) { perror("listen"); exit(5); } while (1) { asa_len = sizeof(asa); ask = accept(sk, (struct sockaddr *) &asa, &asa_len); if (ask < 0) { perror("accept"); continue; } dir = opendir("/fah/stats"); if (!dir) { close(ask); continue; } while ((de = readdir(dir))) { if (de->d_name[0] == '.') { if (de->d_name[1] == '\0') { continue; } if (de->d_name[1] == '.' && de->d_name[2] == '\0') { continue; } } snprintf(fname, 256, "%s/%s/unitinfo.txt", STAT_ROOT, de->d_name); //printf("fname: %s\n", fname); fp = fopen(fname, "rb"); if (!fp) { write(ask, "\n================\n", 18); continue; } while ((rv = fread(buf, 1, sizeof(buf), fp)) > 0) { write(ask, buf, rv); } fclose(fp); write(ask, "\n================\n", 18); } closedir(dir); #if 0 while ((rv = fread(buf, 1, sizeof(buf), fp)) > 0) { write(ask, buf, rv); } pclose(fp); #endif close(ask); } return 6; }