pkg: use a blob buffer in pkg_t to store variable fields
[oweals/opkg-lede.git] / libopkg / opkg_install.c
1 /* opkg_install.c - the opkg package management system
2
3    Carl D. Worth
4
5    Copyright (C) 2001 University of Southern California
6
7    This program is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License as
9    published by the Free Software Foundation; either version 2, or (at
10    your option) any later version.
11
12    This program is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16 */
17
18 #include "config.h"
19
20 #include <stdio.h>
21 #include <time.h>
22 #include <signal.h>
23 #include <unistd.h>
24 #include <sys/stat.h>
25
26 #include "pkg.h"
27 #include "pkg_hash.h"
28 #include "pkg_extract.h"
29
30 #include "opkg_install.h"
31 #include "opkg_configure.h"
32 #include "opkg_download.h"
33 #include "opkg_remove.h"
34
35 #include "opkg_utils.h"
36 #include "opkg_message.h"
37 #include "opkg_cmd.h"
38 #include "opkg_defines.h"
39
40 #include "sprintf_alloc.h"
41 #include "file_util.h"
42 #include "xsystem.h"
43 #include "libbb/libbb.h"
44
45 static int satisfy_dependencies_for(pkg_t * pkg)
46 {
47         int i, err;
48         pkg_vec_t *depends = pkg_vec_alloc();
49         pkg_t *dep;
50         char **tmp, **unresolved = NULL;
51         int ndepends;
52
53         ndepends = pkg_hash_fetch_unsatisfied_dependencies(pkg, depends,
54                                                            &unresolved);
55
56         if (unresolved) {
57                 opkg_msg(ERROR,
58                          "Cannot satisfy the following dependencies for %s:\n",
59                          pkg->name);
60                 tmp = unresolved;
61                 while (*unresolved) {
62                         opkg_message(ERROR, "\t%s", *unresolved);
63                         free(*unresolved);
64                         unresolved++;
65                 }
66                 free(tmp);
67                 opkg_message(ERROR, "\n");
68                 if (!conf->force_depends) {
69                         opkg_msg(INFO,
70                                  "This could mean that your package list is out of date or that the packages\n"
71                                  "mentioned above do not yet exist (try 'opkg update'). To proceed in spite\n"
72                                  "of this problem try again with the '-force-depends' option.\n");
73                         pkg_vec_free(depends);
74                         return -1;
75                 }
76         }
77
78         if (ndepends <= 0) {
79                 pkg_vec_free(depends);
80                 return 0;
81         }
82
83         /* Mark packages as to-be-installed */
84         for (i = 0; i < depends->len; i++) {
85                 /* Dependencies should be installed the same place as pkg */
86                 if (depends->pkgs[i]->dest == NULL) {
87                         depends->pkgs[i]->dest = pkg->dest;
88                 }
89                 depends->pkgs[i]->state_want = SW_INSTALL;
90         }
91
92         for (i = 0; i < depends->len; i++) {
93                 dep = depends->pkgs[i];
94                 /* The package was uninstalled when we started, but another
95                    dep earlier in this loop may have depended on it and pulled
96                    it in, so check first. */
97                 if ((dep->state_status != SS_INSTALLED)
98                     && (dep->state_status != SS_UNPACKED)) {
99                         opkg_msg(DEBUG2, "Calling opkg_install_pkg.\n");
100                         err = opkg_install_pkg(dep, 0);
101                         /* mark this package as having been automatically installed to
102                          * satisfy a dependancy */
103                         dep->auto_installed = 1;
104                         if (err) {
105                                 pkg_vec_free(depends);
106                                 return err;
107                         }
108                 }
109         }
110
111         pkg_vec_free(depends);
112
113         return 0;
114 }
115
116 static int check_conflicts_for(pkg_t * pkg)
117 {
118         int i;
119         pkg_vec_t *conflicts = NULL;
120         message_level_t level;
121
122         if (conf->force_depends) {
123                 level = NOTICE;
124         } else {
125                 level = ERROR;
126         }
127
128         if (!conf->force_depends)
129                 conflicts = pkg_hash_fetch_conflicts(pkg);
130
131         if (conflicts) {
132                 opkg_msg(level, "The following packages conflict with %s:\n",
133                          pkg->name);
134                 i = 0;
135                 while (i < conflicts->len)
136                         opkg_msg(level, "\t%s", conflicts->pkgs[i++]->name);
137                 opkg_message(level, "\n");
138                 pkg_vec_free(conflicts);
139                 return -1;
140         }
141         return 0;
142 }
143
144 static int update_file_ownership(pkg_t * new_pkg, pkg_t * old_pkg)
145 {
146         str_list_t *new_list, *old_list;
147         str_list_elt_t *iter, *niter;
148
149         new_list = pkg_get_installed_files(new_pkg);
150         if (new_list == NULL)
151                 return -1;
152
153         for (iter = str_list_first(new_list), niter =
154              str_list_next(new_list, iter); iter;
155              iter = niter, niter = str_list_next(new_list, niter)) {
156                 char *new_file = (char *)iter->data;
157                 pkg_t *owner = file_hash_get_file_owner(new_file);
158                 pkg_t *obs = hash_table_get(&conf->obs_file_hash, new_file);
159
160                 opkg_msg(DEBUG2,
161                          "%s: new_pkg=%s wants file %s, from owner=%s\n",
162                          __func__, new_pkg->name, new_file,
163                          owner ? owner->name : "<NULL>");
164
165                 if (!owner || (owner == old_pkg) || obs)
166                         file_hash_set_file_owner(new_file, new_pkg);
167         }
168
169         if (old_pkg) {
170                 old_list = pkg_get_installed_files(old_pkg);
171                 if (old_list == NULL) {
172                         pkg_free_installed_files(new_pkg);
173                         return -1;
174                 }
175
176                 for (iter = str_list_first(old_list), niter =
177                      str_list_next(old_list, iter); iter;
178                      iter = niter, niter = str_list_next(old_list, niter)) {
179                         char *old_file = (char *)iter->data;
180                         pkg_t *owner = file_hash_get_file_owner(old_file);
181                         if (!owner || (owner == old_pkg)) {
182                                 /* obsolete */
183                                 hash_table_insert(&conf->obs_file_hash,
184                                                   old_file, old_pkg);
185                         }
186                 }
187                 pkg_free_installed_files(old_pkg);
188         }
189         pkg_free_installed_files(new_pkg);
190         return 0;
191 }
192
193 static int verify_pkg_installable(pkg_t * pkg)
194 {
195         unsigned long kbs_available, pkg_size_kbs;
196         char *root_dir = NULL;
197         struct stat s;
198
199         if (conf->force_space || pkg->installed_size == 0)
200                 return 0;
201
202         if (pkg->dest) {
203                 if (!strcmp(pkg->dest->name, "root") && conf->overlay_root
204                     && !stat(conf->overlay_root, &s) && (s.st_mode & S_IFDIR))
205                         root_dir = conf->overlay_root;
206                 else
207                         root_dir = pkg->dest->root_dir;
208         }
209
210         if (!root_dir)
211                 root_dir = conf->default_dest->root_dir;
212
213         kbs_available = get_available_kbytes(root_dir);
214
215         pkg_size_kbs = (pkg->installed_size + 1023) / 1024;
216
217         if (pkg_size_kbs >= kbs_available) {
218                 opkg_msg(ERROR, "Only have %ldkb available on filesystem %s, "
219                          "pkg %s needs %ld\n",
220                          kbs_available, root_dir, pkg->name, pkg_size_kbs);
221                 return -1;
222         }
223
224         return 0;
225 }
226
227 static int unpack_pkg_control_files(pkg_t * pkg)
228 {
229         int err;
230         char *conffiles_file_name;
231         char *root_dir;
232         FILE *conffiles_file;
233
234         sprintf_alloc(&pkg->tmp_unpack_dir, "%s/%s-XXXXXX", conf->tmp_dir,
235                       pkg->name);
236
237         pkg->tmp_unpack_dir = mkdtemp(pkg->tmp_unpack_dir);
238         if (pkg->tmp_unpack_dir == NULL) {
239                 opkg_perror(ERROR, "Failed to create temporary directory '%s'",
240                             pkg->tmp_unpack_dir);
241                 return -1;
242         }
243
244         err = pkg_extract_control_files_to_dir(pkg, pkg->tmp_unpack_dir);
245         if (err) {
246                 return err;
247         }
248
249         /* XXX: CLEANUP: There might be a cleaner place to read in the
250            conffiles. Seems like I should be able to get everything to go
251            through pkg_init_from_file. If so, maybe it would make sense to
252            move all of unpack_pkg_control_files to that function. */
253
254         /* Don't need to re-read conffiles if we already have it */
255         if (!nv_pair_list_empty(&pkg->conffiles)) {
256                 return 0;
257         }
258
259         sprintf_alloc(&conffiles_file_name, "%s/conffiles",
260                       pkg->tmp_unpack_dir);
261         if (!file_exists(conffiles_file_name)) {
262                 free(conffiles_file_name);
263                 return 0;
264         }
265
266         conffiles_file = fopen(conffiles_file_name, "r");
267         if (conffiles_file == NULL) {
268                 opkg_perror(ERROR, "Failed to open %s", conffiles_file_name);
269                 free(conffiles_file_name);
270                 return -1;
271         }
272         free(conffiles_file_name);
273
274         while (1) {
275                 char *cf_name;
276                 char *cf_name_in_dest;
277                 int i;
278
279                 cf_name = file_read_line_alloc(conffiles_file);
280                 if (cf_name == NULL) {
281                         break;
282                 }
283                 if (cf_name[0] == '\0') {
284                         continue;
285                 }
286                 for (i = strlen(cf_name) - 1;
287                      (i >= 0) && (cf_name[i] == ' ' || cf_name[i] == '\t');
288                      i--) {
289                         cf_name[i] = '\0';
290                 }
291
292                 /* Prepend dest->root_dir to conffile name.
293                    Take pains to avoid multiple slashes. */
294                 root_dir = pkg->dest->root_dir;
295                 if (conf->offline_root)
296                         /* skip the offline_root prefix */
297                         root_dir =
298                             pkg->dest->root_dir + strlen(conf->offline_root);
299                 sprintf_alloc(&cf_name_in_dest, "%s%s", root_dir,
300                               cf_name[0] == '/' ? (cf_name + 1) : cf_name);
301
302                 /* Can't get an md5sum now, (file isn't extracted yet).
303                    We'll wait until resolve_conffiles */
304                 conffile_list_append(&pkg->conffiles, cf_name_in_dest, NULL);
305
306                 free(cf_name);
307                 free(cf_name_in_dest);
308         }
309
310         fclose(conffiles_file);
311
312         return 0;
313 }
314
315 /*
316  * Remove packages which were auto_installed due to a dependency by old_pkg,
317  * which are no longer a dependency in the new (upgraded) pkg.
318  */
319 static int pkg_remove_orphan_dependent(pkg_t * pkg, pkg_t * old_pkg)
320 {
321         int i, j, k, l, found, r, err = 0;
322         int n_deps;
323         pkg_t *p;
324         struct compound_depend *cd0, *cd1;
325         abstract_pkg_t **dependents;
326
327         int count0 = old_pkg->pre_depends_count +
328             old_pkg->depends_count +
329             old_pkg->recommends_count + old_pkg->suggests_count;
330         int count1 = pkg->pre_depends_count +
331             pkg->depends_count + pkg->recommends_count + pkg->suggests_count;
332
333         for (i = 0; i < count0; i++) {
334                 cd0 = &old_pkg->depends[i];
335                 if (cd0->type != DEPEND)
336                         continue;
337                 for (j = 0; j < cd0->possibility_count; j++) {
338
339                         found = 0;
340
341                         for (k = 0; k < count1; k++) {
342                                 cd1 = &pkg->depends[k];
343                                 if (cd1->type != DEPEND)
344                                         continue;
345                                 for (l = 0; l < cd1->possibility_count; l++) {
346                                         if (cd0->possibilities[j]
347                                             == cd1->possibilities[l]) {
348                                                 found = 1;
349                                                 break;
350                                         }
351                                 }
352                                 if (found)
353                                         break;
354                         }
355
356                         if (found)
357                                 continue;
358
359                         /*
360                          * old_pkg has a dependency that pkg does not.
361                          */
362                         p = pkg_hash_fetch_installed_by_name(cd0->
363                                                              possibilities[j]->
364                                                              pkg->name);
365
366                         if (!p)
367                                 continue;
368
369                         if (!p->auto_installed)
370                                 continue;
371
372                         n_deps = pkg_has_installed_dependents(p, &dependents);
373                         n_deps--;       /* don't count old_pkg */
374
375                         if (n_deps == 0) {
376                                 opkg_msg(NOTICE, "%s was autoinstalled and is "
377                                          "now orphaned, removing.\n", p->name);
378
379                                 /* p has one installed dependency (old_pkg),
380                                  * which we need to ignore during removal. */
381                                 p->state_flag |= SF_REPLACE;
382
383                                 r = opkg_remove_pkg(p, 0);
384                                 if (!err)
385                                         err = r;
386                         } else
387                                 opkg_msg(INFO, "%s was autoinstalled and is "
388                                          "still required by %d "
389                                          "installed packages.\n",
390                                          p->name, n_deps);
391
392                 }
393         }
394
395         return err;
396 }
397
398 /* returns number of installed replacees */
399 static int
400 pkg_get_installed_replacees(pkg_t * pkg, pkg_vec_t * installed_replacees)
401 {
402         abstract_pkg_t **replaces = pkg->replaces;
403         int replaces_count = pkg->replaces_count;
404         int i, j;
405         for (i = 0; i < replaces_count; i++) {
406                 abstract_pkg_t *ab_pkg = replaces[i];
407                 pkg_vec_t *pkg_vec = ab_pkg->pkgs;
408                 if (pkg_vec) {
409                         for (j = 0; j < pkg_vec->len; j++) {
410                                 pkg_t *replacee = pkg_vec->pkgs[j];
411                                 if (!pkg_conflicts(pkg, replacee))
412                                         continue;
413                                 if (replacee->state_status == SS_INSTALLED) {
414                                         pkg_vec_insert(installed_replacees,
415                                                        replacee);
416                                 }
417                         }
418                 }
419         }
420         return installed_replacees->len;
421 }
422
423 static int pkg_remove_installed_replacees(pkg_vec_t * replacees)
424 {
425         int i;
426         int replaces_count = replacees->len;
427         for (i = 0; i < replaces_count; i++) {
428                 pkg_t *replacee = replacees->pkgs[i];
429                 int err;
430                 replacee->state_flag |= SF_REPLACE;     /* flag it so remove won't complain */
431                 err = opkg_remove_pkg(replacee, 0);
432                 if (err)
433                         return err;
434         }
435         return 0;
436 }
437
438 /* to unwind the removal: make sure they are installed */
439 static int pkg_remove_installed_replacees_unwind(pkg_vec_t * replacees)
440 {
441         int i, err;
442         int replaces_count = replacees->len;
443         for (i = 0; i < replaces_count; i++) {
444                 pkg_t *replacee = replacees->pkgs[i];
445                 if (replacee->state_status != SS_INSTALLED) {
446                         opkg_msg(DEBUG2, "Calling opkg_install_pkg.\n");
447                         err = opkg_install_pkg(replacee, 0);
448                         if (err)
449                                 return err;
450                 }
451         }
452         return 0;
453 }
454
455 /* compares versions of pkg and old_pkg, returns 0 if OK to proceed with installation of pkg, 1 otherwise */
456 static int
457 opkg_install_check_downgrade(pkg_t * pkg, pkg_t * old_pkg, int message)
458 {
459         if (old_pkg) {
460                 char message_out[15];
461                 char *old_version = pkg_version_str_alloc(old_pkg);
462                 char *new_version = pkg_version_str_alloc(pkg);
463                 int cmp = pkg_compare_versions(old_pkg, pkg);
464                 int rc = 0;
465
466                 memset(message_out, '\x0', 15);
467                 strncpy(message_out, "Upgrading ", strlen("Upgrading "));
468                 if ((conf->force_downgrade == 1) && (cmp > 0)) {        /* We've been asked to allow downgrade  and version is precedent */
469                         cmp = -1;       /* then we force opkg to downgrade */
470                         strncpy(message_out, "Downgrading ", strlen("Downgrading "));   /* We need to use a value < 0 because in the 0 case we are asking to */
471                         /* reinstall, and some check could fail asking the "force-reinstall" option */
472                 }
473
474                 if (cmp > 0) {
475                         if (!conf->download_only)
476                                 opkg_msg(NOTICE,
477                                          "Not downgrading package %s on %s from %s to %s.\n",
478                                          old_pkg->name, old_pkg->dest->name,
479                                          old_version, new_version);
480                         rc = 1;
481                 } else if (cmp < 0) {
482                         if (!conf->download_only)
483                                 opkg_msg(NOTICE,
484                                          "%s%s on %s from %s to %s...\n",
485                                          message_out, pkg->name,
486                                          old_pkg->dest->name, old_version,
487                                          new_version);
488                         pkg->dest = old_pkg->dest;
489                         rc = 0;
490                 } else {        /* cmp == 0 */
491
492                         if (!conf->download_only)
493                                 opkg_msg(NOTICE,
494                                          "%s (%s) already install on %s.\n",
495                                          pkg->name, new_version,
496                                          old_pkg->dest->name);
497                         rc = 1;
498                 }
499                 free(old_version);
500                 free(new_version);
501                 return rc;
502         } else {
503                 char message_out[15];
504                 memset(message_out, '\x0', 15);
505                 if (message)
506                         strncpy(message_out, "Upgrading ",
507                                 strlen("Upgrading "));
508                 else
509                         strncpy(message_out, "Installing ",
510                                 strlen("Installing "));
511                 char *version = pkg_version_str_alloc(pkg);
512
513                 if (!conf->download_only)
514                         opkg_msg(NOTICE, "%s%s (%s) to %s...\n", message_out,
515                                  pkg->name, version, pkg->dest->name);
516                 free(version);
517         }
518         return 0;
519 }
520
521 static int prerm_upgrade_old_pkg(pkg_t * pkg, pkg_t * old_pkg)
522 {
523         /* DPKG_INCOMPATIBILITY:
524            dpkg does some things here that we don't do yet. Do we care?
525
526            1. If a version of the package is already installed, call
527            old-prerm upgrade new-version
528            2. If the script runs but exits with a non-zero exit status
529            new-prerm failed-upgrade old-version
530            Error unwind, for both the above cases:
531            old-postinst abort-upgrade new-version
532          */
533         int err;
534         char *script_args;
535         char *new_version;
536
537         if (!old_pkg || !pkg)
538                 return 0;
539
540         new_version = pkg_version_str_alloc(pkg);
541
542         sprintf_alloc(&script_args, "upgrade %s", new_version);
543         free(new_version);
544         err = pkg_run_script(old_pkg, "prerm", script_args);
545         free(script_args);
546         if (err != 0) {
547                 opkg_msg(ERROR, "prerm script for package \"%s\" failed\n",
548                          old_pkg->name);
549                 return -1;
550         }
551         return 0;
552 }
553
554 static int prerm_upgrade_old_pkg_unwind(pkg_t * pkg, pkg_t * old_pkg)
555 {
556         /* DPKG_INCOMPATIBILITY:
557            dpkg does some things here that we don't do yet. Do we care?
558            (See prerm_upgrade_old_package for details)
559          */
560         return 0;
561 }
562
563 static int prerm_deconfigure_conflictors(pkg_t * pkg, pkg_vec_t * conflictors)
564 {
565         /* DPKG_INCOMPATIBILITY:
566            dpkg does some things here that we don't do yet. Do we care?
567            2. If a 'conflicting' package is being removed at the same time:
568            1. If any packages depended on that conflicting package and
569            --auto-deconfigure is specified, call, for each such package:
570            deconfigured's-prerm deconfigure \
571            in-favour package-being-installed version \
572            removing conflicting-package version
573            Error unwind:
574            deconfigured's-postinst abort-deconfigure \
575            in-favour package-being-installed-but-failed version \
576            removing conflicting-package version
577
578            The deconfigured packages are marked as requiring
579            configuration, so that if --install is used they will be
580            configured again if possible.
581            2. To prepare for removal of the conflicting package, call:
582            conflictor's-prerm remove in-favour package new-version
583            Error unwind:
584            conflictor's-postinst abort-remove in-favour package new-version
585          */
586         return 0;
587 }
588
589 static int
590 prerm_deconfigure_conflictors_unwind(pkg_t * pkg, pkg_vec_t * conflictors)
591 {
592         /* DPKG_INCOMPATIBILITY: dpkg does some things here that we don't
593            do yet. Do we care?  (See prerm_deconfigure_conflictors for
594            details) */
595         return 0;
596 }
597
598 static int preinst_configure(pkg_t * pkg, pkg_t * old_pkg)
599 {
600         int err;
601         char *preinst_args;
602
603         if (old_pkg) {
604                 char *old_version = pkg_version_str_alloc(old_pkg);
605                 sprintf_alloc(&preinst_args, "upgrade %s", old_version);
606                 free(old_version);
607         } else if (pkg->state_status == SS_CONFIG_FILES) {
608                 char *pkg_version = pkg_version_str_alloc(pkg);
609                 sprintf_alloc(&preinst_args, "install %s", pkg_version);
610                 free(pkg_version);
611         } else {
612                 preinst_args = xstrdup("install");
613         }
614
615         err = pkg_run_script(pkg, "preinst", preinst_args);
616         if (err) {
617                 opkg_msg(ERROR, "Aborting installation of %s.\n", pkg->name);
618                 return -1;
619         }
620
621         free(preinst_args);
622
623         return 0;
624 }
625
626 static int preinst_configure_unwind(pkg_t * pkg, pkg_t * old_pkg)
627 {
628         /* DPKG_INCOMPATIBILITY:
629            dpkg does the following error unwind, should we?
630            pkg->postrm abort-upgrade old-version
631            OR pkg->postrm abort-install old-version
632            OR pkg->postrm abort-install
633          */
634         return 0;
635 }
636
637 static char *backup_filename_alloc(const char *file_name)
638 {
639         char *backup;
640
641         sprintf_alloc(&backup, "%s%s", file_name, OPKG_BACKUP_SUFFIX);
642
643         return backup;
644 }
645
646 static int backup_make_backup(const char *file_name)
647 {
648         int err;
649         char *backup;
650
651         backup = backup_filename_alloc(file_name);
652         err = file_copy(file_name, backup);
653         if (err) {
654                 opkg_msg(ERROR, "Failed to copy %s to %s\n", file_name, backup);
655         }
656
657         free(backup);
658
659         return err;
660 }
661
662 static int backup_exists_for(const char *file_name)
663 {
664         int ret;
665         char *backup;
666
667         backup = backup_filename_alloc(file_name);
668
669         ret = file_exists(backup);
670
671         free(backup);
672
673         return ret;
674 }
675
676 static int backup_remove(const char *file_name)
677 {
678         char *backup;
679
680         backup = backup_filename_alloc(file_name);
681         unlink(backup);
682         free(backup);
683
684         return 0;
685 }
686
687 static int backup_modified_conffiles(pkg_t * pkg, pkg_t * old_pkg)
688 {
689         int err;
690         conffile_list_elt_t *iter;
691         conffile_t *cf;
692
693         if (conf->noaction)
694                 return 0;
695
696         /* Backup all modified conffiles */
697         if (old_pkg) {
698                 for (iter = nv_pair_list_first(&old_pkg->conffiles); iter;
699                      iter = nv_pair_list_next(&old_pkg->conffiles, iter)) {
700                         char *cf_name;
701
702                         cf = iter->data;
703                         cf_name = root_filename_alloc(cf->name);
704
705                         /* Don't worry if the conffile is just plain gone */
706                         if (file_exists(cf_name)
707                             && conffile_has_been_modified(cf)) {
708                                 err = backup_make_backup(cf_name);
709                                 if (err) {
710                                         return err;
711                                 }
712                         }
713                         free(cf_name);
714                 }
715         }
716
717         /* Backup all conffiles that were not conffiles in old_pkg */
718         for (iter = nv_pair_list_first(&pkg->conffiles); iter;
719              iter = nv_pair_list_next(&pkg->conffiles, iter)) {
720                 char *cf_name;
721                 cf = (conffile_t *) iter->data;
722                 cf_name = root_filename_alloc(cf->name);
723                 /* Ignore if this was a conffile in old_pkg as well */
724                 if (pkg_get_conffile(old_pkg, cf->name)) {
725                         continue;
726                 }
727
728                 if (file_exists(cf_name) && (!backup_exists_for(cf_name))) {
729                         err = backup_make_backup(cf_name);
730                         if (err) {
731                                 return err;
732                         }
733                 }
734                 free(cf_name);
735         }
736
737         return 0;
738 }
739
740 static int backup_modified_conffiles_unwind(pkg_t * pkg, pkg_t * old_pkg)
741 {
742         conffile_list_elt_t *iter;
743
744         if (old_pkg) {
745                 for (iter = nv_pair_list_first(&old_pkg->conffiles); iter;
746                      iter = nv_pair_list_next(&old_pkg->conffiles, iter)) {
747                         backup_remove(((nv_pair_t *) iter->data)->name);
748                 }
749         }
750
751         for (iter = nv_pair_list_first(&pkg->conffiles); iter;
752              iter = nv_pair_list_next(&pkg->conffiles, iter)) {
753                 backup_remove(((nv_pair_t *) iter->data)->name);
754         }
755
756         return 0;
757 }
758
759 static int check_data_file_clashes(pkg_t * pkg, pkg_t * old_pkg)
760 {
761         /* DPKG_INCOMPATIBILITY:
762            opkg takes a slightly different approach than dpkg at this
763            point.  dpkg installs each file in the new package while
764            creating a backup for any file that is replaced, (so that it
765            can unwind if necessary).  To avoid complexity and redundant
766            storage, opkg doesn't do any installation until later, (at the
767            point at which dpkg removes the backups.
768
769            But, we do have to check for data file clashes, since after
770            installing a package with a file clash, removing either of the
771            packages involved in the clash has the potential to break the
772            other package.
773          */
774         str_list_t *files_list;
775         str_list_elt_t *iter, *niter;
776         char *filename;
777         int clashes = 0;
778
779         files_list = pkg_get_installed_files(pkg);
780         if (files_list == NULL)
781                 return -1;
782
783         for (iter = str_list_first(files_list), niter =
784              str_list_next(files_list, iter); iter;
785              iter = niter, niter = str_list_next(files_list, iter)) {
786                 filename = (char *)iter->data;
787                 if (file_exists(filename) && (!file_is_dir(filename))) {
788                         pkg_t *owner;
789                         pkg_t *obs;
790
791                         if (backup_exists_for(filename)) {
792                                 continue;
793                         }
794
795                         /* Pre-existing files are OK if force-overwrite was asserted. */
796                         if (conf->force_overwrite) {
797                                 /* but we need to change who owns this file */
798                                 file_hash_set_file_owner(filename, pkg);
799                                 continue;
800                         }
801
802                         owner = file_hash_get_file_owner(filename);
803
804                         /* Pre-existing files are OK if owned by the pkg being upgraded. */
805                         if (owner && old_pkg) {
806                                 if (strcmp(owner->name, old_pkg->name) == 0) {
807                                         continue;
808                                 }
809                         }
810
811                         /* Pre-existing files are OK if owned by a package replaced by new pkg. */
812                         if (owner) {
813                                 opkg_msg(DEBUG2,
814                                          "Checking replaces for %s in package %s\n",
815                                          filename, owner->name);
816                                 if (pkg_replaces(pkg, owner)) {
817                                         continue;
818                                 }
819 /* If the file that would be installed is owned by the same package, ( as per a reinstall or similar )
820    then it's ok to overwrite. */
821                                 if (strcmp(owner->name, pkg->name) == 0) {
822                                         opkg_msg(INFO,
823                                                  "Replacing pre-existing file %s"
824                                                  " owned by package %s\n",
825                                                  filename, owner->name);
826                                         continue;
827                                 }
828                         }
829
830                         /* Pre-existing files are OK if they are obsolete */
831                         obs = hash_table_get(&conf->obs_file_hash, filename);
832                         if (obs) {
833                                 opkg_msg(INFO,
834                                          "Pre-exiting file %s is obsolete."
835                                          " obs_pkg=%s\n", filename, obs->name);
836                                 continue;
837                         }
838
839                         /* We have found a clash. */
840                         opkg_msg(ERROR, "Package %s wants to install file %s\n"
841                                  "\tBut that file is already provided by package ",
842                                  pkg->name, filename);
843                         if (owner) {
844                                 opkg_message(ERROR, "%s\n", owner->name);
845                         } else {
846                                 opkg_message(ERROR, "<no package>\n"
847                                              "Please move this file out of the way and try again.\n");
848                         }
849                         clashes++;
850                 }
851         }
852         pkg_free_installed_files(pkg);
853
854         return clashes;
855 }
856
857 /*
858  * XXX: This function sucks, as does the below comment.
859  */
860 static int check_data_file_clashes_change(pkg_t * pkg, pkg_t * old_pkg)
861 {
862         /* Basically that's the worst hack I could do to be able to change ownership of
863            file list, but, being that we have no way to unwind the mods, due to structure
864            of hash table, probably is the quickest hack too, whishing it would not slow-up thing too much.
865            What we do here is change the ownership of file in hash if a replace ( or similar events
866            happens )
867            Only the action that are needed to change name should be considered.
868            @@@ To change after 1.0 release.
869          */
870         str_list_t *files_list;
871         str_list_elt_t *iter, *niter;
872
873         char *root_filename = NULL;
874
875         files_list = pkg_get_installed_files(pkg);
876         if (files_list == NULL)
877                 return -1;
878
879         for (iter = str_list_first(files_list), niter =
880              str_list_next(files_list, iter); iter;
881              iter = niter, niter = str_list_next(files_list, niter)) {
882                 char *filename = (char *)iter->data;
883                 if (root_filename) {
884                         free(root_filename);
885                         root_filename = NULL;
886                 }
887                 root_filename = root_filename_alloc(filename);
888                 if (file_exists(root_filename) && (!file_is_dir(root_filename))) {
889                         pkg_t *owner;
890
891                         owner = file_hash_get_file_owner(filename);
892
893                         if (conf->force_overwrite) {
894                                 /* but we need to change who owns this file */
895                                 file_hash_set_file_owner(filename, pkg);
896                                 continue;
897                         }
898
899                         /* Pre-existing files are OK if owned by a package replaced by new pkg. */
900                         if (owner) {
901                                 if (pkg_replaces(pkg, owner)) {
902 /* It's now time to change the owner of that file.
903    It has been "replaced" from the new "Replaces", then I need to inform lists file about that.  */
904                                         opkg_msg(INFO,
905                                                  "Replacing pre-existing file %s "
906                                                  "owned by package %s\n",
907                                                  filename, owner->name);
908                                         file_hash_set_file_owner(filename, pkg);
909                                         continue;
910                                 }
911                         }
912
913                 }
914         }
915         if (root_filename) {
916                 free(root_filename);
917                 root_filename = NULL;
918         }
919         pkg_free_installed_files(pkg);
920
921         return 0;
922 }
923
924 static int check_data_file_clashes_unwind(pkg_t * pkg, pkg_t * old_pkg)
925 {
926         /* Nothing to do since check_data_file_clashes doesn't change state */
927         return 0;
928 }
929
930 static int postrm_upgrade_old_pkg(pkg_t * pkg, pkg_t * old_pkg)
931 {
932         /* DPKG_INCOMPATIBILITY: dpkg does the following here, should we?
933            1. If the package is being upgraded, call
934            old-postrm upgrade new-version
935            2. If this fails, attempt:
936            new-postrm failed-upgrade old-version
937            Error unwind, for both cases:
938            old-preinst abort-upgrade new-version    */
939         int err;
940         char *script_args;
941         char *new_version;
942
943         if (!old_pkg || !pkg)
944                 return 0;
945
946         new_version = pkg_version_str_alloc(pkg);
947
948         sprintf_alloc(&script_args, "upgrade %s", new_version);
949         free(new_version);
950         err = pkg_run_script(old_pkg, "postrm", script_args);
951         free(script_args);
952         if (err != 0) {
953                 opkg_msg(ERROR, "postrm script for package \"%s\" failed\n",
954                          old_pkg->name);
955                 return -1;
956         }
957         return 0;
958 }
959
960 static int postrm_upgrade_old_pkg_unwind(pkg_t * pkg, pkg_t * old_pkg)
961 {
962         /* DPKG_INCOMPATIBILITY:
963            dpkg does some things here that we don't do yet. Do we care?
964            (See postrm_upgrade_old_pkg for details)
965          */
966         return 0;
967 }
968
969 static int remove_obsolesced_files(pkg_t * pkg, pkg_t * old_pkg)
970 {
971         int err = 0;
972         str_list_t *old_files;
973         str_list_elt_t *of;
974         str_list_t *new_files;
975         str_list_elt_t *nf;
976         hash_table_t new_files_table;
977
978         old_files = pkg_get_installed_files(old_pkg);
979         if (old_files == NULL)
980                 return -1;
981
982         new_files = pkg_get_installed_files(pkg);
983         if (new_files == NULL) {
984                 pkg_free_installed_files(old_pkg);
985                 return -1;
986         }
987
988         new_files_table.entries = NULL;
989         hash_table_init("new_files", &new_files_table, 20);
990         for (nf = str_list_first(new_files); nf;
991              nf = str_list_next(new_files, nf)) {
992                 if (nf && nf->data)
993                         hash_table_insert(&new_files_table, nf->data, nf->data);
994         }
995
996         for (of = str_list_first(old_files); of;
997              of = str_list_next(old_files, of)) {
998                 pkg_t *owner;
999                 char *old, *new;
1000                 old = (char *)of->data;
1001                 new = (char *)hash_table_get(&new_files_table, old);
1002                 if (new)
1003                         continue;
1004
1005                 if (file_is_dir(old)) {
1006                         continue;
1007                 }
1008                 owner = file_hash_get_file_owner(old);
1009                 if (owner != old_pkg) {
1010                         /* in case obsolete file no longer belongs to old_pkg */
1011                         continue;
1012                 }
1013
1014                 /* old file is obsolete */
1015                 opkg_msg(NOTICE, "Removing obsolete file %s.\n", old);
1016                 if (!conf->noaction) {
1017                         err = unlink(old);
1018                         if (err) {
1019                                 opkg_perror(ERROR, "unlinking %s failed", old);
1020                         }
1021                 }
1022         }
1023
1024         hash_table_deinit(&new_files_table);
1025         pkg_free_installed_files(old_pkg);
1026         pkg_free_installed_files(pkg);
1027
1028         return err;
1029 }
1030
1031 static int install_maintainer_scripts(pkg_t * pkg, pkg_t * old_pkg)
1032 {
1033         int ret;
1034         char *prefix;
1035
1036         sprintf_alloc(&prefix, "%s.", pkg->name);
1037         ret = pkg_extract_control_files_to_dir_with_prefix(pkg,
1038                                                            pkg->dest->info_dir,
1039                                                            prefix);
1040         free(prefix);
1041         return ret;
1042 }
1043
1044 static int remove_disappeared(pkg_t * pkg)
1045 {
1046         /* DPKG_INCOMPATIBILITY:
1047            This is a fairly sophisticated dpkg operation. Shall we
1048            skip it? */
1049
1050         /* Any packages all of whose files have been overwritten during the
1051            installation, and which aren't required for dependencies, are
1052            considered to have been removed. For each such package
1053            1. disappearer's-postrm disappear overwriter overwriter-version
1054            2. The package's maintainer scripts are removed
1055            3. It is noted in the status database as being in a sane state,
1056            namely not installed (any conffiles it may have are ignored,
1057            rather than being removed by dpkg). Note that disappearing
1058            packages do not have their prerm called, because dpkg doesn't
1059            know in advance that the package is going to vanish.
1060          */
1061         return 0;
1062 }
1063
1064 static int install_data_files(pkg_t * pkg)
1065 {
1066         int err;
1067
1068         /* opkg takes a slightly different approach to data file backups
1069            than dpkg. Rather than removing backups at this point, we
1070            actually do the data file installation now. See comments in
1071            check_data_file_clashes() for more details. */
1072
1073         opkg_msg(INFO, "Extracting data files to %s.\n", pkg->dest->root_dir);
1074         err = pkg_extract_data_files_to_dir(pkg, pkg->dest->root_dir);
1075         if (err) {
1076                 return err;
1077         }
1078
1079         /* The "Essential" control field may only be present in the control
1080          * file and not in the Packages list. Ensure we capture it regardless.
1081          *
1082          * XXX: This should be fixed outside of opkg, in the Package list.
1083          */
1084         set_flags_from_control(pkg);
1085
1086         opkg_msg(DEBUG, "Calling pkg_write_filelist.\n");
1087         err = pkg_write_filelist(pkg);
1088         if (err)
1089                 return err;
1090
1091         /* XXX: FEATURE: opkg should identify any files which existed
1092            before installation and which were overwritten, (see
1093            check_data_file_clashes()). What it must do is remove any such
1094            files from the filelist of the old package which provided the
1095            file. Otherwise, if the old package were removed at some point
1096            it would break the new package. Removing the new package will
1097            also break the old one, but this cannot be helped since the old
1098            package's file has already been deleted. This is the importance
1099            of check_data_file_clashes(), and only allowing opkg to install
1100            a clashing package with a user force. */
1101
1102         return 0;
1103 }
1104
1105 static int resolve_conffiles(pkg_t * pkg)
1106 {
1107         conffile_list_elt_t *iter;
1108         conffile_t *cf;
1109         char *cf_backup;
1110         char *chksum;
1111
1112         if (conf->noaction)
1113                 return 0;
1114
1115         for (iter = nv_pair_list_first(&pkg->conffiles); iter;
1116              iter = nv_pair_list_next(&pkg->conffiles, iter)) {
1117                 char *root_filename;
1118                 cf = (conffile_t *) iter->data;
1119                 root_filename = root_filename_alloc(cf->name);
1120
1121                 /* Might need to initialize the md5sum for each conffile */
1122                 if (cf->value == NULL) {
1123                         cf->value = file_sha256sum_alloc(root_filename);
1124                 }
1125
1126                 if (!file_exists(root_filename)) {
1127                         free(root_filename);
1128                         continue;
1129                 }
1130
1131                 cf_backup = backup_filename_alloc(root_filename);
1132
1133                 if (file_exists(cf_backup)) {
1134                         /* Let's compute md5 to test if files are changed */
1135 #ifdef HAVE_MD5
1136                         if (cf->value && strlen(cf->value) > 33) {
1137                                 chksum = file_sha256sum_alloc(cf_backup);
1138                         } else {
1139                                 chksum = file_md5sum_alloc(cf_backup);
1140                         }
1141 #else
1142                         chksum = file_sha256sum_alloc(cf_backup);
1143 #endif
1144                         if (chksum && cf->value
1145                             && strcmp(cf->value, chksum) != 0) {
1146                                 if (conf->force_maintainer) {
1147                                         opkg_msg(NOTICE,
1148                                                  "Conffile %s using maintainer's setting.\n",
1149                                                  cf_backup);
1150                                 } else {
1151                                         char *new_conffile;
1152                                         sprintf_alloc(&new_conffile, "%s-opkg",
1153                                                       root_filename);
1154                                         opkg_msg(ERROR,
1155                                                  "Existing conffile %s "
1156                                                  "is different from the conffile in the new package."
1157                                                  " The new conffile will be placed at %s.\n",
1158                                                  root_filename, new_conffile);
1159                                         rename(root_filename, new_conffile);
1160                                         rename(cf_backup, root_filename);
1161                                         free(new_conffile);
1162                                 }
1163                         }
1164                         unlink(cf_backup);
1165                         if (chksum)
1166                                 free(chksum);
1167                 }
1168
1169                 free(cf_backup);
1170                 free(root_filename);
1171         }
1172
1173         return 0;
1174 }
1175
1176 int opkg_install_by_name(const char *pkg_name)
1177 {
1178         int cmp;
1179         pkg_t *old, *new;
1180         char *old_version, *new_version;
1181
1182         old = pkg_hash_fetch_installed_by_name(pkg_name);
1183         if (old)
1184                 opkg_msg(DEBUG2, "Old versions from pkg_hash_fetch %s.\n",
1185                          pkg_get_string(old, PKG_VERSION));
1186
1187         new = pkg_hash_fetch_best_installation_candidate_by_name(pkg_name);
1188         if (new == NULL) {
1189                 opkg_msg(NOTICE, "Unknown package '%s'.\n", pkg_name);
1190                 return -1;
1191         }
1192
1193         opkg_msg(DEBUG2, "Versions from pkg_hash_fetch:");
1194         if (old)
1195                 opkg_message(DEBUG2, " old %s ", pkg_get_string(old, PKG_VERSION));
1196         opkg_message(DEBUG2, " new %s\n", pkg_get_string(new, PKG_VERSION));
1197
1198         new->state_flag |= SF_USER;
1199         if (old) {
1200                 old_version = pkg_version_str_alloc(old);
1201                 new_version = pkg_version_str_alloc(new);
1202
1203                 cmp = pkg_compare_versions(old, new);
1204                 if ((conf->force_downgrade == 1) && (cmp > 0)) {        /* We've been asked to allow downgrade  and version is precedent */
1205                         opkg_msg(DEBUG, "Forcing downgrade\n");
1206                         cmp = -1;       /* then we force opkg to downgrade */
1207                         /* We need to use a value < 0 because in the 0 case we are asking to */
1208                         /* reinstall, and some check could fail asking the "force-reinstall" option */
1209                 }
1210                 opkg_msg(DEBUG, "Comparing visible versions of pkg %s:"
1211                          "\n\t%s is installed "
1212                          "\n\t%s is available "
1213                          "\n\t%d was comparison result\n",
1214                          pkg_name, old_version, new_version, cmp);
1215                 if (cmp == 0) {
1216                         opkg_msg(NOTICE,
1217                                  "Package %s (%s) installed in %s is up to date.\n",
1218                                  old->name, old_version, old->dest->name);
1219                         free(old_version);
1220                         free(new_version);
1221                         return 0;
1222                 } else if (cmp > 0) {
1223                         opkg_msg(NOTICE,
1224                                  "Not downgrading package %s on %s from %s to %s.\n",
1225                                  old->name, old->dest->name, old_version,
1226                                  new_version);
1227                         free(old_version);
1228                         free(new_version);
1229                         return 0;
1230                 } else if (cmp < 0) {
1231                         new->dest = old->dest;
1232                         old->state_want = SW_DEINSTALL;
1233                 }
1234                 free(old_version);
1235                 free(new_version);
1236         }
1237
1238         opkg_msg(DEBUG2, "Calling opkg_install_pkg.\n");
1239         return opkg_install_pkg(new, 0);
1240 }
1241
1242 /**
1243  *  @brief Really install a pkg_t
1244  */
1245 int opkg_install_pkg(pkg_t * pkg, int from_upgrade)
1246 {
1247         int err = 0;
1248         int message = 0;
1249         pkg_t *old_pkg = NULL;
1250         pkg_vec_t *replacees;
1251         abstract_pkg_t *ab_pkg = NULL;
1252         int old_state_flag;
1253         char *file_md5, *pkg_md5;
1254 #ifdef HAVE_SHA256
1255         char *file_sha256, *pkg_sha256;
1256 #endif
1257         sigset_t newset, oldset;
1258         const char *local_filename;
1259
1260         if (from_upgrade)
1261                 message = 1;    /* Coming from an upgrade, and should change the output message */
1262
1263         opkg_msg(DEBUG2, "Calling pkg_arch_supported.\n");
1264
1265         if (!pkg_arch_supported(pkg)) {
1266                 opkg_msg(ERROR,
1267                          "INTERNAL ERROR: architecture %s for pkg %s is unsupported.\n",
1268                          pkg_get_string(pkg, PKG_ARCHITECTURE), pkg->name);
1269                 return -1;
1270         }
1271         if (pkg->state_status == SS_INSTALLED && conf->nodeps == 0) {
1272                 err = satisfy_dependencies_for(pkg);
1273                 if (err)
1274                         return -1;
1275
1276                 opkg_msg(NOTICE, "Package %s is already installed on %s.\n",
1277                          pkg->name, pkg->dest->name);
1278                 return 0;
1279         }
1280
1281         if (pkg->dest == NULL) {
1282                 pkg->dest = conf->default_dest;
1283         }
1284
1285         old_pkg = pkg_hash_fetch_installed_by_name(pkg->name);
1286
1287         err = opkg_install_check_downgrade(pkg, old_pkg, message);
1288         if (err)
1289                 return -1;
1290
1291         pkg->state_want = SW_INSTALL;
1292         if (old_pkg) {
1293                 old_pkg->state_want = SW_DEINSTALL;     /* needed for check_data_file_clashes of dependencies */
1294         }
1295
1296         err = check_conflicts_for(pkg);
1297         if (err)
1298                 return -1;
1299
1300         /* this setup is to remove the upgrade scenario in the end when
1301            installing pkg A, A deps B & B deps on A. So both B and A are
1302            installed. Then A's installation is started resulting in an
1303            uncecessary upgrade */
1304         if (pkg->state_status == SS_INSTALLED)
1305                 return 0;
1306
1307         err = verify_pkg_installable(pkg);
1308         if (err)
1309                 return -1;
1310
1311         local_filename = pkg_get_string(pkg, PKG_LOCAL_FILENAME);
1312
1313         if (local_filename == NULL) {
1314                 if (!conf->cache && conf->download_only) {
1315                         char cwd[4096];
1316                         if (getcwd(cwd, sizeof(cwd)) != NULL)
1317                                 err = opkg_download_pkg(pkg, cwd);
1318                         else
1319                                 return -1;
1320                 } else {
1321                         err = opkg_download_pkg(pkg, conf->tmp_dir);
1322                 }
1323                 if (err) {
1324                         opkg_msg(ERROR, "Failed to download %s. "
1325                                  "Perhaps you need to run 'opkg update'?\n",
1326                                  pkg->name);
1327                         return -1;
1328                 }
1329         }
1330
1331         /* check that the repository is valid */
1332 #if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) || defined(HAVE_USIGN)
1333         char *list_file_name, *sig_file_name, *lists_dir;
1334
1335         /* check to ensure the package has come from a repository */
1336         if (conf->check_signature && pkg->src) {
1337                 sprintf_alloc(&lists_dir, "%s", (conf->restrict_to_default_dest)
1338                               ? conf->default_dest->lists_dir
1339                               : conf->lists_dir);
1340                 sprintf_alloc(&list_file_name, "%s/%s", lists_dir,
1341                               pkg->src->name);
1342                 sprintf_alloc(&sig_file_name, "%s/%s.sig", lists_dir,
1343                               pkg->src->name);
1344
1345                 if (file_exists(sig_file_name)) {
1346                         if (opkg_verify_file(list_file_name, sig_file_name)) {
1347                                 opkg_msg(ERROR,
1348                                          "Failed to verify the signature of %s.\n",
1349                                          list_file_name);
1350                                 if (!conf->force_signature)
1351                                         return -1;
1352                         }
1353                 } else {
1354                         opkg_msg(ERROR, "Signature file is missing for %s. "
1355                                  "Perhaps you need to run 'opkg update'?\n",
1356                                  pkg->name);
1357                         if (!conf->force_signature)
1358                                 return -1;
1359                 }
1360
1361                 free(lists_dir);
1362                 free(list_file_name);
1363                 free(sig_file_name);
1364         }
1365 #endif
1366
1367 #ifdef HAVE_MD5
1368         /* Check for md5 values */
1369         pkg_md5 = pkg_get_string(pkg, PKG_MD5SUM);
1370         if (pkg_md5) {
1371                 file_md5 = file_md5sum_alloc(local_filename);
1372                 if (file_md5 && strcmp(file_md5, pkg_md5)) {
1373                         if (!conf->force_checksum) {
1374                                 opkg_msg(ERROR, "Package %s md5sum mismatch. "
1375                                          "Either the opkg or the package index are corrupt. "
1376                                          "Try 'opkg update'.\n", pkg->name);
1377                                 free(file_md5);
1378                                 return -1;
1379                         } else {
1380                                 opkg_msg(NOTICE,
1381                                          "Ignored %s md5sum mismatch.\n",
1382                                          pkg->name);
1383                         }
1384                 }
1385                 if (file_md5)
1386                         free(file_md5);
1387         }
1388 #endif
1389
1390 #ifdef HAVE_SHA256
1391         /* Check for sha256 value */
1392         pkg_sha256 = pkg_get_string(pkg, PKG_SHA256SUM);
1393         if (pkg_sha256) {
1394                 file_sha256 = file_sha256sum_alloc(local_filename);
1395                 if (file_sha256 && strcmp(file_sha256, pkg_sha256)) {
1396                         if (!conf->force_checksum) {
1397                                 opkg_msg(ERROR,
1398                                          "Package %s sha256sum mismatch. "
1399                                          "Either the opkg or the package index are corrupt. "
1400                                          "Try 'opkg update'.\n", pkg->name);
1401                                 free(file_sha256);
1402                                 return -1;
1403                         } else {
1404                                 opkg_msg(NOTICE,
1405                                          "Ignored %s sha256sum mismatch.\n",
1406                                          pkg->name);
1407                         }
1408                 }
1409                 if (file_sha256)
1410                         free(file_sha256);
1411         }
1412 #endif
1413         if (conf->download_only) {
1414                 if (conf->nodeps == 0) {
1415                         err = satisfy_dependencies_for(pkg);
1416                         if (err)
1417                                 return -1;
1418                 }
1419                 return 0;
1420         }
1421
1422         if (pkg->tmp_unpack_dir == NULL) {
1423                 if (unpack_pkg_control_files(pkg) == -1) {
1424                         opkg_msg(ERROR,
1425                                  "Failed to unpack control files from %s.\n",
1426                                  local_filename);
1427                         return -1;
1428                 }
1429         }
1430
1431         err = update_file_ownership(pkg, old_pkg);
1432         if (err)
1433                 return -1;
1434
1435         if (conf->nodeps == 0) {
1436                 err = satisfy_dependencies_for(pkg);
1437                 if (err)
1438                         return -1;
1439                 if (pkg->state_status == SS_UNPACKED)
1440                         /* Circular dependency has installed it for us. */
1441                         return 0;
1442         }
1443
1444         replacees = pkg_vec_alloc();
1445         pkg_get_installed_replacees(pkg, replacees);
1446
1447         /* this next section we do with SIGINT blocked to prevent inconsistency between opkg database and filesystem */
1448
1449         sigemptyset(&newset);
1450         sigaddset(&newset, SIGINT);
1451         sigprocmask(SIG_BLOCK, &newset, &oldset);
1452
1453         opkg_state_changed++;
1454         pkg->state_flag |= SF_FILELIST_CHANGED;
1455
1456         if (old_pkg) {
1457                 pkg_remove_orphan_dependent(pkg, old_pkg);
1458                 old_pkg->is_upgrade = 1;
1459                 pkg->is_upgrade = 1;
1460         }
1461         /* XXX: BUG: we really should treat replacement more like an upgrade
1462          *      Instead, we're going to remove the replacees
1463          */
1464         err = pkg_remove_installed_replacees(replacees);
1465         if (err)
1466                 goto UNWIND_REMOVE_INSTALLED_REPLACEES;
1467
1468         err = prerm_upgrade_old_pkg(pkg, old_pkg);
1469         if (err)
1470                 goto UNWIND_PRERM_UPGRADE_OLD_PKG;
1471
1472         err = prerm_deconfigure_conflictors(pkg, replacees);
1473         if (err)
1474                 goto UNWIND_PRERM_DECONFIGURE_CONFLICTORS;
1475
1476         err = preinst_configure(pkg, old_pkg);
1477         if (err)
1478                 goto UNWIND_PREINST_CONFIGURE;
1479
1480         err = backup_modified_conffiles(pkg, old_pkg);
1481         if (err)
1482                 goto UNWIND_BACKUP_MODIFIED_CONFFILES;
1483
1484         err = check_data_file_clashes(pkg, old_pkg);
1485         if (err)
1486                 goto UNWIND_CHECK_DATA_FILE_CLASHES;
1487
1488         err = postrm_upgrade_old_pkg(pkg, old_pkg);
1489         if (err)
1490                 goto UNWIND_POSTRM_UPGRADE_OLD_PKG;
1491
1492         if (conf->noaction)
1493                 return 0;
1494
1495         /* point of no return: no unwinding after this */
1496         if (old_pkg) {
1497                 old_pkg->state_want = SW_DEINSTALL;
1498
1499                 if (old_pkg->state_flag & SF_NOPRUNE) {
1500                         opkg_msg(INFO, "Not removing obsolesced files because "
1501                                  "package %s marked noprune.\n", old_pkg->name);
1502                 } else {
1503                         opkg_msg(INFO, "Removing obsolesced files for %s\n",
1504                                  old_pkg->name);
1505                         if (remove_obsolesced_files(pkg, old_pkg)) {
1506                                 opkg_msg(ERROR, "Failed to determine "
1507                                          "obsolete files from previously "
1508                                          "installed %s\n", old_pkg->name);
1509                         }
1510                 }
1511
1512                 /* removing files from old package, to avoid ghost files */
1513                 remove_data_files_and_list(old_pkg);
1514                 remove_maintainer_scripts(old_pkg);
1515         }
1516
1517         opkg_msg(INFO, "%s maintainer scripts.\n",
1518                  (pkg->is_upgrade) ? ("Upgrading") : ("Installing"));
1519         if (install_maintainer_scripts(pkg, old_pkg)) {
1520                 opkg_msg(ERROR, "Failed to extract maintainer scripts for %s."
1521                          " Package debris may remain!\n", pkg->name);
1522                 goto pkg_is_hosed;
1523         }
1524
1525         /* the following just returns 0 */
1526         remove_disappeared(pkg);
1527
1528         opkg_msg(INFO, "Installing data files for %s.\n", pkg->name);
1529
1530         if (install_data_files(pkg)) {
1531                 opkg_msg(ERROR, "Failed to extract data files for %s. "
1532                          "Package debris may remain!\n", pkg->name);
1533                 goto pkg_is_hosed;
1534         }
1535
1536         err = check_data_file_clashes_change(pkg, old_pkg);
1537         if (err) {
1538                 opkg_msg(ERROR, "check_data_file_clashes_change() failed for "
1539                          "for files belonging to %s.\n", pkg->name);
1540         }
1541
1542         opkg_msg(INFO, "Resolving conf files for %s\n", pkg->name);
1543         resolve_conffiles(pkg);
1544
1545         pkg->state_status = SS_UNPACKED;
1546         old_state_flag = pkg->state_flag;
1547         pkg->state_flag &= ~SF_PREFER;
1548         opkg_msg(DEBUG, "pkg=%s old_state_flag=%x state_flag=%x\n",
1549                  pkg->name, old_state_flag, pkg->state_flag);
1550
1551         if (old_pkg)
1552                 old_pkg->state_status = SS_NOT_INSTALLED;
1553
1554         time(&pkg->installed_time);
1555
1556         ab_pkg = pkg->parent;
1557         if (ab_pkg)
1558                 ab_pkg->state_status = pkg->state_status;
1559
1560         sigprocmask(SIG_UNBLOCK, &newset, &oldset);
1561         pkg_vec_free(replacees);
1562         return 0;
1563
1564 UNWIND_POSTRM_UPGRADE_OLD_PKG:
1565         postrm_upgrade_old_pkg_unwind(pkg, old_pkg);
1566 UNWIND_CHECK_DATA_FILE_CLASHES:
1567         check_data_file_clashes_unwind(pkg, old_pkg);
1568 UNWIND_BACKUP_MODIFIED_CONFFILES:
1569         backup_modified_conffiles_unwind(pkg, old_pkg);
1570 UNWIND_PREINST_CONFIGURE:
1571         preinst_configure_unwind(pkg, old_pkg);
1572 UNWIND_PRERM_DECONFIGURE_CONFLICTORS:
1573         prerm_deconfigure_conflictors_unwind(pkg, replacees);
1574 UNWIND_PRERM_UPGRADE_OLD_PKG:
1575         prerm_upgrade_old_pkg_unwind(pkg, old_pkg);
1576 UNWIND_REMOVE_INSTALLED_REPLACEES:
1577         pkg_remove_installed_replacees_unwind(replacees);
1578
1579 pkg_is_hosed:
1580         sigprocmask(SIG_UNBLOCK, &newset, &oldset);
1581
1582         pkg_vec_free(replacees);
1583         return -1;
1584 }