#include #include #include #include #include "pkg.h" #include "src.h" typedef struct Exec Exec; struct Exec { char *file; char **argv; Channel *pidch; }; void pexec(void *args) { Exec *e = args; procexec(e->pidch, e->file, e->argv); } static int fetchgit(char *url, char *rev, char *dir) { Exec e; char *argv[] = {"rc", "-c", smprint("git/clone %s %s", url, dir), nil}; Channel *c = threadwaitchan(); Waitmsg *w; int pid, rpid; e.argv = argv; e.file = "/bin/rc"; e.pidch = chancreate(sizeof(int), 0); if(rev != nil){ free(argv[2]); fprint(2, "FIXME git/clone %s rev %s\n", url, dir); return -1; } procrfork(pexec, &e, 0x2000, RFFDG); recv(e.pidch, &pid); chanfree(e.pidch); if(pid < 0){ fprint(2, "failed to spawn process\n"); return -1; } w = recvp(c); free(argv[2]); if(w == nil){ fprint(2, "Receiving pid failed\n"); return -1; } rpid = w->pid; free(w); return rpid == pid; } int fetchsrc(Src *src) { char *url, dir[12] = "XXXXXXXXXXX"; int d; mktemp(dir); d = -1; if(strncmp(src->url, "github://", 9) == 0){ url = smprint("git://github.com/%s", src->url + 9); d = fetchgit(url, src->rev, dir); free(url); }else if(strncmp(src->url, "sourcehut://", 12) == 0){ url = smprint("https://git.sr.ht/%s", src->url + 12); d = fetchgit(url, src->rev, dir); free(url); }else if(strncmp(src->url, "git://", 6) == 0){ d = fetchgit(src->url, src->rev, dir); }else{ werrstr("unknown scheme"); } return d; }