diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2019-12-18 13:30:57 -0500 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2019-12-18 13:30:57 -0500 |
commit | 3166627f1485e2f05421fe874b2236852fe5d017 (patch) | |
tree | d22a6c9b0e61907d15678146a3298efab1beed5b | |
parent | 2be3d5c5d905bd748b8ce511033065fa5a83a59c (diff) | |
download | spmc-3166627f1485e2f05421fe874b2236852fe5d017.tar.gz |
Improved output and error handling
-rw-r--r-- | archive.c | 11 | ||||
-rw-r--r-- | deps.c | 64 | ||||
-rw-r--r-- | install.c | 4 | ||||
-rw-r--r-- | spm.c | 29 | ||||
-rw-r--r-- | spm.h | 2 |
5 files changed, 93 insertions, 17 deletions
@@ -14,6 +14,12 @@ int tar_extract_file(const char *archive, const char* filename, const char *dest char cmd[PATH_MAX]; sprintf(cmd, "tar xf %s -C %s %s 2>&1", archive, destination, filename); + if (exists(archive) != 0) { + fprintf(stderr, "%s :: ", archive); + fprintf(SYSERROR); + return -1; + } + shell(&proc, SHELL_OUTPUT, cmd); if (!proc) { fprintf(SYSERROR); @@ -31,6 +37,11 @@ int tar_extract_archive(const char *_archive, const char *_destination) { int status; char cmd[PATH_MAX]; + if (exists(_archive) != 0) { + fprintf(SYSERROR); + return -1; + } + char *archive = strdup(_archive); if (!archive) { fprintf(SYSERROR); @@ -42,21 +42,45 @@ void dep_free(Dependencies **deps) { free((*deps)); } -int dep_append(Dependencies **deps, char *name) { +int dep_append(Dependencies **deps, char *_name) { + char *name = NULL; + char *bname = NULL; + if (!(*deps)) { return -1; } + + name = find_package(_name); + if (!name) { + perror(_name); + fprintf(SYSERROR); + return -1; + } + + bname = basename(name); + if (!bname) { + perror(name); + fprintf(SYSERROR); + return -1; + } + (*deps)->__size++; (*deps)->list = (char **)realloc((*deps)->list, sizeof(char *) * (*deps)->__size); if (!(*deps)->list) { + free(name); return -1; } - (*deps)->list[(*deps)->records] = (char *)calloc(strlen(name) + 1, sizeof(char)); + + (*deps)->list[(*deps)->records] = (char *)calloc(strlen(bname) + 1, sizeof(char)); if (!(*deps)->list[(*deps)->records]) { + free(name); return -1; } - strcpy((*deps)->list[(*deps)->records], name);//, strlen(name)); + + strcpy((*deps)->list[(*deps)->records], bname); (*deps)->records++; + + free(name); return 0; } @@ -105,24 +129,42 @@ int dep_solve(Dependencies **deps, const char *filename) { return line_count; } -void dep_all(Dependencies **deps, const char *_package) { +int dep_all(Dependencies **deps, const char *_package) { static int next = 0; - char *package = find_package(_package); + char *package = NULL; char depfile[PATH_MAX]; char template[PATH_MAX]; char suffix[PATH_MAX] = "spm_depends_all_XXXXXX"; - sprintf(template, "%s%c%s", TMP_DIR, DIRSEP, suffix); + + // Verify the requested package pattern exists + package = find_package(_package); + if (!package) { + perror(_package); + fprintf(SYSERROR); + return -1; + } // Create a new temporary directory and extract the requested package into it + sprintf(template, "%s%c%s", TMP_DIR, DIRSEP, suffix); char *tmpdir = mkdtemp(template); if (!tmpdir) { - perror(tmpdir); - exit(errno); + perror(template); + fprintf(SYSERROR); + return -1; + } + if (tar_extract_file(package, ".SPM_DEPENDS", tmpdir) < 0) { + perror(package); + fprintf(SYSERROR); + return -1; } - tar_extract_file(package, ".SPM_DEPENDS", tmpdir); - sprintf(depfile, "%s%c%s", tmpdir, DIRSEP, ".SPM_DEPENDS"); + // Scan depencency tree + sprintf(depfile, "%s%c%s", tmpdir, DIRSEP, ".SPM_DEPENDS"); int resolved = dep_solve(deps, depfile); + + // NOTE: + // 1. `resolved` is the number of dependencies for the package we're scanning + // 2. `next` permits us to converge on `resolved`, otherwise `i` would reset to `0` each time `dep_all` is called for (int i = next; i < resolved; i++) { next++; if (dep_seen(deps, (*deps)->list[i])) { @@ -130,8 +172,10 @@ void dep_all(Dependencies **deps, const char *_package) { } } + // Remove temporary data unlink(depfile); unlink(tmpdir); + return 0; } void dep_show(Dependencies **deps) { @@ -6,8 +6,8 @@ int install(const char *destroot, const char *_package) { fprintf(SYSERROR); return -1; } - printf("Installing: %s\n", package); - if (access(destroot, F_OK) != 0) { + + if (exists(destroot) != 0) { if (mkdirs(destroot, 0755) != 0) { fprintf(SYSERROR); return -2; @@ -17,21 +17,42 @@ int main(int argc, char *argv[]) { check_runtime_environment(); // Install a package to test things out + char *match; + char *package; const char *root = "/tmp/root"; - const char *package = "python"; + if ((match = find_package("python")) == NULL) { + fprintf(SYSERROR); + exit(1); + } + if ((package = basename(match)) == NULL) { + fprintf(stderr, "Unable to derive package name from package path:\n\t-> %s\n", match); + exit(1); + } Dependencies *deps = NULL; dep_init(&deps); - dep_all(&deps, package); + + if (dep_all(&deps, package) < 0) { + dep_free(&deps); + free_global_config(); + exit(1); + } + printf("%s requires:\n", package); dep_show(&deps); // Install dependencies first for (int i = 0; i < deps->records; i++) { - install(root, deps->list[i]); + if (install(root, deps->list[i]) < 0) { + fprintf(SYSERROR); + exit(errno); + } } // Install package - install(root, package); + if (install(root, package) < 0) { + fprintf(SYSERROR); + exit(errno); + } dep_free(&deps); free_global_config(); @@ -169,7 +169,7 @@ int dep_init(Dependencies **deps); void dep_free(Dependencies **deps); int dep_append(Dependencies **deps, char *name); int dep_solve(Dependencies **deps, const char *filename); -void dep_all(Dependencies **deps, const char *_package); +int dep_all(Dependencies **deps, const char *_package); void dep_show(Dependencies **deps); // fstree.c |