Esempio n. 1
0
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);
	}
	
}
Esempio n. 2
0
// 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));
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
// 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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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;
}
Esempio n. 10
0
ini_section iniparser_file_as_section(stringptrlist* inifile) {
	ini_section result;
	result.linecount = stringptrlist_getsize(inifile);
	result.startline = 0;
	return result;
}