diff -Naur slackyd-0.1.13beta/slackyd.conf slackyd-0.1.14beta/slackyd.conf --- slackyd-0.1.13beta/slackyd.conf 2009-07-18 05:12:51.000000000 +0200 +++ slackyd-0.1.14beta/slackyd.conf 2009-07-22 03:10:52.000000000 +0200 @@ -75,3 +75,8 @@ # Use -x option to disable blacklist on run-time, and -X option to see # all packages blacklisted. # + + +# Upgrade slackware packages with unofficial packages. +# +upgrade_replacing_official = yes diff -Naur slackyd-0.1.13beta/src/func.c slackyd-0.1.14beta/src/func.c --- slackyd-0.1.13beta/src/func.c 2009-07-18 04:22:54.000000000 +0200 +++ slackyd-0.1.14beta/src/func.c 2009-07-22 02:55:28.000000000 +0200 @@ -870,7 +870,7 @@ extern options_t opt; const char comment[] = "!#\n"; - char buffer[HUGE0], *ptr; + char buffer[HUGE0], *ptr, *tmp; const char *cfg = opt.config; FILE *fd = fopen (cfg, "r"); int l, line = 0; @@ -922,6 +922,20 @@ opt.cache = xstrdup (parse_config_value (ptr, line)); } else + if (!strncasecmp (ptr, "upgrade_replacing_official", 26)) + { + tmp = parse_config_value (ptr, line); + if (!strcasecmp (tmp, "no")) + { + opt.upgrade_replacing_official = false; + } + else + if (strcasecmp (tmp, "yes")) + { + cfg_syntax_error (ptr, line); + } + } + else { cfg_syntax_error (ptr, line); } @@ -960,6 +974,7 @@ opt.blacklist = true; opt.hash = true; opt.config = xstrdup (CONFIGFILE); + opt.upgrade_replacing_official = true; /* Set default cache if nothing specified in config file */ if (opt.cache == NULL) { diff -Naur slackyd-0.1.13beta/src/global.h slackyd-0.1.14beta/src/global.h --- slackyd-0.1.13beta/src/global.h 2009-07-16 04:49:12.000000000 +0200 +++ slackyd-0.1.14beta/src/global.h 2009-07-22 02:43:52.000000000 +0200 @@ -78,6 +78,7 @@ u_short TIMEOUT; regex_t *blacklisted; unsigned nblacklisted; + bool upgrade_replacing_official; } options_t; diff -Naur slackyd-0.1.13beta/src/packages.c slackyd-0.1.14beta/src/packages.c --- slackyd-0.1.13beta/src/packages.c 2009-07-18 04:59:06.000000000 +0200 +++ slackyd-0.1.14beta/src/packages.c 2009-07-22 02:33:38.000000000 +0200 @@ -867,8 +867,10 @@ if (opt.force) { - /*if (opt.verbose) - fprintf (stdout, "Will be used %s %s\n", list[i]->name, pkg_type (list[i]));*/ + if ((i + 1) < n && !strcmp (name, list[i + 1]->pstruct.name)) + { + printfv ("Will be used %s\n", list[i]->name); + } return list[i]; } @@ -1128,64 +1130,93 @@ } -/* Search non-slackware packages. - * for each package installed, search it in slackware packages data. - */ -void -unofficial_packages (const char *name) +dlist * +pkglist_official (void) { - unsigned r, i, ch = 0; - branches j = 0; - dlist *curr, *pkgdata = NULL, *packages = NULL, *unofficial = NULL; - char path[BUFFSIZE0], tgz[WORDSIZE0]; - char *p, *m; - regex_t preg; - int cflags = REG_EXTENDED | REG_NOSUB; - - /* check official mirror in config file */ - for (r = 0; r < N_REPOS && ! REPOS[r].SLACKWARE; r++) - ; - if (r >= N_REPOS) { - fprintf (stderr, "\n" - "No official repository in your slackyd.conf.\n" - "Please fix it.\n"); - return ; + dlist *pkglist = NULL, *pkgdata = NULL, *curr = NULL; + unsigned origin = 0x00; + branches branch; + char path[BUFFSIZE0], *p1, *p2; + + /* Search official mirror in config file */ + while (origin < N_REPOS) + { + if (REPOS[origin].SLACKWARE) + { + break; + } + origin++; } - while (j < BRANCHES) - { /* for each branch ... */ - - /* official packages list path */ - snprintf (path, BUFFSIZE, "%s", make_rpath (r, j, PACKAGES)); - if (!file_exist (path, NULL, true)) + if (origin >= N_REPOS) { - fprintf (stderr, "Broken slackware packages list. Have you update ?\n"); - return ; + return NULL; } - /* load all packages for current branch */ - if (search_pkg (&pkgdata, MATCH_ALL_NAME, path, NULL) > 0) + /* Read data from all mirror branch, packages, patches and extra. */ + for (branch = 0; branch < BRANCHES; branch++) { - curr = pkgdata; - while (curr) + snprintf (path, BUFFSIZE, "%s", make_rpath (origin, branch, PACKAGES)); + + if (!file_exist (path, NULL, true)) + { + /* Missing a packages list */ + dlist_free (&pkglist); + dlist_free (&pkgdata); + return NULL; + } + + /* Load all packages for current branch */ + if (search_pkg (&pkgdata, MATCH_ALL_NAME, path, NULL) > 0) { - m = curr->s + strlen (PKG_NAME); /* point after 'PACKAGE NAME:' */ - * (p = strchr (m, '\n')) = 0x00; /* close string, we ignore next data */ - movestrlim (&m, " \t\n:", 2); - if ((p = strcasestr (m, ".tgz\0")) || (p = strcasestr (m, ".txz\0"))) + curr = pkgdata; + + while (curr) { - *p = 0x00; + p1 = curr->s + strlen (PKG_NAME); /* point after 'PACKAGE NAME:' */ + + if ((p2 = strchr (p1, '\n'))) + { + *p2 = 0x00; /* close string, we ignore next data */ + } + + movestrlim (&p1, " \t\n:", 2); + + /* Add package name to list with NO extension */ + if ((p2 = strcasestr (p1, ".txz\0")) || (p2 = strcasestr (p1, ".tgz\0"))) + { + *p2 = 0x00; + } + dlist_add (&pkglist, xstrdup (p1)); + + curr = curr->next; } - dlist_add (&packages, xstrdup (m)); - curr = curr->next; + dlist_free (&pkgdata); } - dlist_free (&pkgdata); } + + return pkglist; +} - j++; +/* Search non-slackware packages. + * for each package installed, search it in slackware packages data. + */ +void +unofficial_packages (const char *name) +{ + unsigned i = 0, ch = 0; + dlist *official = NULL, *unofficial = NULL; + regex_t preg; + int cflags = REG_EXTENDED | REG_NOSUB; + official = pkglist_official (); + if (official == NULL) + { + fprintf (stderr, + "\nMissing or incomplete slackware packages list." + "\nTry to update or fix your slackyd.conf.\n"); + return ; } - if (name && opt.use_regex) { if (opt.case_insensitive) @@ -1193,7 +1224,7 @@ xregcomp (&preg, name, cflags); } - for (unofficial = NULL, i = 0; i < nginst; i++) + for (i = 0; i < nginst; i++) { /* if name is non null we wont test just installed packages @@ -1205,14 +1236,12 @@ continue; } - snprintf (tgz, WORDSIZE, "%s", ginst[i].name); - printfv ("Checking %s: ", ginst[i].name); /* search current installed package in all official packages loaded before */ - if (dlist_check (packages, tgz) == 0) + if (dlist_check (official, ginst[i].name) == 0) { - dlist_add (&unofficial, xstrdup (tgz)); + dlist_add (&unofficial, xstrdup (ginst[i].name)); printfv ("unofficial.\n"); } else @@ -1223,7 +1252,7 @@ ch++; } - dlist_free (&packages); + dlist_free (&official); if (name && opt.use_regex) regfree (&preg); @@ -1738,11 +1767,17 @@ pkg_occ (pkg_t *packages[], unsigned npackages, const char *name, unsigned *pindex) { int rval = 0; - unsigned n; + unsigned n, l; + char *pkgname; + l = strlen (name); + for (n = 0; n < npackages; n++) { - if (!strcmp (packages[n]->name, name)) + pkgname = packages[n]->name; + + if (!strncmp (name, pkgname, l) && + (!strcmp (pkgname + l, ".txz\0") || !strcmp (pkgname + l, ".tgz\0"))) { *pindex = n; rval++; @@ -1765,7 +1800,6 @@ int rval, cflags = REG_EXTENDED | REG_NOSUB, sflag; regex_t preg; pkg_t **packages = NULL, **tocheck = NULL; - char tgz[WORDSIZE0]; choose_dep_t ddata; pkg_t **dep = NULL; @@ -1835,9 +1869,7 @@ continue; } - snprintf (tgz, WORDSIZE, "%s.tgz", ginst[i].name); - - rval = pkg_occ (packages, npackages, tgz, &pindex); + rval = pkg_occ (packages, npackages, ginst[i].name, &pindex); switch (rval) { case FEATURE_UNAVAILABLE: diff -Naur slackyd-0.1.13beta/src/search.c slackyd-0.1.14beta/src/search.c --- slackyd-0.1.13beta/src/search.c 2009-07-18 02:49:42.000000000 +0200 +++ slackyd-0.1.14beta/src/search.c 2009-07-22 00:52:11.000000000 +0200 @@ -735,7 +735,7 @@ { ptr[l] = 0x00; } - + return (is_installed (ptr, MATCH_EXACTLY_PACKAGE, 0) >= 0) ? true : false; break; diff -Naur slackyd-0.1.13beta/src/slackyd.h slackyd-0.1.14beta/src/slackyd.h --- slackyd-0.1.13beta/src/slackyd.h 2009-07-18 05:10:47.000000000 +0200 +++ slackyd-0.1.14beta/src/slackyd.h 2009-07-22 03:12:58.000000000 +0200 @@ -20,7 +20,7 @@ * MA 02110-1301, USA. */ #define _GNU_SOURCE -#define SLACKYD_VERSION "0.1.13" +#define SLACKYD_VERSION "0.1.13.2" #define DATADIR "/var/slackyd" #define CONFIGFILE "/etc/slackyd/slackyd.conf" @@ -490,6 +490,8 @@ (int flag); void installed_packages (const char *name); +dlist *pkglist_official + (void); void unofficial_packages (const char *name); void obsolete_packages diff -Naur slackyd-0.1.13beta/src/update.c slackyd-0.1.14beta/src/update.c --- slackyd-0.1.13beta/src/update.c 2009-07-12 01:38:43.000000000 +0200 +++ slackyd-0.1.14beta/src/update.c 2009-07-22 05:02:08.000000000 +0200 @@ -493,23 +493,36 @@ regex_t preg; pkg_t **packages = NULL; unsigned npackages = 0x00; + dlist *official = NULL; fprintf (stdout, "Reading packages data: "); fflush (stdout); + /* If we won't upgrade official packages replacing it with extra packages + * load here the slackware list. + * Otherwise set it to NULL. + */ + if (!opt.upgrade_replacing_official) + { + official = pkglist_official (); + } + sflags = (pkgname && opt.use_regex) ? MATCH_USING_REGEX : MATCH_EXACTLY_NAME_INST; packages = pkgl2pkgt (search (sflags, pkgname), &npackages); if (!npackages) { - if (!pkgname) - fprintf (stdout, "\n\n" - "No packages found !?\n" - "Try to update packages list.\n"); - else - fprintf (stdout, "nothing to do for `%s'.\n", pkgname); - return EXIT_FAILURE; + if (!pkgname) + { + printf ("\n\nNo packages found !?\nTry to update packages list.\n"); + } + else + { + printf ("nothing to do for `%s'.\n", pkgname); + } + dlist_free (&official); + return -1; } fprintf (stdout, "done.\n"); @@ -527,9 +540,9 @@ if ((pkgname && opt.use_regex && regexec (&preg, ginst[i].name, 0, NULL, 0)) || (pkgname && !opt.use_regex && !xstrstr (ginst[i].name, pkgname))) - { - continue; - } + { + continue; + } printfv ("Verifying %s: ", ginst[i].name); @@ -538,11 +551,16 @@ for (j = 0; j < npackages; j++) { - /* if current available package haven't same name of current - * package installed, of if already installed, go to begin for() + /* If one of this case return to begin for() doing nothing: + * + * - current available package name not matched on current package installed + * - current available packages already installed + * - current available packages ins't official, current installed is unofficial + * and opt.upgrade_replacing_official is false. */ if (strcmp (packages[j]->pstruct.name, ginst[i].pstruct.name) - || pkg_u_installed (packages[j]->name)) + || pkg_u_installed (packages[j]->name) + || (!opt.upgrade_replacing_official && !REPOS[packages[j]->N_REPO].SLACKWARE && dlist_check (official, ginst[i].name))) { continue; } @@ -581,6 +599,8 @@ } /* end installed packages list for() */ + dlist_free (&official); + if (opt.use_regex && pkgname) regfree (&preg); pkg_t_free_all (&packages, npackages);