void queue_package(pkgstate* state, stringptr* packagename, jobtype jt, int force) { if(!packagename->size) return; sblist* queue = (jt == JT_DOWNLOAD) ? state->dl_queue : state->build_queue; if(is_in_queue(packagename, queue)) return; if(!force && is_installed(state->installed_packages, packagename)) { ulz_fprintf(1, "package %s is already installed, skipping %s\n", packagename->ptr, jt == JT_DOWNLOAD ? "download" : "build"); return; } uint32_t hash = stringptr_hash(packagename); pkgdata* pkg = packagelist_get(state->package_list, packagename, hash); unsigned i; if(!pkg) { pkg = packagelist_add(state->package_list, packagename, hash); get_package_contents(&state->cfg, packagename, pkg); } for(i = 0; i < stringptrlist_getsize(pkg->deps); i++) queue_package(state, stringptrlist_get(pkg->deps, i), jt, 0); // omg recursion if( // if sizeof mirrors is 0, it is a meta package (jt == JT_DOWNLOAD && stringptrlist_getsize(pkg->mirrors) && !has_tarball(&state->cfg, pkg)) || (jt == JT_BUILD && stringptrlist_getsize(pkg->buildscript)) ) { add_queue(packagename, queue); } }
// checks if all dependencies are installed // then checks if the tarball is downloaded // then checks if its either a metapackage or doesnt require a tarball. int has_all_deps(pkgstate* state, pkgdata* item) { size_t i; pkg_exec* dlitem; for(i = 0; i < stringptrlist_getsize(item->deps); i++) if(!is_installed(state->installed_packages, stringptrlist_get(item->deps, i))) return 0; for(i = 0; i < sblist_getsize(state->dl_queue); i++) { dlitem = sblist_get(state->dl_queue, i); if(EQ(dlitem->name, item->name)) { return (dlitem->pid == 0); //download finished? } } return (!stringptrlist_getsize(item->mirrors) || has_tarball(&state->cfg, item)); }
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); }
stringptr* stringptrlist_tostring(stringptrlist* l) { size_t i; size_t req = 0; stringptr* result, *temp; for (i=0; i < stringptrlist_getsize(l); i++) { req += stringptrlist_get(l, i)->size + 1; } result = stringptr_new(req); if(!result) return NULL; req = 0; for (i=0; i < stringptrlist_getsize(l); i++) { temp = stringptrlist_get(l, i); if(temp->size) memcpy(result->ptr + req, temp->ptr, temp->size); req += temp->size; result->ptr[req] = '\n'; req++; } return result; }
ini_section iniparser_get_section_at(stringptrlist* inifile, const stringptr* sectionname, size_t startline) { ini_section result = {0, 0}; stringptr* line; size_t i; for(i = startline; i < stringptrlist_getsize(inifile); i++) { line = stringptrlist_get(inifile, i); if(!line) continue; // this should never happen... if( !result.startline && line->size >= (sectionname->size + 2) && //test for >= because there may be trailing whitespace. *line->ptr == '[' && *(line->ptr + 1 + sectionname->size) == ']' && !memcmp(line->ptr + 1, sectionname->ptr, sectionname->size) ) result.startline = i+1; else if (result.startline && line->size && *line->ptr == '[') { result.linecount = i - result.startline; goto done; } } if(result.startline && !result.linecount) result.linecount = stringptrlist_getsize(inifile) - result.startline; done: return result; }
// initialise with members list, containing all ids variant_info_list* get_variants(size_t_ptrlist* members, stringptr* last_prefix, stringptrlist* block_strings, size_t block_len) { size_t i; variant_info vr, *vp; stringptr* next_prefix, *act; size_t* id; if(last_prefix->size == block_len) return NULL; variant_info_list* res = NULL; stringptr temp; char c; for(i = 0; i < sblist_getsize(members); i++) { id = sblist_get(members, i); act = stringptrlist_get(block_strings, *id); if(last_prefix->size == 0 || stringptr_here(act, 0, last_prefix)) { if(!res) res = sblist_new(sizeof(variant_info), 16); if(!(vp = find_variant(res, act->ptr[last_prefix->size]))) { vr.c = act->ptr[last_prefix->size]; vr.members = sblist_new(sizeof(size_t), stringptrlist_getsize(members)); vr.variants = NULL; sblist_add(res, &vr); vp = find_variant(res, vr.c); } sblist_add(vp->members, id); } } if(res) { for (i = 0; i < sblist_getsize(res); i++) { vp = sblist_get(res, i); c = vp->c; temp.size = 1; temp.ptr = &c; next_prefix = stringptr_concat(last_prefix, &temp, NULL); vp->variants = get_variants(vp->members, next_prefix, block_strings, block_len); } } return res; }
int create_script(jobtype ptype, pkgstate* state, pkg_exec* item, pkgdata* data) { stringptr* temp, *config, tb; stringptr* set_cc = SPL("if [ -z \"$CC\" ] ; then\n\tCC=cc\nfi\n"); char* prefix; char buf[256]; int hastarball; if(ptype == JT_DOWNLOAD) { prefix = "dl"; } else if (ptype == JT_BUILD) { prefix = "build"; } else abort(); item->scripts.filename = stringptr_format("%s/%s_%s.sh", state->cfg.builddir.ptr, prefix, item->name->ptr); item->scripts.stdoutfn = stringptr_format("%s/%s_%s.log", state->cfg.logdir.ptr, prefix, item->name->ptr); config = make_config(&state->cfg); hastarball = get_tarball_filename(data, buf, sizeof(buf)); if(ptype == JT_DOWNLOAD) { if(!hastarball) abort(); //bug temp = stringptr_concat(SPL("#!/bin/sh\n"), config, SPL("wget -O $C/"), stringptr_fromchar(buf, &tb), SPL(" "), stringptrlist_get(data->mirrors, rand() % stringptrlist_getsize(data->mirrors)), //SPL(" --no-check-certificate"), NULL); } else if (ptype == JT_BUILD) { stringptr* buildscr = stringptrlist_tostring(data->buildscript); if(!hastarball) { temp = stringptr_concat(SPL("#!/bin/sh\n"), config, set_cc, buildscr, NULL); } else { if(data->tardir->size && data->tardir->ptr[0] == '/') // prevent erroneus scripts from trash our fs abort(); temp = stringptr_concat(SPL("#!/bin/sh\n"), config, set_cc, SPL("cd $S/build\n"), SPL("[ -e "), data->tardir, SPL(" ] && rm -rf "), data->tardir, SPL("\ntar xf $C/"), stringptr_fromchar(buf, &tb), SPL(" || (echo tarball error; exit 1)\ncd $S/build/"), data->tardir, SPL("\n"), buildscr, NULL); } stringptr_free(buildscr); } else abort(); stringptr_tofile(item->scripts.filename->ptr, temp); if(chmod(item->scripts.filename->ptr, 0777) == -1) die(SPL("error setting permission")); stringptr_free(config); stringptr_free(temp); return 1; }
int get_tarball_filename_with_path(pkgconfig* cfg, pkgdata* package, char* buf, size_t bufsize) { if(stringptrlist_getsize(package->mirrors) == 0) return 0; ulz_snprintf(buf, bufsize, "%s/%s", cfg->filecache.ptr, getfilename(stringptrlist_get(package->mirrors, 0))); return 1; }
int get_tarball_filename(pkgdata* package, char* buf, size_t bufsize) { if(stringptrlist_getsize(package->mirrors) == 0) return 0; ulz_snprintf(buf, bufsize, "%s", getfilename(stringptrlist_get(package->mirrors, 0))); return 1; }
ini_section iniparser_file_as_section(stringptrlist* inifile) { ini_section result; result.linecount = stringptrlist_getsize(inifile); result.startline = 0; return result; }