2 * Copyright (c) 2024 Omar Polo <op@omarpolo.com>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30 #include "minibuffer.h"
33 #define TMPFILE "/tmp/telescope.XXXXXXXXXX"
36 exec_cmd(char **argv, enum exec_mode mode)
45 if (mode == EXEC_FOREGROUND) {
48 fprintf(stderr, "%s: running", getprogname());
49 for (t = argv; *t; ++t)
50 fprintf(stderr, " %s", *t);
51 fprintf(stderr, "\n");
55 switch (pid = fork()) {
57 message("failed to fork: %s", strerror(errno));
60 if (mode == EXEC_BACKGROUND) {
61 if ((fd = open("/dev/null", O_RDWR)) == -1) {
62 warn("can't open /dev/null");
71 execvp(argv[0], argv);
72 if (mode == EXEC_FOREGROUND) {
73 warn("can't exec \"%s\"", argv[0]);
74 fprintf(stderr, "Press enter to continue");
81 if (mode == EXEC_BACKGROUND)
85 ret = waitpid(pid, &s, 0);
86 } while (ret == -1 && errno == EINTR);
90 if (WIFSIGNALED(s) || WEXITSTATUS(s) != 0) {
91 message("%s failed", *argv);
99 exec_editor(void *data, size_t len)
103 char sfn[sizeof(TMPFILE)];
107 strlcpy(sfn, TMPFILE, sizeof(sfn));
108 if ((fd = mkstemp(sfn)) == -1) {
109 message("failed to create a temp file: %s", strerror(errno));
112 (void) write(fd, data, len);
115 if ((editor = getenv("VISUAL")) == NULL &&
116 (editor = getenv("EDITOR")) == NULL)
117 editor = (char *)DEFAULT_EDITOR;
123 if (exec_cmd(argv, EXEC_FOREGROUND) == -1) {
128 if ((fp = fopen(sfn, "r")) == NULL) {
129 message("can't open temp file!");