diff options
author | Judd Vinet <judd@archlinux.org> | 2003-04-11 18:58:50 +0200 |
---|---|---|
committer | Judd Vinet <judd@archlinux.org> | 2003-04-11 18:58:50 +0200 |
commit | 37e13ea2d0c0df564f00278ac68bf8a1e584bfd9 (patch) | |
tree | d2e796dc32d5dc9da14af0b67d82e629f507f2fb /src | |
parent | 185ce5454e4afd11b1f90d7fe487b0ec3cb840c7 (diff) | |
download | pacman-37e13ea2d0c0df564f00278ac68bf8a1e584bfd9.tar.gz pacman-37e13ea2d0c0df564f00278ac68bf8a1e584bfd9.tar.xz |
Imported from pacman-2.4.tar.gz
Diffstat (limited to 'src')
-rw-r--r-- | src/.pacman.c.swp | bin | 24576 -> 0 bytes | |||
-rw-r--r-- | src/package.c | 9 | ||||
-rw-r--r-- | src/pacman.c | 138 | ||||
-rw-r--r-- | src/pacman.h | 2 | ||||
-rw-r--r-- | src/pacsync.c | 11 | ||||
-rw-r--r-- | src/util.c | 28 |
6 files changed, 128 insertions, 60 deletions
diff --git a/src/.pacman.c.swp b/src/.pacman.c.swp Binary files differdeleted file mode 100644 index e318408d..00000000 --- a/src/.pacman.c.swp +++ /dev/null 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); @@ -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); |