#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
+#include <errno.h>
int main()
{
FILE *fp = NULL, *fp_in = NULL;
FILE *out_fp = NULL, *diff_fp = NULL;
- const char* topcmd = "/vservers/pl_netflow/vsys/test.out";
- const char* top_in_file = "/vservers/pl_netflow/vsys/test.in";
+ const char* topcmd = "fe/test.out";
+ const char* top_in_file = "fe/test.in";
char buf[4096];
int fd_in = -1, fd_out;
int res;
- int flag;
+ int flag,flag2;
int count = 1;
struct timeval tv={.tv_sec=5,.tv_usec=0};
- while (count < 100) {
+ while (count < 1000000) {
fd_set readSet;
int res;
int nlines=0;
- printf("(.)", count);
-
+ //usleep(200);
+ printf("(%d)", count);fflush(stdout);
if ((fd_out = open(topcmd, O_RDONLY | O_NONBLOCK)) < 0) {
fprintf(stderr, "error executing top\n");
exit(-1);
}
- if ((fd_in = open(top_in_file, O_WRONLY)) < 0) {
- fprintf(stderr, "error opening %s\n", top_in_file);
- exit(-1);
+
+ //printf("((0))");fflush(stdout);
+ while ((fd_in = open(top_in_file, O_WRONLY| O_NONBLOCK)) < 0) {
+ fprintf(stderr, "Waiting for %s (%s)\n", top_in_file,strerror(errno));
+ usleep (50);
}
+ //printf("(1)");
if ((flag = fcntl(fd_out, F_GETFL)) == -1) {
printf("fcntl get failed\n");
exit(-1);
}
+ //printf("(2)");
- FD_ZERO(&readSet);
- FD_SET(fd_out, &readSet);
-
- res = select(fd_out + 1, &readSet, NULL, NULL, &tv);
- if (res < 1) {
- printf("select failed\n");
+ //printf("(3)");
+ if ((flag2 = fcntl(fd_in, F_GETFL)) == -1) {
+ printf("fcntl get failed\n");
exit(-1);
}
+ //printf("(4)");
+
+
+ while (1) {
+ FD_ZERO(&readSet);
+ FD_SET(fd_out, &readSet);
+
+ //printf("(5)");
+ res = select(fd_out + 1, &readSet, NULL, NULL, NULL);
+ //printf("(6)");
+ if (res < 0) {
+ if (errno == EINTR || errno == EAGAIN) {
+ printf(".");
+ continue;
+ }
+ fprintf(stderr,"select failed errno=%d errstr=%s\n", errno, strerror(errno));
+ exit(-1);
+ }
+ break; /* we're done */
+ }
+ //printf("(7)");
if (fcntl(fd_out, F_SETFL, flag & ~O_NONBLOCK) == -1) {
printf("fcntl set failed\n");
exit(-1);
}
+ //printf("(8)");
+ //printf("(9)");
if ((flag = fcntl(fd_out, F_GETFL)) == -1) {
printf("fcntl get failed\n");
exit(-1);
}
+ //printf("(10)");
- if (flag & O_NONBLOCK == 0) {
- printf("fd_out still nonblocking\n");
+
+ //printf("(11)");
+ if (fcntl(fd_in, F_SETFL, flag2 & ~O_NONBLOCK) == -1) {
+ printf("fcntl set failed\n");
exit(-1);
}
- if ((fp = fdopen(fd_out, "r")) == NULL) {
- printf("fdopen failed\n");
+ //printf("(11)");
+ if ((flag2 = fcntl(fd_in, F_GETFL)) == -1) {
+ printf("fcntl get failed\n");
exit(-1);
}
+ //printf("(12)");
- if ((out_fp = fopen("/tmp/vsys_passwd_test", "w")) == NULL) {
- printf("could not create tmp file for test\n");
- exit(-1);
+ if (flag & O_NONBLOCK == 0) {
+ printf("fd_out still nonblocking\n");
+ exit(-1);
}
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- fprintf(out_fp, "%s",buf);
+ if (flag & O_NONBLOCK == 0) {
+ printf("fd_in still nonblocking\n");
+ exit(-1);
}
-
- fflush(out_fp);
- fclose(out_fp);
-
- if ((diff_fp = popen("/usr/bin/diff -u /tmp/vsys_passwd_test /etc/passwd","r")) == NULL) {
- printf("Could not diff results\n");
- exit(-1);
+ if ((fp = fdopen(fd_out, "r")) == NULL) {
+ printf("fdopen failed\n");
+ exit(-1);
}
- while (fgets(buf, sizeof(buf), diff_fp) != NULL) {
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
nlines++;
}
- if (nlines) {
+ if (nlines<5) {
printf("Test returned different results - run again to verify\n");
exit(-1);
}
- pclose (diff_fp);
fclose(fp);
close(fd_in);
+ close(fd_out);
count++;
}
printf("test successful.\n");