void launch_thread(jobtype ptype, pkgstate* state, pkg_exec* item, pkgdata* data) { char* arr[2]; create_script(ptype, state, item, data); log_timestamp(1); log_putspace(1); if(ptype == JT_DOWNLOAD) { log_puts(1, SPL("downloading ")); } else log_puts(1, SPL("building ")); log_put(1, VARIS(item->name), VARISL("("), VARIS(item->scripts.filename), VARISL(") -> "), VARIS(item->scripts.stdoutfn), NULL); arr[0] = item->scripts.filename->ptr; arr[1] = NULL; posix_spawn_file_actions_init(&item->fa); posix_spawn_file_actions_addclose(&item->fa, 0); posix_spawn_file_actions_addclose(&item->fa, 1); posix_spawn_file_actions_addclose(&item->fa, 2); posix_spawn_file_actions_addopen(&item->fa, 0, "/dev/null", O_RDONLY, 0); posix_spawn_file_actions_addopen(&item->fa, 1, item->scripts.stdoutfn->ptr, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); posix_spawn_file_actions_adddup2(&item->fa, 1, 2); int ret = posix_spawnp(&item->pid, arr[0], &item->fa, NULL, arr, environ); if(ret == -1) { log_perror("posix_spawn"); die(SPL("")); } }
void dump_variants(int outfd, stringptr* section_name, variant_info_list* variants, stringptrlist* block_strings, size_t level, size_t previous_membercount, ssize_t backindent) { if(variants == NULL) return; variant_info* vp; stringptr* act, normalized; char norm_buf[1024]; size_t membercount; size_t* id; int switched = 0; sblist_iter(variants, vp) { membercount = sblist_getsize(vp->members); if(membercount == previous_membercount) { print_level_tabs(outfd, level - backindent); ulz_fprintf(outfd, "if(str[%zu]!='%c') goto main_default;\n", level, vp->c); backindent++; } else { if(!switched) { print_level_tabs(outfd, level - backindent); ulz_fprintf(outfd, "switch(str[%zu]) {\n", level); switched = 1; backindent--; } print_level_tabs(outfd, level - backindent); ulz_fprintf(outfd, "case '%c':\n", vp->c); } if(!vp->variants) { print_level_tabs(outfd, level - backindent); id = sblist_get(vp->members, 0); act = sblist_get(block_strings, *id); normalized = normalize(act, norm_buf, sizeof(norm_buf)); log_put(outfd, VARISL("\treturn stringswitch_enumerator_member_name("), VARIS(section_name), VARISL(", "), VARIS(&normalized), VARISL(");"), NULL); } dump_variants(outfd, section_name, vp->variants, block_strings, level+1, membercount, backindent); }
void write_enum(int outfd, sectionrec* sref) { hashlist* h; hashlist_iterator iter2; hashrec *href; stringptrlist* newlist; size_t i; stringptr *entry, normalized; char norm_buf[1024]; char buf[1024]; log_put(outfd, VARISL("typedef enum {\n\tstringswitch_enumerator_default_member_name("), VARIS(sref->id), VARISL("),"), NULL); h = sref->h; hashlist_iterator_init(&iter2); while((href = hashlist_next(h, &iter2))) { newlist = href->list; for(i = 0; i < stringptrlist_getsize(newlist); i++) { entry = stringptrlist_get(newlist, i); log_put(1, VARISL("id "), VARIS(sref->id), VARISL(", entry: "), VARII((int) entry->size), VARISL(", "), VARIS(entry), NULL); normalized = normalize(entry, norm_buf, sizeof(norm_buf)); ulz_snprintf(buf, sizeof(buf), "\tstringswitch_enumerator_member_name(%s, %s),\n", sref->id->ptr, normalized.ptr); log_putc(outfd, buf); } } log_put(outfd, VARISL("} stringswitch_enumerator_name("), VARIS(sref->id), VARISL(");\n"), NULL); }
//return 0 on success. //checks if filesize and/or sha512 matches, if used. int verify_tarball(pkgconfig* cfg, pkgdata* package) { char buf[4096]; char* error; SHA512_CTX ctx; int fd; uint64_t pos, len = 0, nread; stringptr hash; get_tarball_filename_with_path(cfg, package, buf, sizeof(buf)); if(package->filesize) { len = getfilesize(buf); if(len < package->filesize) { log_put(2, VARISL("WARNING: "), VARIC(buf), VARISL(" filesize too small!"), NULL); return 1; } else if (len > package->filesize) { log_put(2, VARISL("WARNING: "), VARIC(buf), VARISL(" filesize too big!"), NULL); return 2; } } if(package->sha512) { if(!len) len = getfilesize(buf); fd = open(buf, O_RDONLY); if(fd == -1) { error = strerror(errno); log_put(2, VARISL("WARNING: "), VARIC(buf), VARISL(" failed to open: "), VARIC(error), NULL); return 3; } SHA512_Init(&ctx); pos = 0; while(pos < len) { nread = read(fd, buf, sizeof(buf)); SHA512_Update(&ctx, (const uint8_t*) buf, nread); pos += nread; } close(fd); SHA512_End(&ctx, (char*) buf); hash.ptr = buf; hash.size = strlen(buf); if(!EQ(&hash, package->sha512)) { log_put(2, VARISL("WARNING: "), VARIS(package->name), VARISL(" sha512 mismatch, got "), VARIS(&hash), VARISL(", expected "), VARIS(package->sha512), NULL); return 4; } } return 0; }
void fill_slots(jobtype ptype, pkgstate* state) { size_t i; pkg_exec* item; pkgdata* pkg; int* slots = (ptype == JT_DOWNLOAD) ? &state->slots.dl_slots : &state->slots.build_slots; sblist* queue = (ptype == JT_DOWNLOAD) ? state->dl_queue : state->build_queue; for(i = 0; *slots && i < sblist_getsize(queue); i++) { item = sblist_get(queue, i); if(item->pid == -1) { pkg = packagelist_get(state->package_list, item->name, stringptr_hash(item->name)); if(ptype == JT_DOWNLOAD || has_all_deps(state, pkg)) { if(ptype == JT_BUILD && !pkg->verified) { if (! (pkg->verified = !(verify_tarball(&state->cfg, pkg)))) { log_put(2, VARISL("WARNING: "), VARIS(item->name), VARISL(" failed to verify! please delete its tarball and retry downloading it."), NULL); continue; } } launch_thread(ptype, state, item, pkg); (*slots)--; } } } }