summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJudd Vinet <judd@archlinux.org>2003-04-11 18:58:50 +0200
committerJudd Vinet <judd@archlinux.org>2003-04-11 18:58:50 +0200
commit37e13ea2d0c0df564f00278ac68bf8a1e584bfd9 (patch)
treed2e796dc32d5dc9da14af0b67d82e629f507f2fb /src
parent185ce5454e4afd11b1f90d7fe487b0ec3cb840c7 (diff)
downloadpacman-37e13ea2d0c0df564f00278ac68bf8a1e584bfd9.tar.gz
pacman-37e13ea2d0c0df564f00278ac68bf8a1e584bfd9.tar.xz
Imported from pacman-2.4.tar.gz
Diffstat (limited to 'src')
-rw-r--r--src/.pacman.c.swpbin24576 -> 0 bytes
-rw-r--r--src/package.c9
-rw-r--r--src/pacman.c138
-rw-r--r--src/pacman.h2
-rw-r--r--src/pacsync.c11
-rw-r--r--src/util.c28
6 files changed, 128 insertions, 60 deletions
diff --git a/src/.pacman.c.swp b/src/.pacman.c.swp
deleted file mode 100644
index e318408d..00000000
--- a/src/.pacman.c.swp
+++ /dev/null
Binary files differ
diff --git a/src/package.c b/src/package.c
index 1fd12c7a..6f41fc58 100644
--- a/src/package.c
+++ b/src/package.c
@@ -124,16 +124,13 @@ int parse_descfile(char *descfile, pkginfo_t *info, PMList **backup, int output)
while(!feof(fp)) {
fgets(line, PATH_MAX, fp);
- if(output) {
- printf("%s", line);
- }
linenum++;
trim(line);
- if(line[0] == '#') {
+ if(strlen(line) == 0 || line[0] == '#') {
continue;
}
- if(strlen(line) == 0) {
- continue;
+ if(output) {
+ printf("%s\n", line);
}
ptr = line;
key = strsep(&ptr, "=");
diff --git a/src/pacman.c b/src/pacman.c
index 779fc581..aa1b7578 100644
--- a/src/pacman.c
+++ b/src/pacman.c
@@ -53,7 +53,7 @@ char* MDFile(char *);
*
*/
-/* pacman options */
+/* command line options */
char *pmo_root = NULL;
unsigned short pmo_op = PM_MAIN;
unsigned short pmo_verbose = 0;
@@ -70,13 +70,16 @@ unsigned short pmo_q_isfile = 0;
unsigned short pmo_q_info = 0;
unsigned short pmo_q_list = 0;
unsigned short pmo_q_owns = 0;
+unsigned short pmo_r_cascade = 0;
unsigned short pmo_s_upgrade = 0;
unsigned short pmo_s_downloadonly = 0;
unsigned short pmo_s_sync = 0;
unsigned short pmo_s_search = 0;
unsigned short pmo_s_clean = 0;
-PMList *pmo_noupgrade = NULL;
-PMList *pmo_ignorepkg = NULL;
+/* configuration file options */
+PMList *pmo_noupgrade = NULL;
+PMList *pmo_ignorepkg = NULL;
+unsigned short pmo_nopassiveftp = 0;
/* list of sync_t structs for sync locations */
@@ -776,7 +779,9 @@ int pacman_add(pacdb_t *db, PMList *targets)
}
printf("done.\n");
- if(!pmo_nodeps) {
+ /* No need to check deps if pacman_add was called during a sync:
+ * it is already done in pacman_sync. */
+ if(!pmo_nodeps && pmo_op != PM_SYNC) {
vprint("checking dependencies...\n");
lp = checkdeps(db, (pmo_upgrade ? PM_UPGRADE : PM_ADD), alltargs);
if(lp) {
@@ -1052,13 +1057,25 @@ int pacman_add(pacdb_t *db, PMList *targets)
} /*else*/ {
time_t t = time(NULL);
- /* if this is an upgrade then propagate the old package's requiredby list over to
- * the new package */
- if(pmo_upgrade && oldpkg) {
- list_free(info->requiredby);
- info->requiredby = NULL;
- for(lp = oldpkg->requiredby; lp; lp = lp->next) {
- info->requiredby = list_add(info->requiredby, strdup(lp->data));
+ /* Update the requiredby field by scaning the whole database
+ * looking for packages depending on the package to add */
+ for(lp = pm_packages; lp; lp = lp->next) {
+ pkginfo_t *tmpp = NULL;
+ PMList *tmppm = NULL;
+
+ tmpp = db_scan(db, ((pkginfo_t*)lp->data)->name, INFRQ_DEPENDS);
+ if (tmpp == NULL) {
+ continue;
+ }
+ for(tmppm = tmpp->depends; tmppm; tmppm = tmppm->next) {
+ depend_t depend;
+ if(splitdep(tmppm->data, &depend)) {
+ continue;
+ }
+ if(tmppm->data && !strcmp(depend.name, info->name)) {
+ info->requiredby = list_add(info->requiredby, strdup(tmpp->name));
+ continue;
+ }
}
}
@@ -1156,13 +1173,50 @@ int pacman_remove(pacdb_t *db, PMList *targets)
vprint("Checking dependencies...\n");
lp = checkdeps(db, PM_REMOVE, alltargs);
if(lp) {
- fprintf(stderr, "error: this will break the following dependencies:\n");
- for(j = lp; j; j = j->next) {
- depmissing_t* miss = (depmissing_t*)j->data;
- printf(" %s: is required by %s\n", miss->target, miss->depend.name);
+ if(pmo_r_cascade) {
+ int cols;
+ while(lp) {
+ for(j = lp; j; j = j->next) {
+ depmissing_t* miss = (depmissing_t*)j->data;
+ miss = (depmissing_t*)j->data;
+ info = db_scan(db, miss->depend.name, INFRQ_ALL);
+ list_add(alltargs, info);
+ }
+ list_free(lp);
+ lp = checkdeps(db, PM_REMOVE, alltargs);
+ }
+ /* list targets */
+ fprintf(stderr, "\nTargets: ");
+ cols = 9;
+ for(j = alltargs; j; j = j->next) {
+ char t[PATH_MAX];
+ int len;
+ snprintf(t, PATH_MAX, "%s ", (char*)j->data);
+ len = strlen(t);
+ if(len+cols > 78) {
+ cols = 9;
+ fprintf(stderr, "\n%9s", " ");
+ }
+ fprintf(stderr, "%s", t);
+ cols += len;
+ }
+ printf("\n");
+ /* get confirmation */
+ if(yesno("\nDo you want to remove these packages? [Y/n] ") == 0) {
+ list_free(alltargs);
+ list_free(lp);
+ return(1);
+ }
+ } else {
+ fprintf(stderr, "error: this will break the following dependencies:\n");
+ for(j = lp; j; j = j->next) {
+ depmissing_t* miss = (depmissing_t*)j->data;
+ printf(" %s: is required by %s\n", miss->target, miss->depend.name);
+ }
+ list_free(alltargs);
+ list_free(lp);
+ return(1);
}
- list_free(lp);
- return(1);
}
list_free(lp);
}
@@ -1286,6 +1340,8 @@ int pacman_remove(pacdb_t *db, PMList *targets)
}
}
+ list_free(alltargs);
+
/* run ldconfig if it exists */
snprintf(line, PATH_MAX, "%setc/ld.so.conf", pmo_root);
if(!stat(line, &buf)) {
@@ -1321,7 +1377,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
/* output info for a .tar.gz package */
if(pmo_q_isfile) {
if(package == NULL) {
- fprintf(stderr, "error: no package file was specified (-p)\n");
+ fprintf(stderr, "error: no package file was specified for --file\n");
return(1);
}
info = load_pkg(package, pmo_q_info);
@@ -1329,16 +1385,16 @@ int pacman_query(pacdb_t *db, PMList *targets)
fprintf(stderr, "error: %s is not a package\n", package);
return(1);
}
- if(pmo_q_list) {
+ if(pmo_q_info) {
+ printf("\n");
+ } else if(pmo_q_list) {
for(lp = info->files; lp; lp = lp->next) {
if(strcmp(lp->data, ".PKGINFO")) {
- printf("%s\n", (char*)lp->data);
+ printf("%s %s\n", info->name, (char*)lp->data);
}
}
- } else {
- if(!pmo_q_info) {
- printf("%s %s\n", info->name, info->version);
- }
+ } else if(!pmo_q_info) {
+ printf("%s %s\n", info->name, info->version);
}
continue;
}
@@ -1357,7 +1413,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
for(lp = info->files; lp; lp = lp->next) {
sprintf(path, "%s%s", pmo_root, (char*)lp->data);
if(!strcmp(path, rpath)) {
- printf("%s %s\n", info->name, info->version);
+ printf("%s is owned by %s %s\n", package, info->name, info->version);
gotcha = 1;
}
}
@@ -1365,7 +1421,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
if(!gotcha) {
fprintf(stderr, "No package owns %s\n", package);
}
- return(2);
+ continue;
} else {
fprintf(stderr, "error: %s is not a file.\n", package);
return(1);
@@ -1384,7 +1440,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
return(1);
}
for(q = info->files; q; q = q->next) {
- printf("%s%s\n", pmo_root, (char*)q->data);
+ printf("%s %s%s\n", info->name, pmo_root, (char*)q->data);
}
} else {
printf("%s %s\n", tmpp->name, tmpp->version);
@@ -1392,16 +1448,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
}
} else {
/* find a target */
- if(pmo_q_list) {
- info = db_scan(db, package, INFRQ_DESC | INFRQ_FILES);
- if(info == NULL) {
- fprintf(stderr, "Package \"%s\" was not found.\n", package);
- return(2);
- }
- for(lp = info->files; lp; lp = lp->next) {
- printf("%s%s\n", pmo_root, (char*)lp->data);
- }
- } else if(pmo_q_info) {
+ if(pmo_q_info) {
int cols;
info = db_scan(db, package, INFRQ_DESC | INFRQ_DEPENDS);
@@ -1467,6 +1514,15 @@ int pacman_query(pacdb_t *db, PMList *targets)
}
printf("Description : %s\n", info->desc);
printf("\n");
+ } else if(pmo_q_list) {
+ info = db_scan(db, package, INFRQ_DESC | INFRQ_FILES);
+ if(info == NULL) {
+ fprintf(stderr, "Package \"%s\" was not found.\n", package);
+ return(2);
+ }
+ for(lp = info->files; lp; lp = lp->next) {
+ printf("%s %s%s\n", info->name, pmo_root, (char*)lp->data);
+ }
} else {
info = db_scan(db, package, INFRQ_DESC);
if(info == NULL) {
@@ -1833,20 +1889,20 @@ int splitdep(char *depstr, depend_t *depend)
} else {
/* no version specified - accept any */
depend->mod = DEP_ANY;
- strcpy(depend->name, str);
- strcpy(depend->version, "");
+ strncpy(depend->name, str, sizeof(depend->name));
+ strncpy(depend->version, "", sizeof(depend->version));
}
if(ptr == NULL) {
return(0);
}
*ptr = '\0';
- strcpy(depend->name, str);
+ strncpy(depend->name, str, sizeof(depend->name));
ptr++;
if(depend->mod != DEP_EQ) {
ptr++;
}
- strcpy(depend->version, ptr);
+ strncpy(depend->version, ptr, sizeof(depend->version));
FREE(str);
return(0);
}
diff --git a/src/pacman.h b/src/pacman.h
index e248a8bf..f6581bfe 100644
--- a/src/pacman.h
+++ b/src/pacman.h
@@ -22,7 +22,7 @@
#define _PAC_PACMAN_H
#ifndef PACVER
-#define PACVER "2.3.2"
+#define PACVER "2.4"
#endif
#ifndef PKGDIR
diff --git a/src/pacsync.c b/src/pacsync.c
index 72b0a0d4..fce3a29b 100644
--- a/src/pacsync.c
+++ b/src/pacsync.c
@@ -42,6 +42,7 @@ static int offset;
/* pacman options */
extern char *pmo_root;
+extern unsigned char pmo_nopassiveftp;
/* sync servers */
extern PMList *pmc_syncs;
@@ -150,10 +151,12 @@ int downloadfiles(PMList *servers, char *localpath, PMList *files)
sync_fnm[24] = '\0';
if(!server->islocal) {
- /* passive mode */
- /* TODO: make passive ftp an option */
- if(!FtpOptions(FTPLIB_CONNMODE, FTPLIB_PASSIVE, control)) {
- fprintf(stderr, "warning: failed to set passive mode\n");
+ if(!pmo_nopassiveftp) {
+ if(!FtpOptions(FTPLIB_CONNMODE, FTPLIB_PASSIVE, control)) {
+ fprintf(stderr, "warning: failed to set passive mode\n");
+ }
+ } else {
+ vprint("FTP passive mode not set\n");
}
if(!FtpSize(fn, &fsz, FTPLIB_IMAGE, control)) {
fprintf(stderr, "warning: failed to get filesize for %s\n", fn);
diff --git a/src/util.c b/src/util.c
index 96a91371..2b0aa0d9 100644
--- a/src/util.c
+++ b/src/util.c
@@ -37,6 +37,7 @@
#include "pacsync.h"
#include "pacman.h"
+/* command line options */
extern char* pmo_root;
extern unsigned short pmo_op;
extern unsigned short pmo_version;
@@ -53,13 +54,16 @@ extern unsigned short pmo_q_isfile;
extern unsigned short pmo_q_info;
extern unsigned short pmo_q_list;
extern unsigned short pmo_q_owns;
+extern unsigned short pmo_r_cascade;
extern unsigned short pmo_s_sync;
extern unsigned short pmo_s_search;
extern unsigned short pmo_s_clean;
extern unsigned short pmo_s_upgrade;
extern unsigned short pmo_s_downloadonly;
+/* configuration file options */
extern PMList *pmo_noupgrade;
extern PMList *pmo_ignorepkg;
+extern unsigned short pmo_nopassiveftp;
extern PMList *pmc_syncs;
extern PMList *pm_targets;
@@ -164,6 +168,7 @@ int parseargs(int op, int argc, char **argv)
{"sysupgrade", no_argument, 0, 'u'},
{"downloadonly", no_argument, 0, 'w'},
{"refresh", no_argument, 0, 'y'},
+ {"cascade", no_argument, 0, 'c'},
{0, 0, 0, 0}
};
@@ -196,7 +201,7 @@ int parseargs(int op, int argc, char **argv)
case 'w': pmo_s_downloadonly = 1; break;
case 'y': pmo_s_sync = 1; break;
case 's': pmo_s_search = 1; break;
- case 'c': pmo_s_clean = 1; break;
+ case 'c': pmo_s_clean = 1; pmo_r_cascade = 1; break;
case 'r': if(realpath(optarg, pmo_root) == NULL) {
perror("bad root path");
return(1);
@@ -249,10 +254,7 @@ int parseconfig(char *configfile)
while(fgets(line, PATH_MAX, fp)) {
linenum++;
trim(line);
- if(strlen(line) == 0) {
- continue;
- }
- if(line[0] == '#') {
+ if(strlen(line) == 0 || line[0] == '#') {
continue;
}
if(line[0] == '[' && line[strlen(line)-1] == ']') {
@@ -286,12 +288,21 @@ int parseconfig(char *configfile)
}
ptr = line;
key = strsep(&ptr, "=");
- if(key == NULL || ptr == NULL) {
+ if(key == NULL) {
fprintf(stderr, "config: line %d: syntax error\n", linenum);
return(1);
+ }
+ trim(key);
+ key = strtoupper(key);
+ if(ptr == NULL) {
+ if(!strcmp(key, "NOPASSIVEFTP")) {
+ pmo_nopassiveftp = 1;
+ vprint("config: nopassiveftp\n");
+ } else {
+ fprintf(stderr, "config: line %d: syntax error\n", linenum);
+ return(1);
+ }
} else {
- trim(key);
- key = strtoupper(key);
trim(ptr);
if(!strcmp(section, "options")) {
if(!strcmp(key, "NOUPGRADE")) {
@@ -517,6 +528,7 @@ void usage(int op, char *myname)
printf("options:\n");
printf(" -d, --nodeps skip dependency checks\n");
printf(" -n, --nosave remove configuration files as well\n");
+ printf(" -c, --cascade remove packages and all packages that depend on them\n");
} else if(op == PM_UPGRADE) {
if(pmo_freshen) {
printf("usage: %s {-F --freshen} [options] <file>\n", myname);