#include #include #include #include #include #include #include /* get insert-before offset of first argument if any, argv end if none, or -1 * if wd already defined */ int get_wd_off(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) { if (strcmp("--working-directory", argv[i]) == 0) return -1; if (argv[i][0] == '-') break; } return i; } /* walk through /proc looking for alacritty cmdline */ bool walk_proc(void) { struct dirent *de; DIR *d = opendir("/proc"); FILE *f; char path[PATH_MAX], cmd[PATH_MAX]; if (d == NULL) abort(); while ((de = readdir(d)) != NULL) { path[0] = '\0'; strcat(path, "/proc/"); strcat(path, de->d_name); strcat(path, "/cmdline"); f = fopen(path, "r"); if (f == NULL) continue; fscanf(f, "%s", cmd); if (strstr(cmd, "alacritty") != NULL) { fclose(f); closedir(d); return true; } fclose(f); } closedir(d); return false; } int main(int argc, char *argv[]) { /* two for --working-directory and cwd, two for msg and create-window, one * for NULL */ char *argvnew[argc + 5]; char wd_arg_str[] = "--working-directory"; char cwd[PATH_MAX]; char alacritty[] = "alacritty"; char *msg_create_window[] = {"msg", "create-window"}; int i; int wd_off = get_wd_off(argc, argv); argvnew[0] = alacritty; /* insert --working-directory cwd if not already extant */ if (wd_off == -1) { for (i = 1; i < argc; i++) { argvnew[i] = argv[i]; } argvnew[i] = NULL; } else { getcwd(cwd, sizeof(cwd)); for (i = 1; i < wd_off; i++) argvnew[i] = argv[i]; argvnew[i] = wd_arg_str; argvnew[i + 1] = cwd; i += 2; for (; i < argc + 2; i++) argvnew[i] = argv[i - 2]; argvnew[i] = NULL; } /* check if alacritty is running and, if so, insert msg create-window */ if ( (argc < 2 || strcmp("msg", argv[1]) != 0) && walk_proc()) { /* shunt args up two to make room */ for (i = argc + 4; i > 2; i--) argvnew[i] = argvnew[i - 2]; argvnew[1] = msg_create_window[0]; argvnew[2] = msg_create_window[1]; } execv("/bin/alacritty", argvnew); }