Anonymous avatar Anonymous committed e08b191

actually works?

Comments (0)

Files changed (3)

 
 int main(int argc, char **argv)
 {
-    int evq, in_wd;
-    FILE *in, *out;
-    char buf[4096];
-    fd_set rd;
-    struct stat st;
-    struct inotify_event *cur;
+	int evq, in_wd;
+	FILE *in, *out;
+	char buf[4096];
+	fd_set rd;
+	struct stat st;
+	struct inotify_event *cur;
 
-    if ((evq = inotify_init()) < 0)
-	err(1, "failed inotify_init()");
+	if ((evq = inotify_init()) < 0)
+		err(1, "failed inotify_init()");
 
-    if ((in_wd = inotify_add_watch(evq, argv[1], IN_MODIFY)) < 0)
-	err(1, "failed inotify_add_watch()");
+	if ((in_wd = inotify_add_watch(evq, argv[1], IN_MODIFY)) < 0)
+		err(1, "failed inotify_add_watch()");
 
-    if ((in = fopen(argv[1], "r")) == NULL)
-	err(1, "failed fopen()");
+	if ((in = fopen(argv[1], "r")) == NULL)
+		err(1, "failed fopen()");
 
-    if (stat(argv[2], &st) < 0 && errno == ENOENT && mkfifo(argv[2], 0700) < 0)
-	err(1, "failed to mkfifo %s\n", argv[2]);
+	if (stat(argv[2], &st) < 0 && errno == ENOENT && mkfifo(argv[2], 0700) < 0)
+		err(1, "failed to mkfifo %s\n", argv[2]);
 
-    while (fgets(buf, sizeof(buf), in))
-	fputs(buf, stdout);
+	while (fgets(buf, sizeof(buf), in))
+		fputs(buf, stdout);
 
-    fputs("NOTICE: waiting for other side to open out fifo...\n", stdout);
-    fflush(stdout);
-
-    if ((out = fopen(argv[2], "w")) == NULL)
-	err(1, "failed fopen()");
-
-    fputs("OK\n", stdout);
+	fputs("NOTICE: waiting for other side to open out fifo...\n", stdout);
 	fflush(stdout);
 
-    for (;;) {
-	FD_ZERO(&rd);
-	FD_SET(0, &rd);
-	FD_SET(evq, &rd);
+	if ((out = fopen(argv[2], "w")) == NULL)
+		err(1, "failed fopen()");
 
-	select(evq + 1, &rd, 0, 0, NULL);
+	fputs("...OK\n", stdout);
+	fflush(stdout);
 
-	if (FD_ISSET(evq, &rd)) {
-	    if (read(evq, buf, sizeof(buf)) < 0)
-		err(1, "failed read() on evq");
+	for (;;) {
+		FD_ZERO(&rd);
+		FD_SET(0, &rd);
+		FD_SET(evq, &rd);
 
-	    fgets(buf, sizeof(buf), in);
-	    fputs(buf, stdout);
-	    fflush(stdout);
+		select(evq + 1, &rd, 0, 0, NULL);
+
+		if (FD_ISSET(evq, &rd)) {
+			if (read(evq, buf, sizeof(buf)) < 0)
+				err(1, "failed read() on evq");
+
+			while (fgets(buf, sizeof(buf), in))
+				fputs(buf, stdout);
+			fflush(stdout);
+		}
+		if (FD_ISSET(0, &rd)) {
+			fgets(buf, sizeof(buf), stdin);
+			fputs(buf, out);
+			fflush(out);
+		}
 	}
-	if (FD_ISSET(0, &rd)) {
-	    fgets(buf, sizeof(buf), stdin);
-	    fputs(buf, out);
-	    fflush(out);
-	}
-    }
-    return 0;
+	return 0;
 }
 
 void win(int wd)
 {
-    char in[PATH_MAX], out[PATH_MAX];
+	char in[PATH_MAX], out[PATH_MAX];
 
-    if (wins[wd])
-	return;
+	if (wins[wd])
+		return;
 
-    strcpy(in,  paths[wd]);
-    strcpy(out, paths[wd]);
-    strcat(in , "/in" );
-    strcat(out, "/out");
+	strcpy(in,  paths[wd]);
+	strcpy(out, paths[wd]);
+	strcat(in , "/in" );
+	strcat(out, "/out");
 
-    printf("about to run urxvt -title %s -e cw %s %s\n", paths[wd], out, in);
+	printf("about to run urxvt -title %s -e cw %s %s\n", paths[wd], out, in);
 
-    if ((wins[wd] = fork()) == 0) {
-	execlp("urxvt", "urxvt", "-title", paths[wd], "-e", "rlwrap", "cw", out, in, NULL);
-	err(1, "failed on execlp cw");
-    } else {
-	printf("child has pid %d\n", wins[wd]);
-    }
+	if ((wins[wd] = fork()) == 0) {
+		execlp("urxvt", "urxvt", "-title", paths[wd], "-e", "rlwrap", "cw", out, in, NULL);
+		err(1, "failed on execlp cw");
+	} else {
+		printf("child has pid %d\n", wins[wd]);
+	}
 }
 
 int add_dir(const char *fpath, const struct stat *sb, int typeflag)
 {
-    int wd;
-    char out[PATH_MAX];
-    struct stat st;
+	int wd;
+	char out[PATH_MAX];
+	struct stat st;
 
-    if (!(typeflag & FTW_D))
-	return;
+	if (!(typeflag & FTW_D))
+		return;
 
-    if ((wd = inotify_add_watch(evq, fpath, IN_CREATE | IN_MODIFY)) < 0)
-	warn("failed on inotify_add_watch on %s", fpath);
+	if ((wd = inotify_add_watch(evq, fpath, IN_CREATE | IN_MODIFY)) < 0)
+		warn("failed on inotify_add_watch on %s", fpath);
 
-    if (paths[wd][0] == '\0') {
-	strcpy(paths[wd], fpath);
-	printf("added %s\n", paths[wd]);
-	strcpy(out, fpath);
-	strcat(out, "/out");
-	if (!init && stat(out, &st) == 0)
-	    win(wd);
-    } else {
-	printf("existed %s\n", paths[wd]);
-    }
+	if (paths[wd][0] == '\0') {
+		strcpy(paths[wd], fpath);
+		printf("added %s\n", paths[wd]);
+		strcpy(out, fpath);
+		strcat(out, "/out");
+		if (!init && stat(out, &st) == 0)
+			win(wd);
+	} else {
+		printf("existed %s\n", paths[wd]);
+	}
 
-    return 0;
+	return 0;
 }
 
 int find(int *haystack, int needle, int len)
 {
-    int i;
+	int i;
 
-    for (i = 0; i < len; i++)
-	if (haystack[i] == needle)
-	    return i;
+	for (i = 0; i < len; i++)
+		if (haystack[i] == needle)
+			return i;
 
-    return -1;
+	return -1;
 }
 
 void sigchld(int unused) {
-    pid_t pid;
-    int wd;
+	pid_t pid;
+	int wd;
 
-    if(signal(SIGCHLD, sigchld) == SIG_ERR)
-	err("failed installing SIGCHLD handler");
+	if(signal(SIGCHLD, sigchld) == SIG_ERR)
+		err("failed installing SIGCHLD handler");
 
-    while((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
-	printf("killed child with pid %d ", pid);
-	if ((wd = find(wins, pid, MAX_WATCH)) > -1) {
-	    printf("wd %d path %s\n", wd, paths[wd]);
-	    wins[wd] = 0;
-	} else {
-	    printf("no wd...\n");
+	while((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
+		printf("killed child with pid %d ", pid);
+		if ((wd = find(wins, pid, MAX_WATCH)) > -1) {
+			printf("wd %d path %s\n", wd, paths[wd]);
+			wins[wd] = 0;
+		} else {
+			printf("no wd...\n");
+		}
 	}
-    }
 }
 
 int main(int argc, char **argv)
 {
-    char buf[4096];
-    int i, len;
-    struct inotify_event *cur;
+	char buf[4096];
+	int i, len;
+	struct inotify_event *cur;
 
-    sigchld(0);
+	sigchld(0);
 
-    if ((evq = inotify_init()) < 0)
-	err(1, "failed on inotify_init()");
+	if ((evq = inotify_init()) < 0)
+		err(1, "failed on inotify_init()");
 
-    init = 1;
-    ftw(argv[1], add_dir, MAX_OPENFD);
-    init = 0;
+	init = 1;
+	ftw(argv[1], add_dir, MAX_OPENFD);
+	init = 0;
 
-    for (;;) {
-	if ((len = read(evq, buf, sizeof(buf))) < 0)
-	    warn("failed to read from inotify event queue");
-	for (cur = (struct inotify_event *)buf; (char *)cur - buf < len; cur += sizeof(struct inotify_event) + cur->len) {
-	    if (cur->mask & (IN_CREATE | IN_ISDIR))
-		ftw(argv[1], add_dir, MAX_OPENFD);
-	    if (cur->mask & (IN_CREATE | IN_MODIFY) && !strcmp(cur->name, "out"))
-		win(cur->wd);
+	for (;;) {
+		if ((len = read(evq, buf, sizeof(buf))) < 0)
+			warn("failed to read from inotify event queue");
+		for (cur = (struct inotify_event *)buf; (char *)cur - buf < len; cur += sizeof(struct inotify_event) + cur->len) {
+			if (cur->mask & (IN_CREATE | IN_ISDIR))
+				ftw(argv[1], add_dir, MAX_OPENFD);
+			if (cur->mask & (IN_CREATE | IN_MODIFY) && !strcmp(cur->name, "out"))
+				win(cur->wd);
+		}
 	}
-    }
 
-    return 0;
+	return 0;
 }
 {
 	struct termios set;
 	char buf[4096], bufout[4096], tput_cub[32], tmp[L_tmpnam], cmd[1024];
-	int i, j;
+	int i, j, len;
 	FILE *pipe, *fifo;
 	fd_set rd;
 
 		err(1, "could not mkfifo %s", tmp);
 
 	sprintf(cmd, "%s > %s", argv[1], tmp);
-	puts(cmd);
 
 	if ((pipe = popen(cmd, "w")) == NULL)
 		warn("could not popen %s", cmd);
 			switch (buf[i]) {
 				case '\n' :
 					for (j = 0; j < i; j++)
-						fprintf(stdout, "%s %s", tput_cub, tput_cub);
+						printf("%s %s", tput_cub, tput_cub);
 					fputs(buf, pipe);
-					fflush(stdout);
 					fflush(pipe);
 					buf[0] = '\0';
 					i = -1;
 					break;
 				default :
 					putc(buf[i], stdout);
-					fflush(stdout);
 			}
+			fflush(stdout);
 			i++;
 		}
 		if (FD_ISSET(fileno(fifo), &rd)) {
-			if (fgets(bufout, sizeof(bufout), fifo) == NULL)
-				warn("failed to fgets from fifo %s", tmp);
 			for (j = 0; j < i; j++)
 				printf("%s %s", tput_cub, tput_cub);
-			fputs(bufout, stdout);
+			fflush(stdout);
+
+			if ((len = read(fileno(fifo), bufout, sizeof(bufout))) < 0)
+				warn("failed to read from fifo %s", tmp);
+			write(1, bufout, len);
+
 			fputs(buf, stdout);
 			fflush(stdout);
 		}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.