Beispiel #1
0
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(""));
	}
}
Beispiel #2
0
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);
	}
Beispiel #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);
}
Beispiel #4
0
//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;
}
Beispiel #5
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)--;
			}
		}
	}
}