|
|
@ -54,6 +54,8 @@ struct package { |
|
|
|
char *alias; |
|
|
|
char *version; |
|
|
|
char *prefix; |
|
|
|
/* flags must end with a space character |
|
|
|
(for easily searching for flags). */ |
|
|
|
char *flags; |
|
|
|
struct package *next; |
|
|
|
}; |
|
|
@ -98,8 +100,19 @@ int read_pkg_list(const char *file) { |
|
|
|
pkg_tmp->repository = strdup(tok); |
|
|
|
|
|
|
|
tok = strtok(0, " "); |
|
|
|
pkg_tmp->name = strdup(tok); |
|
|
|
pkg_tmp->alias = strdup(tok); |
|
|
|
char *c = strchr(tok, '='); |
|
|
|
if (c) |
|
|
|
{ |
|
|
|
pkg_tmp->name = malloc(c-tok+1); |
|
|
|
pkg_tmp->name[c-tok] = '\0'; |
|
|
|
strncpy(pkg_tmp->name, tok, c-tok); |
|
|
|
pkg_tmp->alias = strdup(c+1); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
pkg_tmp->name = strdup(tok); |
|
|
|
pkg_tmp->alias = strdup(tok); |
|
|
|
} |
|
|
|
|
|
|
|
tok = strtok(0, " "); |
|
|
|
pkg_tmp->version = strdup(tok); |
|
|
@ -108,7 +121,7 @@ int read_pkg_list(const char *file) { |
|
|
|
pkg_tmp->prefix = strdup(tok); |
|
|
|
|
|
|
|
tok = strtok(0, "\n"); |
|
|
|
tok[strlen(tok)-2] = 0; |
|
|
|
tok[strlen(tok)-1] = 0; |
|
|
|
pkg_tmp->flags = strdup(tok); |
|
|
|
|
|
|
|
if ( !package_list ) |
|
|
@ -134,7 +147,7 @@ int write_pkg_list(const char *file) { |
|
|
|
fprintf(f, " %s %s %s", pkg->prio, pkg->repository, pkg->name); |
|
|
|
if (strcmp(pkg->name, pkg->alias)) |
|
|
|
fprintf(f, "=%s", pkg->alias); |
|
|
|
fprintf(f, " %s %s %s 0\n", pkg->version, pkg->prefix, pkg->flags); |
|
|
|
fprintf(f, " %s %s %s0\n", pkg->version, pkg->prefix, pkg->flags); |
|
|
|
pkg = pkg->next; |
|
|
|
} |
|
|
|
|
|
|
@ -208,6 +221,91 @@ int pkgswitch(int mode, char **args) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int pkgfork(char *pkgname, char *xpkg, char** opt) |
|
|
|
{ |
|
|
|
|
|
|
|
struct package *fork, *pkg; |
|
|
|
int i, k; |
|
|
|
|
|
|
|
for (pkg = package_list; pkg; pkg = pkg->next) |
|
|
|
if (!strcmp(pkg->alias, pkgname)) |
|
|
|
break; |
|
|
|
if (!pkg) return 1; |
|
|
|
|
|
|
|
fork = calloc(1, sizeof(struct package)); |
|
|
|
|
|
|
|
fork->status = pkg->status; |
|
|
|
for (k=0; k<10; k++) |
|
|
|
fork->stages[k] = pkg->stages[k]; |
|
|
|
fork->prio = strdup(pkg->prio); |
|
|
|
fork->repository = strdup(pkg->repository); |
|
|
|
fork->name = strdup(pkgname); |
|
|
|
fork->alias = strdup(xpkg); |
|
|
|
fork->version = strdup(pkg->version); |
|
|
|
fork->prefix = strdup(pkg->prefix); |
|
|
|
fork->flags = strdup(pkg->flags); |
|
|
|
|
|
|
|
fork->next = pkg->next; |
|
|
|
pkg->next = fork; |
|
|
|
|
|
|
|
for (i=0; *opt[i] && *opt[i+1]; i+=2) |
|
|
|
{ |
|
|
|
if (!strcmp(opt[i], "status")) |
|
|
|
fork->status= opt[i+1][0] == 'X'; |
|
|
|
|
|
|
|
else if (!strcmp(opt[i], "stages")) |
|
|
|
for (k=0; k<10; k++) |
|
|
|
fork->stages[k] = opt[i+1][k] != '-' ? opt[i+1][k] : 0; |
|
|
|
|
|
|
|
else if (!strcmp(opt[i], "priority")) |
|
|
|
{ |
|
|
|
free(fork->prio); |
|
|
|
fork->prio = strdup(opt[i+1]); |
|
|
|
} |
|
|
|
|
|
|
|
else if (!strcmp(opt[i], "version")) |
|
|
|
{ |
|
|
|
free(fork->version); |
|
|
|
fork->version = strdup(opt[i+1]); |
|
|
|
} |
|
|
|
|
|
|
|
else if (!strcmp(opt[i], "prefix")) |
|
|
|
{ |
|
|
|
free(fork->prefix); |
|
|
|
fork->prefix = strdup(opt[+1]); |
|
|
|
} |
|
|
|
|
|
|
|
else if (!strcmp(opt[i], "flag")) |
|
|
|
{ |
|
|
|
char buf[512], flag[512]; |
|
|
|
snprintf(flag, 512, " %s ", opt[i+1]); |
|
|
|
if (! strstr(fork->flags, flag)) |
|
|
|
{ |
|
|
|
free(fork->flags); |
|
|
|
snprintf(buf, 512, "%s%s ", pkg->flags, opt[i+1]); |
|
|
|
fork->flags = strdup(buf); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if (!strcmp(opt[i], "unflag")) |
|
|
|
{ |
|
|
|
char buf[512], flag[512]; |
|
|
|
snprintf(flag, 512, " %s ", opt[i+1]); |
|
|
|
char *flagstart = strstr(fork->flags, flag); |
|
|
|
if (flagstart) |
|
|
|
{ |
|
|
|
int len = flagstart - fork->flags + 1; |
|
|
|
strncpy(buf, fork->flags, len); |
|
|
|
strncpy(buf+len, flagstart+strlen(flag), 512-len); |
|
|
|
|
|
|
|
free(fork->flags); |
|
|
|
fork->flags = strdup(buf); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int cfghlp_builtin(WORD_LIST *list) |
|
|
|
{ |
|
|
|
char *args[10]; |
|
|
@ -224,21 +322,24 @@ int cfghlp_builtin(WORD_LIST *list) |
|
|
|
if (!strcmp(args[0],"pkg_in")) |
|
|
|
return read_pkg_list(args[1]); |
|
|
|
|
|
|
|
if (!strcmp(args[0],"pkg_out")) |
|
|
|
else if (!strcmp(args[0],"pkg_out")) |
|
|
|
return write_pkg_list(args[1]); |
|
|
|
|
|
|
|
if (!strcmp(args[0],"pkgcheck")) |
|
|
|
else if (!strcmp(args[0],"pkgcheck")) |
|
|
|
return pkgcheck(args[1], args[2]); |
|
|
|
|
|
|
|
if (!strcmp(args[0],"pkgremove")) |
|
|
|
else if (!strcmp(args[0],"pkgremove")) |
|
|
|
return pkgswitch(0, args+1); |
|
|
|
|
|
|
|
if (!strcmp(args[0],"pkgenable")) |
|
|
|
else if (!strcmp(args[0],"pkgenable")) |
|
|
|
return pkgswitch(1, args+1); |
|
|
|
|
|
|
|
if (!strcmp(args[0],"pkgdisable")) |
|
|
|
else if (!strcmp(args[0],"pkgdisable")) |
|
|
|
return pkgswitch(2, args+1); |
|
|
|
|
|
|
|
else if (!strcmp(args[0],"pkgfork")) |
|
|
|
return pkgfork(args[1], args[2], args+3); |
|
|
|
|
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|