Commits

Anonymous committed 30b5010

move cwd pcw

Comments (0)

Files changed (2)

cwd.c

-#include <err.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <signal.h>
-#include <sys/inotify.h>
-#include <sys/wait.h>
-#include <stdio.h>
-#include <ftw.h>
-#include <string.h>
-
-#define PATH_MAX    1024
-#define MAX_OPENFD  4
-#define MAX_WATCH   512
-
-int evq, init;
-char paths[MAX_WATCH][PATH_MAX] = {{0}};
-int wins[MAX_WATCH] = {0};
-
-char term[16] = "urxvt";
-
-void usage(void)
-{
-	printf("Usage: pcw [-t terminal] [-v] dir\n");
-	exit(1);
-}
-
-void win(int wd)
-{
-	char out[PATH_MAX], in[PATH_MAX];
-	char *wincmd[] = {term, "-title", paths[wd], "-e", "srw", "cw", "-f", out, in, NULL};
-
-	if (wins[wd])
-		return;
-
-	sprintf(out, "%s/out", paths[wd]);
-	sprintf(in,  "%s/in",  paths[wd]);
-
-	if ((wins[wd] = fork()) == 0) {
-		execvp(wincmd[0], wincmd);
-		err(1, "failed on execlp cw");
-	}
-}
-
-int add_dir(const char *fpath, const struct stat *sb, int typeflag)
-{
-	int wd;
-	char out[PATH_MAX];
-	struct stat st;
-
-	if (!(typeflag & FTW_D))
-		return 0;
-
-	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);
-		strcpy(out, fpath);
-		strcat(out, "/out");
-		if (!init && stat(out, &st) == 0)
-			win(wd);
-	}
-
-	return 0;
-}
-
-int find(int *haystack, int needle, int len)
-{
-	int i;
-
-	for (i = 0; i < len; i++)
-		if (haystack[i] == needle)
-			return i;
-
-	return -1;
-}
-
-void sigchld(int unused) {
-	pid_t pid;
-	int wd;
-
-	while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
-		if ((wd = find(wins, pid, MAX_WATCH)) > -1)
-			wins[wd] = 0;
-	}
-}
-
-int main(int argc, char **argv)
-{
-	char buf[4096];
-	int i, len;
-	struct inotify_event *cur;
-	struct stat st;
-
-	for (i = 1; i < argc; i++) {
-		if (argv[i][0] != '-')
-			break;
-		if (argv[i][2] != '\0')
-			usage();
-		switch (argv[i][1]) {
-			case 't' : if (i + 1 >= argc) usage(); strncpy(term, argv[i + 1], sizeof(term)); break;
-			case 'v' : printf("pcw-"VERSION" © Evan Gates\n"); exit(1);
-			default  : usage();
-		}
-	}
-
-	if (i >= argc)
-		usage();
-
-	if (stat(argv[1], &st) < 0 || !S_ISDIR(st.st_mode))
-		errx(1, "%s does not exist or is not a directory", argv[1]);
-
-	if (signal(SIGCHLD, sigchld) == SIG_ERR)
-		err(1, "failed installing SIGCHLD handler");
-
-	if ((evq = inotify_init()) < 0)
-		err(1, "failed on inotify_init()");
-
-	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);
-		}
-	}
-
-	return 0;
-}
+#include <err.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/inotify.h>
+#include <sys/wait.h>
+#include <stdio.h>
+#include <ftw.h>
+#include <string.h>
+
+#define PATH_MAX    1024
+#define MAX_OPENFD  4
+#define MAX_WATCH   512
+
+int evq, init;
+char paths[MAX_WATCH][PATH_MAX] = {{0}};
+int wins[MAX_WATCH] = {0};
+
+char term[16] = "urxvt";
+
+void usage(void)
+{
+	printf("Usage: pcw [-t terminal] [-v] dir\n");
+	exit(1);
+}
+
+void win(int wd)
+{
+	char out[PATH_MAX], in[PATH_MAX];
+	char *wincmd[] = {term, "-title", paths[wd], "-e", "srw", "pcw", "-f", out, in, NULL};
+
+	if (wins[wd])
+		return;
+
+	sprintf(out, "%s/out", paths[wd]);
+	sprintf(in,  "%s/in",  paths[wd]);
+
+	if ((wins[wd] = fork()) == 0) {
+		execvp(wincmd[0], wincmd);
+		err(1, "failed on execlp cw");
+	}
+}
+
+int add_dir(const char *fpath, const struct stat *sb, int typeflag)
+{
+	int wd;
+	char out[PATH_MAX];
+	struct stat st;
+
+	if (!(typeflag & FTW_D))
+		return 0;
+
+	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);
+		strcpy(out, fpath);
+		strcat(out, "/out");
+		if (!init && stat(out, &st) == 0)
+			win(wd);
+	}
+
+	return 0;
+}
+
+int find(int *haystack, int needle, int len)
+{
+	int i;
+
+	for (i = 0; i < len; i++)
+		if (haystack[i] == needle)
+			return i;
+
+	return -1;
+}
+
+void sigchld(int unused) {
+	pid_t pid;
+	int wd;
+
+	while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
+		if ((wd = find(wins, pid, MAX_WATCH)) > -1)
+			wins[wd] = 0;
+	}
+}
+
+int main(int argc, char **argv)
+{
+	char buf[4096];
+	int i, len;
+	struct inotify_event *cur;
+	struct stat st;
+
+	for (i = 1; i < argc; i++) {
+		if (argv[i][0] != '-')
+			break;
+		if (argv[i][2] != '\0')
+			usage();
+		switch (argv[i][1]) {
+			case 't' : if (i + 1 >= argc) usage(); strncpy(term, argv[i + 1], sizeof(term)); break;
+			case 'v' : printf("pcw-"VERSION" © Evan Gates\n"); exit(1);
+			default  : usage();
+		}
+	}
+
+	if (i >= argc)
+		usage();
+
+	if (stat(argv[1], &st) < 0 || !S_ISDIR(st.st_mode))
+		errx(1, "%s does not exist or is not a directory", argv[1]);
+
+	if (signal(SIGCHLD, sigchld) == SIG_ERR)
+		err(1, "failed installing SIGCHLD handler");
+
+	if ((evq = inotify_init()) < 0)
+		err(1, "failed on inotify_init()");
+
+	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);
+		}
+	}
+
+	return 0;
+}
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.