void getconfig(pkgstate* state) { pkgconfig* c = &state->cfg; stringptr_fromchar(getenv("A"), &c->arch); stringptr_fromchar(getenv("R"), &c->installroot); stringptr_fromchar(getenv("S"), &c->pkgroot); stringptr_fromchar(getenv("C"), &c->filecache); stringptr_fromchar(getenv("K"), &c->keep); stringptr_fromchar(getenv("LOGPATH"), &c->logdir); if(!c->arch.size) { die(SPL("need to set $A to either x86_64 or i386!\n")); } if(!c->installroot.size) c->installroot = *(stringptr_copy(SPL("/"))); if(!c->pkgroot.size) c->pkgroot = *(stringptr_copy(SPL("/src"))); if(!c->filecache.size) c->filecache = *(stringptr_copy(SPL("/src/tarballs"))); if(!c->keep.size) c->keep = *(stringptr_copy(SPL("/src/KEEP"))); if(!c->logdir.size) c->logdir = *(stringptr_copy(SPL("/src/logs"))); #define check_access(X) if(access(c->X.ptr, W_OK) == -1) { \ log_put(2, VARISL("cannot access "), VARISL(#X), NULL); \ log_perror(c->X.ptr); \ die(SPL("check your environment vars, if the directory exists and that you have write perm (may need root)")); \ } check_access(logdir); check_access(installroot); check_access(pkgroot); check_access(filecache); check_access(keep); snprintf(state->builddir_buf, sizeof(state->builddir_buf), "%s/build", c->pkgroot.ptr); stringptr_fromchar(state->builddir_buf, &c->builddir); if(access(state->builddir_buf, W_OK) == -1 && (errno != ENOENT || mkdir(state->builddir_buf, 0770) == -1)) { check_access(builddir); } #undef check_access }
int main(void) { ini_section sec; stringptr result; stringptr* ini = stringptr_copy(SPLITERAL("[main]\nfoo=bar\nbar=baz\n[section1]\nbaz=blah\nblah=foo\n")); // we need stringptr_copy since stringptr_linesplit modifies the buffer. which would segfault using a literal. stringptrlist* lines = stringptr_linesplit(ini); sec = iniparser_get_section(lines, SPLITERAL("main")); iniparser_getvalue(lines, &sec, SPLITERAL("bar"), &result); printf("[main] bar=%s, size=%d\n", result.ptr, (int) result.size); sec = iniparser_get_section(lines, SPLITERAL("section1")); iniparser_getvalue(lines, &sec, SPLITERAL("blah"), &result); printf("blah=%s, size=%d\n", result.ptr, (int) result.size); stringptr_free(ini); free(lines); return 0; }
pkgdata* packagelist_add(hashlist* list, stringptr* name, uint32_t hash) { pkgdata pkg_empty = {0}; pkg_empty.name = stringptr_copy(name); hashlist_add(list, hash, &pkg_empty); return packagelist_get(list, name, hash); }
void add_queue(stringptr* packagename, sblist* queue) { pkg_exec execdata = {0}; execdata.pid = (pid_t) -1; execdata.name = stringptr_copy(packagename); sblist_add(queue, &execdata); }
// contract: out is already zeroed and contains only name void get_package_contents(pkgconfig* cfg, stringptr* packagename, pkgdata* out) { ini_section sec; char buf[256]; ulz_snprintf(buf, sizeof(buf), "%s/pkg/%s", cfg->pkgroot.ptr, packagename->ptr); stringptr* fc = stringptr_fromfile(buf); stringptr val; if(!fc) goto err; stringptrlist* ini = stringptr_linesplit(fc); size_t start = 0; stringptr* tmp; sec = iniparser_get_section(ini, SPL("mirrors")); out->mirrors = stringptrlist_new(sec.linecount); for(start = sec.startline; start < sec.startline + sec.linecount; start++) { tmp = stringptrlist_get(ini, start); if(tmp->size) stringptrlist_add(out->mirrors, stringptr_strdup(tmp), tmp->size); } sec = iniparser_get_section(ini, SPL("main")); iniparser_getvalue(ini, &sec, SPL("tardir"), &val); if(val.size) out->tardir = stringptr_copy(&val); else { // must run after mirrors! stringptr fe; if(get_tarball_filename(out, buf, sizeof(buf))) { stringptr_fromchar(buf, &fe); strip_fileext(&fe); } else { fe.size = 0; fe.ptr = NULL; } out->tardir = stringptr_copy(&fe); } iniparser_getvalue(ini, &sec, SPL("sha512"), &val); if(val.size) out->sha512 = stringptr_copy(&val); else out->sha512 = NULL; iniparser_getvalue(ini, &sec, SPL("filesize"), &val); if(val.size) out->filesize = strtoint64(val.ptr, val.size); else out->filesize = 0; sec = iniparser_get_section(ini, SPL("deps")); out->deps = stringptrlist_new(sec.linecount); for(start = sec.startline; start < sec.startline + sec.linecount; start++) { tmp = stringptrlist_get(ini, start); if(tmp->size) stringptrlist_add(out->deps, stringptr_strdup(tmp), tmp->size); } sec = iniparser_get_section(ini, SPL("build")); // the build section has always to come last if(sec.startline || sec.linecount) { start = sec.startline; sec = iniparser_file_as_section(ini); // iniparser may disinterpret lines starting with [ // so be sure to use the entire rest of the file sec.startline = start; sec.linecount -= start; out->buildscript = stringptrlist_new(sec.linecount); for(start = sec.startline; start < sec.startline + sec.linecount; start++) { tmp = stringptrlist_get(ini, start); stringptrlist_add(out->buildscript, stringptr_strdup(tmp), tmp->size); } } else out->buildscript = stringptrlist_new(1); stringptrlist_free(ini); stringptr_free(fc); return; err: log_perror(packagename->ptr); die(SPL("package not existing")); }
int main() { stringptr* t1 = stringptr_copy(SPLITERAL("/usr/bin/../local/bin/./gcc/../..")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/usr/bin/..//.././/./usr/../..")); assert(!test(t1)); t1 = stringptr_copy(SPLITERAL("/usr/bin/..//.././/./usr/../")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/usr/bin/..//.././/.//../..")); assert(!test(t1)); t1 = stringptr_copy(SPLITERAL("/usr/local//bin")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("////usr/local//bin")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/./././usr/local//bin")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/./././usr/local//bin/../../")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/./././usr/local//bin/../../..")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/usr/.local//bin../.../foo")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/...../usr/.local//bin../.../foo/.")); assert(test(t1)); t1 = stringptr_copy(SPLITERAL("/./...../usr/.local//bin../.../foo/.")); assert(test(t1)); return 0; }