Make the error message easier to read for multiple unsatisfied dependencies.
[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
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_message(ERROR, "\t%s", *unresolved);
62                free(*unresolved);
63                unresolved++;
64           }
65           free(tmp);
66           opkg_message(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,r, err = 0;
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                                 r = opkg_remove_pkg(p, 0);
366                                 if (!err)
367                                         err = r;
368                         } else 
369                                 opkg_msg(INFO, "%s was autoinstalled and is "
370                                                 "still required by %d "
371                                                 "installed packages.\n",
372                                                 p->name, n_deps);
373
374                 }
375         }
376
377         return err;
378 }
379
380 /* returns number of installed replacees */
381 static int
382 pkg_get_installed_replacees(pkg_t *pkg, pkg_vec_t *installed_replacees)
383 {
384      abstract_pkg_t **replaces = pkg->replaces;
385      int replaces_count = pkg->replaces_count;
386      int i, j;
387      for (i = 0; i < replaces_count; i++) {
388           abstract_pkg_t *ab_pkg = replaces[i];
389           pkg_vec_t *pkg_vec = ab_pkg->pkgs;
390           if (pkg_vec) {
391                for (j = 0; j < pkg_vec->len; j++) {
392                     pkg_t *replacee = pkg_vec->pkgs[j];
393                     if (!pkg_conflicts(pkg, replacee))
394                          continue;
395                     if (replacee->state_status == SS_INSTALLED) {
396                          pkg_vec_insert(installed_replacees, replacee);
397                     }
398                }
399           }
400      }
401      return installed_replacees->len;
402 }
403
404 static int
405 pkg_remove_installed_replacees(pkg_vec_t *replacees)
406 {
407      int i;
408      int replaces_count = replacees->len;
409      for (i = 0; i < replaces_count; i++) {
410           pkg_t *replacee = replacees->pkgs[i];
411           int err;
412           replacee->state_flag |= SF_REPLACE; /* flag it so remove won't complain */
413           err = opkg_remove_pkg(replacee, 0);
414           if (err)
415                return err;
416      }
417      return 0;
418 }
419
420 /* to unwind the removal: make sure they are installed */
421 static int
422 pkg_remove_installed_replacees_unwind(pkg_vec_t *replacees)
423 {
424      int i, err;
425      int replaces_count = replacees->len;
426      for (i = 0; i < replaces_count; i++) {
427           pkg_t *replacee = replacees->pkgs[i];
428           if (replacee->state_status != SS_INSTALLED) {
429                opkg_msg(DEBUG2, "Calling opkg_install_pkg.\n");
430                err = opkg_install_pkg(replacee, 0);
431                if (err)
432                     return err;
433           }
434      }
435      return 0;
436 }
437
438 /* compares versions of pkg and old_pkg, returns 0 if OK to proceed with installation of pkg, 1 otherwise */
439 static int
440 opkg_install_check_downgrade(pkg_t *pkg, pkg_t *old_pkg, int message)
441 {         
442      if (old_pkg) {
443           char message_out[15];
444           char *old_version = pkg_version_str_alloc(old_pkg);
445           char *new_version = pkg_version_str_alloc(pkg);
446           int cmp = pkg_compare_versions(old_pkg, pkg);
447           int rc = 0;
448
449           memset(message_out,'\x0',15);
450           strncpy (message_out,"Upgrading ",strlen("Upgrading ")); 
451           if ( (conf->force_downgrade==1) && (cmp > 0) ){     /* We've been asked to allow downgrade  and version is precedent */
452              cmp = -1 ;                                       /* then we force opkg to downgrade */ 
453              strncpy (message_out,"Downgrading ",strlen("Downgrading "));         /* We need to use a value < 0 because in the 0 case we are asking to */
454                                                               /* reinstall, and some check could fail asking the "force-reinstall" option */
455           } 
456
457           if (cmp > 0) {
458               if(!conf->download_only)
459                   opkg_msg(NOTICE,
460                           "Not downgrading package %s on %s from %s to %s.\n",
461                           old_pkg->name, old_pkg->dest->name, old_version, new_version);
462                rc = 1;
463           } else if (cmp < 0) {
464               if(!conf->download_only)
465                   opkg_msg(NOTICE, "%s%s on %s from %s to %s...\n",
466                           message_out, pkg->name, old_pkg->dest->name, old_version, new_version);
467                pkg->dest = old_pkg->dest;
468                rc = 0;
469           } else /* cmp == 0 */ {
470                if (conf->force_reinstall) {
471                if(!conf->download_only)
472                    opkg_msg(NOTICE, "Reinstalling %s (%s) on %s...\n",
473                            pkg->name, new_version, old_pkg->dest->name);
474                     pkg->dest = old_pkg->dest;
475                     rc = 0;
476                } else {
477                    if(!conf->download_only)
478                        opkg_msg(NOTICE, "%s (%s) already install on %s."
479                                " Not reinstalling.\n",
480                                pkg->name, new_version, old_pkg->dest->name);
481                     rc = 1;
482                }
483           } 
484           free(old_version);
485           free(new_version);
486           return rc;
487      } else {
488           char message_out[15] ;
489           memset(message_out,'\x0',15);
490           if ( message ) 
491                strncpy( message_out,"Upgrading ",strlen("Upgrading ") );
492           else
493                strncpy( message_out,"Installing ",strlen("Installing ") );
494           char *version = pkg_version_str_alloc(pkg);
495
496           if(!conf->download_only)
497                opkg_msg(NOTICE, "%s%s (%s) to %s...\n", message_out,
498                   pkg->name, version, pkg->dest->name);
499           free(version);
500      }
501      return 0;
502 }
503
504
505 static int
506 prerm_upgrade_old_pkg(pkg_t *pkg, pkg_t *old_pkg)
507 {
508      /* DPKG_INCOMPATIBILITY:
509         dpkg does some things here that we don't do yet. Do we care?
510         
511         1. If a version of the package is already installed, call
512            old-prerm upgrade new-version
513         2. If the script runs but exits with a non-zero exit status
514            new-prerm failed-upgrade old-version
515            Error unwind, for both the above cases:
516            old-postinst abort-upgrade new-version
517      */
518      return 0;
519 }
520
521 static int
522 prerm_upgrade_old_pkg_unwind(pkg_t *pkg, pkg_t *old_pkg)
523 {
524      /* DPKG_INCOMPATIBILITY:
525         dpkg does some things here that we don't do yet. Do we care?
526         (See prerm_upgrade_old_package for details)
527      */
528      return 0;
529 }
530
531 static int
532 prerm_deconfigure_conflictors(pkg_t *pkg, pkg_vec_t *conflictors)
533 {
534      /* DPKG_INCOMPATIBILITY:
535         dpkg does some things here that we don't do yet. Do we care?
536         2. If a 'conflicting' package is being removed at the same time:
537                 1. If any packages depended on that conflicting package and
538                    --auto-deconfigure is specified, call, for each such package:
539                    deconfigured's-prerm deconfigure \
540                    in-favour package-being-installed version \
541                    removing conflicting-package version
542                 Error unwind:
543                    deconfigured's-postinst abort-deconfigure \
544                    in-favour package-being-installed-but-failed version \
545                    removing conflicting-package version
546
547                    The deconfigured packages are marked as requiring
548                    configuration, so that if --install is used they will be
549                    configured again if possible.
550                 2. To prepare for removal of the conflicting package, call:
551                    conflictor's-prerm remove in-favour package new-version
552                 Error unwind:
553                    conflictor's-postinst abort-remove in-favour package new-version
554      */
555      return 0;
556 }
557
558 static int
559 prerm_deconfigure_conflictors_unwind(pkg_t *pkg, pkg_vec_t *conflictors)
560 {
561      /* DPKG_INCOMPATIBILITY: dpkg does some things here that we don't
562         do yet. Do we care?  (See prerm_deconfigure_conflictors for
563         details) */
564      return 0;
565 }
566
567 static int
568 preinst_configure(pkg_t *pkg, pkg_t *old_pkg)
569 {
570      int err;
571      char *preinst_args;
572
573      if (old_pkg) {
574           char *old_version = pkg_version_str_alloc(old_pkg);
575           sprintf_alloc(&preinst_args, "upgrade %s", old_version);
576           free(old_version);
577      } else if (pkg->state_status == SS_CONFIG_FILES) {
578           char *pkg_version = pkg_version_str_alloc(pkg);
579           sprintf_alloc(&preinst_args, "install %s", pkg_version);
580           free(pkg_version);
581      } else {
582           preinst_args = xstrdup("install");
583      }
584
585      err = pkg_run_script(pkg, "preinst", preinst_args);
586      if (err) {
587           opkg_msg(ERROR, "Aborting installation of %s.\n", pkg->name);
588           return -1;
589      }
590
591      free(preinst_args);
592
593      return 0;
594 }
595
596 static int
597 preinst_configure_unwind(pkg_t *pkg, pkg_t *old_pkg)
598 {
599      /* DPKG_INCOMPATIBILITY:
600         dpkg does the following error unwind, should we?
601         pkg->postrm abort-upgrade old-version
602         OR pkg->postrm abort-install old-version
603         OR pkg->postrm abort-install
604      */
605      return 0;
606 }
607
608 static char *
609 backup_filename_alloc(const char *file_name)
610 {
611      char *backup;
612
613      sprintf_alloc(&backup, "%s%s", file_name, OPKG_BACKUP_SUFFIX);
614
615      return backup;
616 }
617
618
619 static int
620 backup_make_backup(const char *file_name)
621 {
622      int err;
623      char *backup;
624     
625      backup = backup_filename_alloc(file_name);
626      err = file_copy(file_name, backup);
627      if (err) {
628           opkg_msg(ERROR, "Failed to copy %s to %s\n",
629                        file_name, backup);
630      }
631
632      free(backup);
633
634      return err;
635 }
636
637 static int
638 backup_exists_for(const char *file_name)
639 {
640      int ret;
641      char *backup;
642
643      backup = backup_filename_alloc(file_name);
644
645      ret = file_exists(backup);
646
647      free(backup);
648
649      return ret;
650 }
651
652 static int
653 backup_remove(const char *file_name)
654 {
655      char *backup;
656
657      backup = backup_filename_alloc(file_name);
658      unlink(backup);
659      free(backup);
660
661      return 0;
662 }
663
664 static int
665 backup_modified_conffiles(pkg_t *pkg, pkg_t *old_pkg)
666 {
667      int err;
668      conffile_list_elt_t *iter;
669      conffile_t *cf;
670
671      if (conf->noaction) return 0;
672
673      /* Backup all modified conffiles */
674      if (old_pkg) {
675           for (iter = nv_pair_list_first(&old_pkg->conffiles); iter; iter = nv_pair_list_next(&old_pkg->conffiles, iter)) {
676                char *cf_name;
677                
678                cf = iter->data;
679                cf_name = root_filename_alloc(cf->name);
680
681                /* Don't worry if the conffile is just plain gone */
682                if (file_exists(cf_name) && conffile_has_been_modified(cf)) {
683                     err = backup_make_backup(cf_name);
684                     if (err) {
685                          return err;
686                     }
687                }
688                free(cf_name);
689           }
690      }
691
692      /* Backup all conffiles that were not conffiles in old_pkg */
693      for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
694           char *cf_name;
695           cf = (conffile_t *)iter->data;
696           cf_name = root_filename_alloc(cf->name);
697           /* Ignore if this was a conffile in old_pkg as well */
698           if (pkg_get_conffile(old_pkg, cf->name)) {
699                continue;
700           }
701
702           if (file_exists(cf_name) && (! backup_exists_for(cf_name))) {
703                err = backup_make_backup(cf_name);
704                if (err) {
705                     return err;
706                }
707           }
708           free(cf_name);
709      }
710
711      return 0;
712 }
713
714 static int
715 backup_modified_conffiles_unwind(pkg_t *pkg, pkg_t *old_pkg)
716 {
717      conffile_list_elt_t *iter;
718
719      if (old_pkg) {
720           for (iter = nv_pair_list_first(&old_pkg->conffiles); iter; iter = nv_pair_list_next(&old_pkg->conffiles, iter)) {
721                backup_remove(((nv_pair_t *)iter->data)->name);
722           }
723      }
724
725      for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
726           backup_remove(((nv_pair_t *)iter->data)->name);
727      }
728
729      return 0;
730 }
731
732
733 static int
734 check_data_file_clashes(pkg_t *pkg, pkg_t *old_pkg)
735 {
736      /* DPKG_INCOMPATIBILITY:
737         opkg takes a slightly different approach than dpkg at this
738         point.  dpkg installs each file in the new package while
739         creating a backup for any file that is replaced, (so that it
740         can unwind if necessary).  To avoid complexity and redundant
741         storage, opkg doesn't do any installation until later, (at the
742         point at which dpkg removes the backups.
743         
744         But, we do have to check for data file clashes, since after
745         installing a package with a file clash, removing either of the
746         packages involved in the clash has the potential to break the
747         other package.
748      */
749      str_list_t *files_list;
750      str_list_elt_t *iter, *niter;
751
752      int clashes = 0;
753
754      files_list = pkg_get_installed_files(pkg);
755      if (files_list == NULL)
756              return -1;
757
758      for (iter = str_list_first(files_list), niter = str_list_next(files_list, iter); 
759              iter; 
760              iter = niter, niter = str_list_next(files_list, iter)) {
761           char *root_filename;
762           char *filename = (char *) iter->data;
763           root_filename = root_filename_alloc(filename);
764           if (file_exists(root_filename) && (! file_is_dir(root_filename))) {
765                pkg_t *owner;
766                pkg_t *obs;
767
768                if (backup_exists_for(root_filename)) {
769                     continue;
770                }
771
772                /* Pre-existing files are OK if force-overwrite was asserted. */ 
773                if (conf->force_overwrite) {
774                     /* but we need to change who owns this file */
775                     file_hash_set_file_owner(filename, pkg);
776                     continue;
777                }
778
779                owner = file_hash_get_file_owner(filename);
780
781                /* Pre-existing files are OK if owned by the pkg being upgraded. */
782                if (owner && old_pkg) {
783                     if (strcmp(owner->name, old_pkg->name) == 0) {
784                          continue;
785                     }
786                }
787
788                /* Pre-existing files are OK if owned by a package replaced by new pkg. */
789                if (owner) {
790                     opkg_msg(DEBUG2, "Checking replaces for %s in package %s\n",
791                                 filename, owner->name);
792                     if (pkg_replaces(pkg, owner)) {
793                          continue;
794                     }
795 /* If the file that would be installed is owned by the same package, ( as per a reinstall or similar )
796    then it's ok to overwrite. */
797                     if (strcmp(owner->name,pkg->name)==0){
798                          opkg_msg(INFO, "Replacing pre-existing file %s"
799                                         " owned by package %s\n",
800                                         filename, owner->name);
801                          continue;
802                     }
803                }
804
805                /* Pre-existing files are OK if they are obsolete */
806                obs = hash_table_get(&conf->obs_file_hash, filename);
807                if (obs) {
808                     opkg_msg(INFO, "Pre-exiting file %s is obsolete."
809                                    " obs_pkg=%s\n",
810                                     filename, obs->name);
811                     continue;
812                }
813
814                /* We have found a clash. */
815                opkg_msg(ERROR, "Package %s wants to install file %s\n"
816                             "\tBut that file is already provided by package ",
817                             pkg->name, filename);
818                if (owner) {
819                     opkg_msg(ERROR, "%s\n", owner->name);
820                } else {
821                     opkg_msg(ERROR, "<no package>\n"
822                         "Please move this file out of the way and try again.\n");
823                }
824                clashes++;
825           }
826           free(root_filename);
827      }
828      pkg_free_installed_files(pkg);
829
830      return clashes;
831 }
832
833 /*
834  * XXX: This function sucks, as does the below comment.
835  */
836 static int
837 check_data_file_clashes_change(pkg_t *pkg, pkg_t *old_pkg)
838 {
839     /* Basically that's the worst hack I could do to be able to change ownership of
840        file list, but, being that we have no way to unwind the mods, due to structure
841        of hash table, probably is the quickest hack too, whishing it would not slow-up thing too much.
842        What we do here is change the ownership of file in hash if a replace ( or similar events
843        happens )
844        Only the action that are needed to change name should be considered.
845        @@@ To change after 1.0 release.
846      */
847      str_list_t *files_list;
848      str_list_elt_t *iter, *niter;
849
850      char *root_filename = NULL;
851
852      files_list = pkg_get_installed_files(pkg);
853      if (files_list == NULL)
854              return -1;
855
856      for (iter = str_list_first(files_list), niter = str_list_next(files_list, iter); 
857              iter; 
858              iter = niter, niter = str_list_next(files_list, niter)) {
859           char *filename = (char *) iter->data;
860           if (root_filename) {
861               free(root_filename);
862               root_filename = NULL;
863           }
864           root_filename = root_filename_alloc(filename);
865           if (file_exists(root_filename) && (! file_is_dir(root_filename))) {
866                pkg_t *owner;
867
868                owner = file_hash_get_file_owner(filename);
869
870                if (conf->force_overwrite) {
871                     /* but we need to change who owns this file */
872                     file_hash_set_file_owner(filename, pkg);
873                     continue;
874                }
875
876
877                /* Pre-existing files are OK if owned by a package replaced by new pkg. */
878                if (owner) {
879                     if (pkg_replaces(pkg, owner)) {
880 /* It's now time to change the owner of that file. 
881    It has been "replaced" from the new "Replaces", then I need to inform lists file about that.  */
882                          opkg_msg(INFO, "Replacing pre-existing file %s "
883                                          "owned by package %s\n",
884                                          filename, owner->name);
885                          file_hash_set_file_owner(filename, pkg);
886                          continue;
887                     }
888                }
889
890           }
891      }
892      if (root_filename) {
893          free(root_filename);
894          root_filename = NULL;
895      }
896      pkg_free_installed_files(pkg);
897
898      return 0;
899 }
900
901 static int
902 check_data_file_clashes_unwind(pkg_t *pkg, pkg_t *old_pkg)
903 {
904      /* Nothing to do since check_data_file_clashes doesn't change state */
905      return 0;
906 }
907
908 static int
909 postrm_upgrade_old_pkg(pkg_t *pkg, pkg_t *old_pkg)
910 {
911      /* DPKG_INCOMPATIBILITY: dpkg does the following here, should we?
912         1. If the package is being upgraded, call
913            old-postrm upgrade new-version
914         2. If this fails, attempt:
915            new-postrm failed-upgrade old-version
916         Error unwind, for both cases:
917            old-preinst abort-upgrade new-version    */
918      return 0;
919 }
920
921 static int
922 postrm_upgrade_old_pkg_unwind(pkg_t *pkg, pkg_t *old_pkg)
923 {
924      /* DPKG_INCOMPATIBILITY:
925         dpkg does some things here that we don't do yet. Do we care?
926         (See postrm_upgrade_old_pkg for details)
927      */
928     return 0;
929 }
930
931 static int
932 remove_obsolesced_files(pkg_t *pkg, pkg_t *old_pkg)
933 {
934      int err = 0;
935      str_list_t *old_files;
936      str_list_elt_t *of;
937      str_list_t *new_files;
938      str_list_elt_t *nf;
939      hash_table_t new_files_table;
940
941      old_files = pkg_get_installed_files(old_pkg);
942      if (old_files == NULL)
943           return -1;
944
945      new_files = pkg_get_installed_files(pkg);
946      if (new_files == NULL) {
947           pkg_free_installed_files(old_pkg);
948           return -1;
949      }
950
951      new_files_table.entries = NULL;
952      hash_table_init("new_files" , &new_files_table, 20);
953      for (nf = str_list_first(new_files); nf; nf = str_list_next(new_files, nf)) {
954          if (nf && nf->data)
955             hash_table_insert(&new_files_table, nf->data, nf->data);
956      }
957
958      for (of = str_list_first(old_files); of; of = str_list_next(old_files, of)) {
959           pkg_t *owner;
960           char *old, *new;
961           old = (char *)of->data;
962           new = (char *) hash_table_get (&new_files_table, old);
963           if (new)
964                continue;
965
966           if (file_is_dir(old)) {
967                continue;
968           }
969           owner = file_hash_get_file_owner(old);
970           if (owner != old_pkg) {
971                /* in case obsolete file no longer belongs to old_pkg */
972                continue;
973           }
974  
975           /* old file is obsolete */
976           opkg_msg(INFO, "Removing obsolete file %s.\n", old);
977           if (!conf->noaction) {
978                err = unlink(old);
979                if (err) {
980                     opkg_perror(ERROR, "unlinking %s failed", old);
981                }
982           }
983      }
984
985      hash_table_deinit(&new_files_table);
986      pkg_free_installed_files(old_pkg);
987      pkg_free_installed_files(pkg);
988
989      return err;
990 }
991
992 static int
993 install_maintainer_scripts(pkg_t *pkg, pkg_t *old_pkg)
994 {
995      int ret;
996      char *prefix;
997
998      sprintf_alloc(&prefix, "%s.", pkg->name);
999      ret = pkg_extract_control_files_to_dir_with_prefix(pkg,
1000                                                         pkg->dest->info_dir,
1001                                                         prefix);
1002      free(prefix);
1003      return ret;
1004 }
1005
1006 static int
1007 remove_disappeared(pkg_t *pkg)
1008 {
1009      /* DPKG_INCOMPATIBILITY:
1010         This is a fairly sophisticated dpkg operation. Shall we
1011         skip it? */
1012      
1013      /* Any packages all of whose files have been overwritten during the
1014         installation, and which aren't required for dependencies, are
1015         considered to have been removed. For each such package
1016         1. disappearer's-postrm disappear overwriter overwriter-version
1017         2. The package's maintainer scripts are removed
1018         3. It is noted in the status database as being in a sane state,
1019            namely not installed (any conffiles it may have are ignored,
1020            rather than being removed by dpkg). Note that disappearing
1021            packages do not have their prerm called, because dpkg doesn't
1022            know in advance that the package is going to vanish.
1023      */
1024      return 0;
1025 }
1026
1027 static int
1028 install_data_files(pkg_t *pkg)
1029 {
1030      int err;
1031
1032      /* opkg takes a slightly different approach to data file backups
1033         than dpkg. Rather than removing backups at this point, we
1034         actually do the data file installation now. See comments in
1035         check_data_file_clashes() for more details. */
1036     
1037      opkg_msg(INFO, "Extracting data files to %s.\n", pkg->dest->root_dir);
1038      err = pkg_extract_data_files_to_dir(pkg, pkg->dest->root_dir);
1039      if (err) {
1040           return err;
1041      }
1042
1043      /* The "Essential" control field may only be present in the control
1044       * file and not in the Packages list. Ensure we capture it regardless.
1045       *
1046       * XXX: This should be fixed outside of opkg, in the Package list.
1047       */
1048      set_flags_from_control(pkg) ;
1049      
1050      opkg_msg(DEBUG, "Calling pkg_write_filelist.\n");
1051      err = pkg_write_filelist(pkg);
1052      if (err)
1053           return err;
1054
1055      /* XXX: FEATURE: opkg should identify any files which existed
1056         before installation and which were overwritten, (see
1057         check_data_file_clashes()). What it must do is remove any such
1058         files from the filelist of the old package which provided the
1059         file. Otherwise, if the old package were removed at some point
1060         it would break the new package. Removing the new package will
1061         also break the old one, but this cannot be helped since the old
1062         package's file has already been deleted. This is the importance
1063         of check_data_file_clashes(), and only allowing opkg to install
1064         a clashing package with a user force. */
1065
1066      return 0;
1067 }
1068
1069 static int
1070 resolve_conffiles(pkg_t *pkg)
1071 {
1072      conffile_list_elt_t *iter;
1073      conffile_t *cf;
1074      char *cf_backup;
1075      char *md5sum;
1076
1077      if (conf->noaction) return 0;
1078
1079      for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
1080           char *root_filename;
1081           cf = (conffile_t *)iter->data;
1082           root_filename = root_filename_alloc(cf->name);
1083
1084           /* Might need to initialize the md5sum for each conffile */
1085           if (cf->value == NULL) {
1086                cf->value = file_md5sum_alloc(root_filename);
1087           }
1088
1089           if (!file_exists(root_filename)) {
1090                free(root_filename);
1091                continue;
1092           }
1093
1094           cf_backup = backup_filename_alloc(root_filename);
1095
1096           if (file_exists(cf_backup)) {
1097               /* Let's compute md5 to test if files are changed */
1098               md5sum = file_md5sum_alloc(cf_backup);
1099               if (md5sum && cf->value && strcmp(cf->value,md5sum) != 0 ) {
1100                   if (conf->force_maintainer) {
1101                       opkg_msg(NOTICE, "Conffile %s using maintainer's setting.\n",
1102                                       cf_backup);
1103                   } else {
1104                       char *new_conffile;
1105                       sprintf_alloc(&new_conffile, "%s-opkg", root_filename);
1106                       opkg_msg(NOTICE, "Existing conffile %s "
1107                            "is different from the conffile in the new package."
1108                            " The new conffile will be placed at %s.\n",
1109                            root_filename, new_conffile);
1110                       rename(root_filename, new_conffile);
1111                       rename(cf_backup, root_filename);
1112                       free(new_conffile);
1113                   }
1114               }
1115               unlink(cf_backup);
1116               if (md5sum)
1117                   free(md5sum);
1118           }
1119
1120           free(cf_backup);
1121           free(root_filename);
1122      }
1123
1124      return 0;
1125 }
1126
1127
1128 int
1129 opkg_install_by_name(const char *pkg_name)
1130 {
1131      int cmp;
1132      pkg_t *old, *new;
1133      char *old_version, *new_version;
1134
1135      old = pkg_hash_fetch_installed_by_name(pkg_name);
1136      if (old)
1137         opkg_msg(DEBUG2, "Old versions from pkg_hash_fetch %s.\n",
1138                         old->version);
1139     
1140      new = pkg_hash_fetch_best_installation_candidate_by_name(pkg_name);
1141      if (new == NULL)
1142         return -1;
1143
1144      opkg_msg(DEBUG2, "Versions from pkg_hash_fetch:");
1145      if ( old ) 
1146         opkg_msg(DEBUG2, " old %s ", old->version);
1147      opkg_msg(DEBUG2, " new %s\n", new->version);
1148
1149      new->state_flag |= SF_USER;
1150      if (old) {
1151           old_version = pkg_version_str_alloc(old);
1152           new_version = pkg_version_str_alloc(new);
1153
1154           cmp = pkg_compare_versions(old, new);
1155           if ( (conf->force_downgrade==1) && (cmp > 0) ){     /* We've been asked to allow downgrade  and version is precedent */
1156              opkg_msg(DEBUG, "Forcing downgrade\n");
1157              cmp = -1 ;                                       /* then we force opkg to downgrade */ 
1158                                                               /* We need to use a value < 0 because in the 0 case we are asking to */
1159                                                               /* reinstall, and some check could fail asking the "force-reinstall" option */
1160           } 
1161           opkg_msg(DEBUG, "Comparing visible versions of pkg %s:"
1162                        "\n\t%s is installed "
1163                        "\n\t%s is available "
1164                        "\n\t%d was comparison result\n",
1165                        pkg_name, old_version, new_version, cmp);
1166           if (cmp == 0 && !conf->force_reinstall) {
1167                opkg_msg(NOTICE,
1168                             "Package %s (%s) installed in %s is up to date.\n",
1169                             old->name, old_version, old->dest->name);
1170                free(old_version);
1171                free(new_version);
1172                return 0;
1173           } else if (cmp > 0) {
1174                opkg_msg(NOTICE,
1175                             "Not downgrading package %s on %s from %s to %s.\n",
1176                             old->name, old->dest->name, old_version, new_version);
1177                free(old_version);
1178                free(new_version);
1179                return 0;
1180           } else if (cmp < 0) {
1181                new->dest = old->dest;
1182                old->state_want = SW_DEINSTALL;    /* Here probably the problem for bug 1277 */
1183           }
1184           free(old_version);
1185           free(new_version);
1186      }
1187
1188      opkg_msg(DEBUG2,"Calling opkg_install_pkg.\n");
1189      return opkg_install_pkg(new, 0);
1190 }
1191
1192 /**
1193  *  @brief Really install a pkg_t 
1194  */
1195 int
1196 opkg_install_pkg(pkg_t *pkg, int from_upgrade)
1197 {
1198      int err = 0;
1199      int message = 0;
1200      pkg_t *old_pkg = NULL;
1201      pkg_vec_t *replacees;
1202      abstract_pkg_t *ab_pkg = NULL;
1203      int old_state_flag;
1204      char* file_md5;
1205 #ifdef HAVE_SHA256
1206      char* file_sha256;
1207 #endif
1208      sigset_t newset, oldset;
1209
1210      if ( from_upgrade ) 
1211         message = 1;            /* Coming from an upgrade, and should change the output message */
1212
1213      opkg_msg(DEBUG2, "Calling pkg_arch_supported.\n");
1214
1215      if (!pkg_arch_supported(pkg)) {
1216           opkg_msg(ERROR, "INTERNAL ERROR: architecture %s for pkg %s is unsupported.\n",
1217                        pkg->architecture, pkg->name);
1218           return -1;
1219      }
1220      if (pkg->state_status == SS_INSTALLED && conf->force_reinstall == 0 && conf->nodeps == 0) {
1221           err = satisfy_dependencies_for(pkg);
1222           if (err)
1223                   return -1;
1224
1225           opkg_msg(NOTICE, "Package %s is already installed on %s.\n", 
1226                        pkg->name, pkg->dest->name);
1227           return 0;
1228      }
1229
1230      if (pkg->dest == NULL) {
1231           pkg->dest = conf->default_dest;
1232      }
1233
1234      old_pkg = pkg_hash_fetch_installed_by_name(pkg->name);
1235
1236      err = opkg_install_check_downgrade(pkg, old_pkg, message);
1237      if (err)
1238              return -1;
1239
1240      pkg->state_want = SW_INSTALL;
1241      if (old_pkg){                          
1242          old_pkg->state_want = SW_DEINSTALL; /* needed for check_data_file_clashes of dependencies */
1243      }
1244
1245      err = check_conflicts_for(pkg);
1246      if (err)
1247              return -1;
1248     
1249      /* this setup is to remove the upgrade scenario in the end when
1250         installing pkg A, A deps B & B deps on A. So both B and A are
1251         installed. Then A's installation is started resulting in an
1252         uncecessary upgrade */ 
1253      if (pkg->state_status == SS_INSTALLED && conf->force_reinstall == 0)
1254              return 0;
1255     
1256      err = verify_pkg_installable(pkg);
1257      if (err)
1258              return -1;
1259
1260      if (pkg->local_filename == NULL) {
1261          if(!conf->cache && conf->download_only){
1262              char cwd[4096];
1263              if(getcwd(cwd, sizeof(cwd)) != NULL)
1264                 err = opkg_download_pkg(pkg, cwd);
1265              else
1266                 return -1;
1267          } else {
1268              err = opkg_download_pkg(pkg, conf->tmp_dir);
1269          }
1270           if (err) {
1271                opkg_msg(ERROR, "Failed to download %s. "
1272                                "Perhaps you need to run 'opkg update'?\n",
1273                             pkg->name);
1274                return -1;
1275           }
1276      }
1277
1278      /* check that the repository is valid */
1279      #if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
1280      char *list_file_name, *sig_file_name, *lists_dir;
1281
1282      /* check to ensure the package has come from a repository */
1283      if (conf->check_signature && pkg->src)
1284      {
1285        sprintf_alloc (&lists_dir, "%s",
1286                      (conf->restrict_to_default_dest)
1287                       ? conf->default_dest->lists_dir
1288                       : conf->lists_dir);
1289        sprintf_alloc (&list_file_name, "%s/%s", lists_dir, pkg->src->name);
1290        sprintf_alloc (&sig_file_name, "%s/%s.sig", lists_dir, pkg->src->name);
1291
1292        if (file_exists (sig_file_name))
1293        {
1294          if (opkg_verify_file (list_file_name, sig_file_name)){
1295            opkg_msg(ERROR, "Failed to verify the signature of %s.\n",
1296                            list_file_name);
1297            return -1;
1298          }
1299        }else{
1300          opkg_msg(ERROR, "Signature file is missing for %s. "
1301                          "Perhaps you need to run 'opkg update'?\n",
1302                          pkg->name);
1303          return -1;
1304        }
1305
1306        free (lists_dir);
1307        free (list_file_name);
1308        free (sig_file_name);
1309      }
1310      #endif
1311
1312      /* Check for md5 values */
1313      if (pkg->md5sum)
1314      {
1315          file_md5 = file_md5sum_alloc(pkg->local_filename);
1316          if (file_md5 && strcmp(file_md5, pkg->md5sum))
1317          {
1318               opkg_msg(ERROR, "Package %s md5sum mismatch. "
1319                         "Either the opkg or the package index are corrupt. "
1320                         "Try 'opkg update'.\n",
1321                         pkg->name);
1322               free(file_md5);
1323               return -1;
1324          }
1325          if (file_md5)
1326               free(file_md5);
1327      }
1328
1329 #ifdef HAVE_SHA256
1330      /* Check for sha256 value */
1331      if(pkg->sha256sum)
1332      {
1333          file_sha256 = file_sha256sum_alloc(pkg->local_filename);
1334          if (file_sha256 && strcmp(file_sha256, pkg->sha256sum))
1335          {
1336               opkg_msg(ERROR, "Package %s sha256sum mismatch. "
1337                         "Either the opkg or the package index are corrupt. "
1338                         "Try 'opkg update'.\n",
1339                         pkg->name);
1340               free(file_sha256);
1341               return -1;
1342          }
1343          if (file_sha256)
1344               free(file_sha256);
1345      }
1346 #endif
1347      if(conf->download_only) {
1348          if (conf->nodeps == 0) {
1349              err = satisfy_dependencies_for(pkg);
1350              if (err)
1351                  return -1;
1352          }
1353          return 0;
1354      }
1355
1356      if (pkg->tmp_unpack_dir == NULL) {
1357           if (unpack_pkg_control_files(pkg) == -1) {
1358                opkg_msg(ERROR, "Failed to unpack control files from %s.\n",
1359                                pkg->local_filename);
1360                return -1;
1361           }
1362      }
1363
1364      err = update_file_ownership(pkg, old_pkg);
1365      if (err)
1366              return -1;
1367
1368      if (conf->nodeps == 0) {
1369           err = satisfy_dependencies_for(pkg);
1370           if (err)
1371                 return -1;
1372           if (pkg->state_status == SS_UNPACKED)
1373                /* Circular dependency has installed it for us. */
1374                 return 0;
1375      }
1376
1377      replacees = pkg_vec_alloc();
1378      pkg_get_installed_replacees(pkg, replacees);
1379
1380      /* this next section we do with SIGINT blocked to prevent inconsistency between opkg database and filesystem */
1381
1382           sigemptyset(&newset);
1383           sigaddset(&newset, SIGINT);
1384           sigprocmask(SIG_BLOCK, &newset, &oldset);
1385
1386           opkg_state_changed++;
1387           pkg->state_flag |= SF_FILELIST_CHANGED;
1388
1389           if (old_pkg)
1390                pkg_remove_orphan_dependent(pkg, old_pkg);
1391
1392           /* XXX: BUG: we really should treat replacement more like an upgrade
1393            *      Instead, we're going to remove the replacees 
1394            */
1395           err = pkg_remove_installed_replacees(replacees);
1396           if (err)
1397                   goto UNWIND_REMOVE_INSTALLED_REPLACEES;
1398
1399           err = prerm_upgrade_old_pkg(pkg, old_pkg);
1400           if (err)
1401                   goto UNWIND_PRERM_UPGRADE_OLD_PKG;
1402
1403           err = prerm_deconfigure_conflictors(pkg, replacees);
1404           if (err)
1405                   goto UNWIND_PRERM_DECONFIGURE_CONFLICTORS;
1406
1407           err = preinst_configure(pkg, old_pkg);
1408           if (err)
1409                   goto UNWIND_PREINST_CONFIGURE;
1410
1411           err = backup_modified_conffiles(pkg, old_pkg);
1412           if (err)
1413                   goto UNWIND_BACKUP_MODIFIED_CONFFILES;
1414
1415           err = check_data_file_clashes(pkg, old_pkg);
1416           if (err)
1417                   goto UNWIND_CHECK_DATA_FILE_CLASHES;
1418
1419           err = postrm_upgrade_old_pkg(pkg, old_pkg);
1420           if (err)
1421                   goto UNWIND_POSTRM_UPGRADE_OLD_PKG;
1422
1423           if (conf->noaction)
1424                   return 0;
1425
1426           /* point of no return: no unwinding after this */
1427           if (old_pkg && !conf->force_reinstall) {
1428                old_pkg->state_want = SW_DEINSTALL;
1429
1430                if (old_pkg->state_flag & SF_NOPRUNE) {
1431                     opkg_msg(INFO, "Not removing obsolesced files because "
1432                                     "package %s marked noprune.\n",
1433                                     old_pkg->name);
1434                } else {
1435                     opkg_msg(INFO, "Removing obsolesced files for %s\n",
1436                                     old_pkg->name);
1437                     if (remove_obsolesced_files(pkg, old_pkg)) {
1438                         opkg_msg(ERROR, "Failed to determine "
1439                                         "obsolete files from previously "
1440                                         "installed %s\n", old_pkg->name);
1441                     }
1442                }
1443
1444                /* removing files from old package, to avoid ghost files */ 
1445                remove_data_files_and_list(old_pkg);
1446                remove_maintainer_scripts(old_pkg);
1447           }
1448
1449
1450           opkg_msg(INFO, "Installing maintainer scripts.\n");
1451           if (install_maintainer_scripts(pkg, old_pkg)) {
1452                 opkg_msg(ERROR, "Failed to extract maintainer scripts for %s."
1453                                " Package debris may remain!\n",
1454                                pkg->name);
1455                 goto pkg_is_hosed;
1456           }
1457
1458           /* the following just returns 0 */
1459           remove_disappeared(pkg);
1460
1461           opkg_msg(INFO, "Installing data files for %s.\n", pkg->name);
1462
1463           if (install_data_files(pkg)) {
1464                 opkg_msg(ERROR, "Failed to extract data files for %s. "
1465                                 "Package debris may remain!\n",
1466                                pkg->name);
1467                 goto pkg_is_hosed;
1468           }
1469
1470           err = check_data_file_clashes_change(pkg, old_pkg);
1471           if (err) {
1472                 opkg_msg(ERROR, "check_data_file_clashes_change() failed for "
1473                                "for files belonging to %s.\n",
1474                                pkg->name);
1475           }
1476
1477           opkg_msg(INFO, "Resolving conf files for %s\n", pkg->name);
1478           resolve_conffiles(pkg);
1479
1480           pkg->state_status = SS_UNPACKED;
1481           old_state_flag = pkg->state_flag;
1482           pkg->state_flag &= ~SF_PREFER;
1483           opkg_msg(DEBUG, "pkg=%s old_state_flag=%x state_flag=%x\n",
1484                           pkg->name, old_state_flag, pkg->state_flag);
1485
1486           if (old_pkg && !conf->force_reinstall) {
1487                old_pkg->state_status = SS_NOT_INSTALLED;
1488           }
1489
1490           time(&pkg->installed_time);
1491
1492           ab_pkg = pkg->parent;
1493           if (ab_pkg)
1494                ab_pkg->state_status = pkg->state_status;
1495
1496           sigprocmask(SIG_UNBLOCK, &newset, &oldset);
1497           pkg_vec_free (replacees);
1498           return 0;
1499      
1500
1501      UNWIND_POSTRM_UPGRADE_OLD_PKG:
1502           postrm_upgrade_old_pkg_unwind(pkg, old_pkg);
1503      UNWIND_CHECK_DATA_FILE_CLASHES:
1504           check_data_file_clashes_unwind(pkg, old_pkg);
1505      UNWIND_BACKUP_MODIFIED_CONFFILES:
1506           backup_modified_conffiles_unwind(pkg, old_pkg);
1507      UNWIND_PREINST_CONFIGURE:
1508           preinst_configure_unwind(pkg, old_pkg);
1509      UNWIND_PRERM_DECONFIGURE_CONFLICTORS:
1510           prerm_deconfigure_conflictors_unwind(pkg, replacees);
1511      UNWIND_PRERM_UPGRADE_OLD_PKG:
1512           prerm_upgrade_old_pkg_unwind(pkg, old_pkg);
1513      UNWIND_REMOVE_INSTALLED_REPLACEES:
1514           pkg_remove_installed_replacees_unwind(replacees);
1515
1516 pkg_is_hosed:
1517           sigprocmask(SIG_UNBLOCK, &newset, &oldset);
1518
1519           pkg_vec_free (replacees);
1520           return -1;
1521 }