Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
complete @exec registration and handling
Baptiste Daroussin committed 15 years ago
commit d46b4624ec94e049570f4c8c76cc794fdbc24536
parent ef8e02defe096387d712134513869fcdb1950373
4 files changed +89 -34
modified libpkg/pkg_ports.c
@@ -6,6 +6,7 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
+
#include <ctype.h>

int
ports_parse_plist(struct pkg *pkg, char *plist, const char *prefix)
@@ -16,6 +17,8 @@ ports_parse_plist(struct pkg *pkg, char *plist, const char *prefix)
	char sha256[65];
	char path[MAXPATHLEN];
	int ret = 0;
+
	char *last_plist_file = NULL;
+
	char *cmd = NULL;

	buf = NULL;
	p = NULL;
@@ -43,15 +46,31 @@ ports_parse_plist(struct pkg *pkg, char *plist, const char *prefix)
					prefix = buf;
			} else if (STARTS_WITH(plist_p, "@comment ")){
				/* DO NOTHING: ignore the comments */
-
			} else if (STARTS_WITH(plist_p, "@unexec ")) {
-
				/* TODO */
-
			} else if (STARTS_WITH(plist_p, "@exec ")) {
-
				/* TODO */
+
			} else if (STARTS_WITH(plist_p, "@unexec ") || STARTS_WITH(plist_p, "@exec")) {
+
				buf = plist_p;
+

+
				while (!isspace(buf[0]))
+
					buf++;
+

+
				while (isspace(buf[0]))
+
					buf++;
+

+
				if (format_exec_cmd(&cmd, buf, prefix, last_plist_file) < 0)
+
					continue;
+

+
				if (plist_p[1] == 'u')
+
					pkg_addexec(pkg, cmd, PKG_UNEXEC);
+
				else
+
					pkg_addexec(pkg, cmd, PKG_EXEC);
+

+
				free(cmd);
+

			}else {
				warnx("%s is deprecated, ignoring", plist_p);
			}
		} else if (strlen(plist_p) > 0){
			buf = plist_p;
+
			last_plist_file = buf;

			if (prefix[strlen(prefix) - 1] == '/')
				snprintf(path, MAXPATHLEN, "%s%s", prefix, buf);
@@ -65,6 +84,7 @@ ports_parse_plist(struct pkg *pkg, char *plist, const char *prefix)
			else {
				ret--;
			}
+

		}

		plist_p += next + 1;
modified libpkg/pkgdb.c
@@ -122,20 +122,20 @@ pkgdb_init(sqlite3 *sdb)
		"pkg_format_version INTEGER"
	");"
	"CREATE TABLE scripts ("
-
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE"
+
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE, "
		"script TEXT,"
-
		"type INTEGER"
+
		"type INTEGER,"
		"PRIMARY KEY (package_id, type)"
	");"
	"CREATE INDEX scripts_package ON scripts (package_id);"
	"CREATE TABLE exec ("
-
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE"
+
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE, "
		"cmd TEXT,"
		"type INTEGER"
	");"
	"CREATE INDEX exec_package ON exec (package_id);"
	"CREATE TABLE options ("
-
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE"
+
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE, "
		"name TEXT,"
		"with INTEGER,"
		"PRIMARY KEY (package_id,name)"
@@ -145,7 +145,7 @@ pkgdb_init(sqlite3 *sdb)
		"origin TEXT,"
		"name TEXT,"
		"version TEXT,"
-
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE"
+
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE, "
		"PRIMARY KEY (package_id,origin)"
	");"
	"CREATE INDEX deps_origin ON deps (origin);"
@@ -158,7 +158,7 @@ pkgdb_init(sqlite3 *sdb)
	"CREATE INDEX files_package ON files (package_id);"
	"CREATE TABLE conflicts ("
		"name TEXT,"
-
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE"
+
		"package_id TEXT REFERENCES packages(origin) ON DELETE CASCADE, "
		"PRIMARY KEY (package_id,name)"
	");"
	"CREATE INDEX conflicts_package ON conflicts (package_id);";
@@ -613,13 +613,19 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg)
			sqlite3_bind_text(stmt_scripts, 1, pkg_script_data(scripts[i]), -1, SQLITE_STATIC);
			sqlite3_bind_int(stmt_scripts, 2, pkg_script_type(scripts[i]));
			sqlite3_bind_text(stmt_scripts, 3, pkg_get(pkg, PKG_ORIGIN), -1, SQLITE_STATIC);
+

+
			sqlite3_step(stmt_exec);
+
			sqlite3_reset(stmt_exec);
		}
	execs = pkg_execs(pkg);
	if (execs != NULL)
		for (i = 0; execs[i] != NULL; i++) {
-
			sqlite3_bind_text(stmt_scripts, 1, pkg_exec_cmd(execs[i]), -1, SQLITE_STATIC);
-
			sqlite3_bind_int(stmt_scripts, 2, pkg_exec_type(execs[i]));
-
			sqlite3_bind_text(stmt_scripts, 3, pkg_get(pkg, PKG_ORIGIN), -1, SQLITE_STATIC);
+
			sqlite3_bind_text(stmt_exec, 1, pkg_exec_cmd(execs[i]), -1, SQLITE_STATIC);
+
			sqlite3_bind_int(stmt_exec, 2, pkg_exec_type(execs[i]));
+
			sqlite3_bind_text(stmt_exec, 3, pkg_get(pkg, PKG_ORIGIN), -1, SQLITE_STATIC);
+
			
+
			sqlite3_step(stmt_exec);
+
			sqlite3_reset(stmt_exec);
		}
	sqlite3_finalize(stmt_pkg);
	sqlite3_finalize(stmt_dep);
@@ -629,6 +635,7 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg)
	sqlite3_finalize(stmt_scripts);

	sqlite3_exec(db->sqlite, "COMMIT;", NULL, NULL, NULL);
+

	
	return (0);
}
modified libpkg/util.c
@@ -151,29 +151,57 @@ file_to_buffer(const char *path, char **buffer)
	return (st.st_size);
}

-
char *
-
str_replace(char *string, const char *find, char *replace)
+
int
+
format_exec_cmd(char **dest, const char *in, const char *prefix, const char *plist_file)
{
-
	char *str, *end, *begin;
-
	size_t offset, replace_len, find_len;
-

-
	replace_len = strlen(replace);
-
	find_len = strlen(find);
-
	begin = string;
-
	str = NULL;
-
	offset = 0;
-

-
	while ((end = strstr(begin, find)) != NULL) {
-
		str = realloc(str, offset + replace_len + (end - begin));
-
		memcpy(str + offset, begin, end - begin);
-
		memcpy(str + offset + (end - begin), replace, replace_len);
-
		offset += (end - begin + replace_len);
-
		begin = end + find_len;
+
	struct sbuf *buf = sbuf_new_auto();
+
	char path[MAXPATHLEN];
+
	char *cp;
+
	int len = 0;
+

+
	while (in[0] != '\0') {
+
		if (in[0] == '%') {
+
			in++;
+
			switch(in[0]) {
+
				case 'D':
+
					sbuf_cat(buf, prefix);
+
					break;
+
				case 'F':
+
					sbuf_cat(buf, plist_file);
+
					break;
+
				case 'f':
+
					if (prefix[strlen(prefix) - 1] == '/')
+
						snprintf(path, MAXPATHLEN, "%s%s", prefix, plist_file);
+
					else
+
						snprintf(path, MAXPATHLEN, "%s/%s", prefix, plist_file);
+
					cp = strrchr(path, '/');
+
					cp ++;
+
					sbuf_cat(buf, cp);
+
					break;
+
				case 'B':
+
					if (prefix[strlen(prefix) - 1] == '/')
+
						snprintf(path, MAXPATHLEN, "%s%s", prefix, plist_file);
+
					else
+
						snprintf(path, MAXPATHLEN, "%s/%s", prefix, plist_file);
+
					cp = strrchr(path, '/');
+
					cp[0] = '\0';
+
					sbuf_cat(buf, path);
+
					break;
+
			}
+

+
		} else {
+
			sbuf_putc(buf, in[0]);
+
		}
+

+
		in++;
	}
-
	str = realloc(str, offset + strlen(begin) +1);
-
	memcpy(str+offset, begin, strlen(begin)+1);

-
	return (str);
+
	sbuf_finish(buf);
+
	*dest = strdup(sbuf_data(buf));
+
	len = sbuf_len(buf);
+
	sbuf_free(buf);
+
	
+
	return (0);
}

int
modified libpkg/util.h
@@ -23,7 +23,7 @@ void sbuf_reset(struct sbuf *);
void sbuf_free(struct sbuf *);

off_t file_to_buffer(const char *path, char **buffer);
-
char *str_replace(char *string, const char *find, char *replace);
+
int format_exec_cmd(char **, const char *, const char *, const char *);
int split_chr(char *, char);
int file_fetch(const char *, const char *);