Date: Wed, 19 Aug 2015 15:56:23 GMT From: roam@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r289927 - soc2015/roam/ayiya_listen Message-ID: <201508191556.t7JFuNbK077103@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: roam Date: Wed Aug 19 15:56:23 2015 New Revision: 289927 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289927 Log: ayiya_listen: autodetect the path to ayiya_resp Modified: soc2015/roam/ayiya_listen/main.c Modified: soc2015/roam/ayiya_listen/main.c ============================================================================== --- soc2015/roam/ayiya_listen/main.c Wed Aug 19 15:56:16 2015 (r289926) +++ soc2015/roam/ayiya_listen/main.c Wed Aug 19 15:56:23 2015 (r289927) @@ -28,6 +28,7 @@ #include <sys/types.h> #include <sys/socket.h> +#include <sys/stat.h> #include <sys/wait.h> #include <netinet/in.h> @@ -162,9 +163,6 @@ } else if (tunnelsfile == NULL) { warnx("No tunnels file (-t) specified"); usage(1); - } else if (resppath == NULL) { - warnx("No ayiya_resp path (-r) specified"); - usage(1); } argc -= optind; @@ -174,6 +172,68 @@ usage(1); } + if (resppath == NULL) { + debug("Trying to autodetect the ayiya_resp location\n"); + int makev[2]; + if (pipe(makev) == -1) + err(1, "pipe() failed"); + const pid_t makepid = fork(); + if (makepid == -1) { + err(1, "fork() for make -V .OBJDIR failed"); + } else if (makepid == 0) { + if (chdir("ayiya_resp") == -1) { + if (errno != ENOENT) + err(1, "chdir('ayiya_resp') failed"); + if (chdir("../ayiya_resp") == -1) + err(1, "chdir('../ayiya_resp') failed"); + } + + close(makev[0]); + if (makev[1] != 1) { + close(1); + if (dup2(makev[1], 1) == -1) + err(1, "dup2() failed"); + } + execlp("make", "make", "-V", ".OBJDIR", NULL); + err(1, "exec('make') failed"); + } + debug("makepid is %jd\n", (intmax_t)makepid); + close(makev[1]); + FILE * const fp = fdopen(makev[0], "r"); + if (fp == NULL) + err(1, "fdopen(%d) for make -V .OBJDIR failed", + makev[0]); + char *line = NULL; + size_t sz = 0; + ssize_t len = getline(&line, &sz, fp); + if (len < 1) { + if (feof(fp)) + errx(1, "make -V .OBJDIR produced no output"); + else + err(1, "getline() for make -V .OBJDIR failed"); + } + fclose(fp); + int stat; + const pid_t wpid = waitpid(makepid, &stat, 0); + check_wait_result(wpid, stat, makepid, "make -V .OBJDIR"); + + while (len > 0 && (line[len - 1] == '\r' || line[len - 1] == '\n')) + line[--len] = '\0'; + debug("make -V .OBJDIR for ayiya_resp returned '%s'\n", line); + char *path; + asprintf(&path, "%s/%s", line, "ayiya_resp"); + if (path == NULL) + err(1, "Could not build the ayiya_resp path"); + resppath = path; + debug("Autodetected ayiya_resp path '%s'\n", resppath); + } + debug("Checking the ayiya_resp path '%s' for validity\n", resppath); + struct stat st; + if (stat(resppath, &st) == -1) + err(1, "Invalid ayiya_resp path '%s'", resppath); + else if (!S_ISREG(st.st_mode) || ((st.st_mode & 0111) == 0)) + errx(1, "Non-executable file '%s'", resppath); + parse_tunnels(tunnelsfile); signal(SIGPIPE, SIG_IGN);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508191556.t7JFuNbK077103>