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