Claim ownership of a file if the previous owner has obsoleted it.
[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           pkg_t *obs = hash_table_get(&conf->obs_file_hash, new_file);
160
161           opkg_msg(DEBUG2, "%s: new_pkg=%s wants file %s, from owner=%s\n",
162                 __func__, new_pkg->name, new_file, owner?owner->name:"<NULL>");
163
164           if (!owner || (owner == old_pkg) || obs)
165                file_hash_set_file_owner(new_file, new_pkg);
166      }
167
168      if (old_pkg) {
169           old_list = pkg_get_installed_files(old_pkg);
170           if (old_list == NULL) {
171                   pkg_free_installed_files(new_pkg);
172                   return -1;
173           }
174
175           for (iter = str_list_first(old_list), niter = str_list_next(old_list, iter); 
176                   iter; 
177                   iter = niter, niter = str_list_next(old_list, niter)) {
178                char *old_file = (char *)iter->data;
179                pkg_t *owner = file_hash_get_file_owner(old_file);
180                if (!owner || (owner == old_pkg)) {
181                     /* obsolete */
182                     hash_table_insert(&conf->obs_file_hash, old_file, old_pkg);
183                }
184           }
185           pkg_free_installed_files(old_pkg);
186      }
187      pkg_free_installed_files(new_pkg);
188      return 0;
189 }
190
191 static int
192 verify_pkg_installable(pkg_t *pkg)
193 {
194         unsigned long kbs_available, pkg_size_kbs;
195         char *root_dir;
196
197         if (conf->force_space || pkg->installed_size == 0)
198                 return 0;
199
200         root_dir = pkg->dest ? pkg->dest->root_dir :
201                                                 conf->default_dest->root_dir;
202         kbs_available = get_available_kbytes(root_dir);
203
204         pkg_size_kbs = (pkg->installed_size + 1023)/1024;
205
206         if (pkg_size_kbs >= kbs_available) {
207                 opkg_msg(ERROR, "Only have %dkb available on filesystem %s, "
208                         "pkg %s needs %d\n",
209                         kbs_available, root_dir, pkg->name, pkg_size_kbs);
210                 return -1;
211         }
212
213      return 0;
214 }
215
216 static int
217 unpack_pkg_control_files(pkg_t *pkg)
218 {
219      int err;
220      char *conffiles_file_name;
221      char *root_dir;
222      FILE *conffiles_file;
223
224      sprintf_alloc(&pkg->tmp_unpack_dir, "%s/%s-XXXXXX", conf->tmp_dir, pkg->name);
225
226      pkg->tmp_unpack_dir = mkdtemp(pkg->tmp_unpack_dir);
227      if (pkg->tmp_unpack_dir == NULL) {
228           opkg_perror(ERROR, "Failed to create temporary directory '%s'",
229                        pkg->tmp_unpack_dir);
230           return -1;
231      }
232
233      err = pkg_extract_control_files_to_dir(pkg, pkg->tmp_unpack_dir);
234      if (err) {
235           return err;
236      }
237
238      /* XXX: CLEANUP: There might be a cleaner place to read in the
239         conffiles. Seems like I should be able to get everything to go
240         through pkg_init_from_file. If so, maybe it would make sense to
241         move all of unpack_pkg_control_files to that function. */
242
243      /* Don't need to re-read conffiles if we already have it */
244      if (!nv_pair_list_empty(&pkg->conffiles)) {
245           return 0;
246      }
247
248      sprintf_alloc(&conffiles_file_name, "%s/conffiles", pkg->tmp_unpack_dir);
249      if (! file_exists(conffiles_file_name)) {
250           free(conffiles_file_name);
251           return 0;
252      }
253     
254      conffiles_file = fopen(conffiles_file_name, "r");
255      if (conffiles_file == NULL) {
256           opkg_perror(ERROR, "Failed to open %s", conffiles_file_name);
257           free(conffiles_file_name);
258           return -1;
259      }
260      free(conffiles_file_name);
261
262      while (1) {
263           char *cf_name;
264           char *cf_name_in_dest;
265
266           cf_name = file_read_line_alloc(conffiles_file);
267           if (cf_name == NULL) {
268                break;
269           }
270           if (cf_name[0] == '\0') {
271                continue;
272           }
273
274           /* Prepend dest->root_dir to conffile name.
275              Take pains to avoid multiple slashes. */
276           root_dir = pkg->dest->root_dir;
277           if (conf->offline_root)
278                /* skip the offline_root prefix */
279                root_dir = pkg->dest->root_dir + strlen(conf->offline_root);
280           sprintf_alloc(&cf_name_in_dest, "%s%s", root_dir,
281                         cf_name[0] == '/' ? (cf_name + 1) : cf_name);
282
283           /* Can't get an md5sum now, (file isn't extracted yet).
284              We'll wait until resolve_conffiles */
285           conffile_list_append(&pkg->conffiles, cf_name_in_dest, NULL);
286
287           free(cf_name);
288           free(cf_name_in_dest);
289      }
290
291      fclose(conffiles_file);
292
293      return 0;
294 }
295
296 /*
297  * Remove packages which were auto_installed due to a dependency by old_pkg,
298  * which are no longer a dependency in the new (upgraded) pkg.
299  */
300 static int
301 pkg_remove_orphan_dependent(pkg_t *pkg, pkg_t *old_pkg) 
302 {
303         int i, j, k, l, found,r, err = 0;
304         int n_deps;
305         pkg_t *p;
306         struct compound_depend *cd0, *cd1;
307         abstract_pkg_t **dependents;
308
309         int count0 = old_pkg->pre_depends_count +
310                                 old_pkg->depends_count +
311                                 old_pkg->recommends_count +
312                                 old_pkg->suggests_count;
313         int count1 = pkg->pre_depends_count +
314                                 pkg->depends_count +
315                                 pkg->recommends_count +
316                                 pkg->suggests_count;
317
318         for (i=0; i<count0; i++) {
319                 cd0 = &old_pkg->depends[i];
320                 if (cd0->type != DEPEND)
321                         continue;
322                 for (j=0; j<cd0->possibility_count; j++) {
323
324                         found = 0;
325
326                         for (k=0; k<count1; k++) {
327                                 cd1 = &pkg->depends[i];
328                                 if (cd1->type != DEPEND)
329                                         continue;
330                                 for (l=0; l<cd1->possibility_count; l++) {
331                                         if (cd0->possibilities[j]
332                                          == cd1->possibilities[l]) {
333                                                 found = 1;
334                                                 break;
335                                         }
336                                 }
337                                 if (found)
338                                         break;
339                         }
340
341                         if (found)
342                                 continue;
343
344                         /*
345                          * old_pkg has a dependency that pkg does not.
346                          */
347                         p = pkg_hash_fetch_installed_by_name(
348                                         cd0->possibilities[j]->pkg->name);
349
350                         if (!p)
351                                 continue;
352
353                         if (!p->auto_installed)
354                                 continue;
355
356                         n_deps = pkg_has_installed_dependents(p, &dependents);
357                         n_deps--; /* don't count old_pkg */
358
359                         if (n_deps == 0) {
360                                 opkg_msg(NOTICE, "%s was autoinstalled and is "
361                                                 "now orphaned, removing.\n",
362                                                 p->name);
363
364                                 /* p has one installed dependency (old_pkg),
365                                  * which we need to ignore during removal. */
366                                 p->state_flag |= SF_REPLACE;
367
368                                 r = opkg_remove_pkg(p, 0);
369                                 if (!err)
370                                         err = r;
371                         } else 
372                                 opkg_msg(INFO, "%s was autoinstalled and is "
373                                                 "still required by %d "
374                                                 "installed packages.\n",
375                                                 p->name, n_deps);
376
377                 }
378         }
379
380         return err;
381 }
382
383 /* returns number of installed replacees */
384 static int
385 pkg_get_installed_replacees(pkg_t *pkg, pkg_vec_t *installed_replacees)
386 {
387      abstract_pkg_t **replaces = pkg->replaces;
388      int replaces_count = pkg->replaces_count;
389      int i, j;
390      for (i = 0; i < replaces_count; i++) {
391           abstract_pkg_t *ab_pkg = replaces[i];
392           pkg_vec_t *pkg_vec = ab_pkg->pkgs;
393           if (pkg_vec) {
394                for (j = 0; j < pkg_vec->len; j++) {
395                     pkg_t *replacee = pkg_vec->pkgs[j];
396                     if (!pkg_conflicts(pkg, replacee))
397                          continue;
398                     if (replacee->state_status == SS_INSTALLED) {
399                          pkg_vec_insert(installed_replacees, replacee);
400                     }
401                }
402           }
403      }
404      return installed_replacees->len;
405 }
406
407 static int
408 pkg_remove_installed_replacees(pkg_vec_t *replacees)
409 {
410      int i;
411      int replaces_count = replacees->len;
412      for (i = 0; i < replaces_count; i++) {
413           pkg_t *replacee = replacees->pkgs[i];
414           int err;
415           replacee->state_flag |= SF_REPLACE; /* flag it so remove won't complain */
416           err = opkg_remove_pkg(replacee, 0);
417           if (err)
418                return err;
419      }
420      return 0;
421 }
422
423 /* to unwind the removal: make sure they are installed */
424 static int
425 pkg_remove_installed_replacees_unwind(pkg_vec_t *replacees)
426 {
427      int i, err;
428      int replaces_count = replacees->len;
429      for (i = 0; i < replaces_count; i++) {
430           pkg_t *replacee = replacees->pkgs[i];
431           if (replacee->state_status != SS_INSTALLED) {
432                opkg_msg(DEBUG2, "Calling opkg_install_pkg.\n");
433                err = opkg_install_pkg(replacee, 0);
434                if (err)
435                     return err;
436           }
437      }
438      return 0;
439 }
440
441 /* compares versions of pkg and old_pkg, returns 0 if OK to proceed with installation of pkg, 1 otherwise */
442 static int
443 opkg_install_check_downgrade(pkg_t *pkg, pkg_t *old_pkg, int message)
444 {         
445      if (old_pkg) {
446           char message_out[15];
447           char *old_version = pkg_version_str_alloc(old_pkg);
448           char *new_version = pkg_version_str_alloc(pkg);
449           int cmp = pkg_compare_versions(old_pkg, pkg);
450           int rc = 0;
451
452           memset(message_out,'\x0',15);
453           strncpy (message_out,"Upgrading ",strlen("Upgrading ")); 
454           if ( (conf->force_downgrade==1) && (cmp > 0) ){     /* We've been asked to allow downgrade  and version is precedent */
455              cmp = -1 ;                                       /* then we force opkg to downgrade */ 
456              strncpy (message_out,"Downgrading ",strlen("Downgrading "));         /* We need to use a value < 0 because in the 0 case we are asking to */
457                                                               /* reinstall, and some check could fail asking the "force-reinstall" option */
458           } 
459
460           if (cmp > 0) {
461               if(!conf->download_only)
462                   opkg_msg(NOTICE,
463                           "Not downgrading package %s on %s from %s to %s.\n",
464                           old_pkg->name, old_pkg->dest->name, old_version, new_version);
465                rc = 1;
466           } else if (cmp < 0) {
467               if(!conf->download_only)
468                   opkg_msg(NOTICE, "%s%s on %s from %s to %s...\n",
469                           message_out, pkg->name, old_pkg->dest->name, old_version, new_version);
470                pkg->dest = old_pkg->dest;
471                rc = 0;
472           } else /* cmp == 0 */ {
473                if (conf->force_reinstall) {
474                if(!conf->download_only)
475                    opkg_msg(NOTICE, "Reinstalling %s (%s) on %s...\n",
476                            pkg->name, new_version, old_pkg->dest->name);
477                     pkg->dest = old_pkg->dest;
478                     rc = 0;
479                } else {
480                    if(!conf->download_only)
481                        opkg_msg(NOTICE, "%s (%s) already install on %s."
482                                " Not reinstalling.\n",
483                                pkg->name, new_version, old_pkg->dest->name);
484                     rc = 1;
485                }
486           } 
487           free(old_version);
488           free(new_version);
489           return rc;
490      } else {
491           char message_out[15] ;
492           memset(message_out,'\x0',15);
493           if ( message ) 
494                strncpy( message_out,"Upgrading ",strlen("Upgrading ") );
495           else
496                strncpy( message_out,"Installing ",strlen("Installing ") );
497           char *version = pkg_version_str_alloc(pkg);
498
499           if(!conf->download_only)
500                opkg_msg(NOTICE, "%s%s (%s) to %s...\n", message_out,
501                   pkg->name, version, pkg->dest->name);
502           free(version);
503      }
504      return 0;
505 }
506
507
508 static int
509 prerm_upgrade_old_pkg(pkg_t *pkg, pkg_t *old_pkg)
510 {
511      /* DPKG_INCOMPATIBILITY:
512         dpkg does some things here that we don't do yet. Do we care?
513         
514         1. If a version of the package is already installed, call
515            old-prerm upgrade new-version
516         2. If the script runs but exits with a non-zero exit status
517            new-prerm failed-upgrade old-version
518            Error unwind, for both the above cases:
519            old-postinst abort-upgrade new-version
520      */
521      return 0;
522 }
523
524 static int
525 prerm_upgrade_old_pkg_unwind(pkg_t *pkg, pkg_t *old_pkg)
526 {
527      /* DPKG_INCOMPATIBILITY:
528         dpkg does some things here that we don't do yet. Do we care?
529         (See prerm_upgrade_old_package for details)
530      */
531      return 0;
532 }
533
534 static int
535 prerm_deconfigure_conflictors(pkg_t *pkg, pkg_vec_t *conflictors)
536 {
537      /* DPKG_INCOMPATIBILITY:
538         dpkg does some things here that we don't do yet. Do we care?
539         2. If a 'conflicting' package is being removed at the same time:
540                 1. If any packages depended on that conflicting package and
541                    --auto-deconfigure is specified, call, for each such package:
542                    deconfigured's-prerm deconfigure \
543                    in-favour package-being-installed version \
544                    removing conflicting-package version
545                 Error unwind:
546                    deconfigured's-postinst abort-deconfigure \
547                    in-favour package-being-installed-but-failed version \
548                    removing conflicting-package version
549
550                    The deconfigured packages are marked as requiring
551                    configuration, so that if --install is used they will be
552                    configured again if possible.
553                 2. To prepare for removal of the conflicting package, call:
554                    conflictor's-prerm remove in-favour package new-version
555                 Error unwind:
556                    conflictor's-postinst abort-remove in-favour package new-version
557      */
558      return 0;
559 }
560
561 static int
562 prerm_deconfigure_conflictors_unwind(pkg_t *pkg, pkg_vec_t *conflictors)
563 {
564      /* DPKG_INCOMPATIBILITY: dpkg does some things here that we don't
565         do yet. Do we care?  (See prerm_deconfigure_conflictors for
566         details) */
567      return 0;
568 }
569
570 static int
571 preinst_configure(pkg_t *pkg, pkg_t *old_pkg)
572 {
573      int err;
574      char *preinst_args;
575
576      if (old_pkg) {
577           char *old_version = pkg_version_str_alloc(old_pkg);
578           sprintf_alloc(&preinst_args, "upgrade %s", old_version);
579           free(old_version);
580      } else if (pkg->state_status == SS_CONFIG_FILES) {
581           char *pkg_version = pkg_version_str_alloc(pkg);
582           sprintf_alloc(&preinst_args, "install %s", pkg_version);
583           free(pkg_version);
584      } else {
585           preinst_args = xstrdup("install");
586      }
587
588      err = pkg_run_script(pkg, "preinst", preinst_args);
589      if (err) {
590           opkg_msg(ERROR, "Aborting installation of %s.\n", pkg->name);
591           return -1;
592      }
593
594      free(preinst_args);
595
596      return 0;
597 }
598
599 static int
600 preinst_configure_unwind(pkg_t *pkg, pkg_t *old_pkg)
601 {
602      /* DPKG_INCOMPATIBILITY:
603         dpkg does the following error unwind, should we?
604         pkg->postrm abort-upgrade old-version
605         OR pkg->postrm abort-install old-version
606         OR pkg->postrm abort-install
607      */
608      return 0;
609 }
610
611 static char *
612 backup_filename_alloc(const char *file_name)
613 {
614      char *backup;
615
616      sprintf_alloc(&backup, "%s%s", file_name, OPKG_BACKUP_SUFFIX);
617
618      return backup;
619 }
620
621
622 static int
623 backup_make_backup(const char *file_name)
624 {
625      int err;
626      char *backup;
627     
628      backup = backup_filename_alloc(file_name);
629      err = file_copy(file_name, backup);
630      if (err) {
631           opkg_msg(ERROR, "Failed to copy %s to %s\n",
632                        file_name, backup);
633      }
634
635      free(backup);
636
637      return err;
638 }
639
640 static int
641 backup_exists_for(const char *file_name)
642 {
643      int ret;
644      char *backup;
645
646      backup = backup_filename_alloc(file_name);
647
648      ret = file_exists(backup);
649
650      free(backup);
651
652      return ret;
653 }
654
655 static int
656 backup_remove(const char *file_name)
657 {
658      char *backup;
659
660      backup = backup_filename_alloc(file_name);
661      unlink(backup);
662      free(backup);
663
664      return 0;
665 }
666
667 static int
668 backup_modified_conffiles(pkg_t *pkg, pkg_t *old_pkg)
669 {
670      int err;
671      conffile_list_elt_t *iter;
672      conffile_t *cf;
673
674      if (conf->noaction) return 0;
675
676      /* Backup all modified conffiles */
677      if (old_pkg) {
678           for (iter = nv_pair_list_first(&old_pkg->conffiles); iter; iter = nv_pair_list_next(&old_pkg->conffiles, iter)) {
679                char *cf_name;
680                
681                cf = iter->data;
682                cf_name = root_filename_alloc(cf->name);
683
684                /* Don't worry if the conffile is just plain gone */
685                if (file_exists(cf_name) && conffile_has_been_modified(cf)) {
686                     err = backup_make_backup(cf_name);
687                     if (err) {
688                          return err;
689                     }
690                }
691                free(cf_name);
692           }
693      }
694
695      /* Backup all conffiles that were not conffiles in old_pkg */
696      for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
697           char *cf_name;
698           cf = (conffile_t *)iter->data;
699           cf_name = root_filename_alloc(cf->name);
700           /* Ignore if this was a conffile in old_pkg as well */
701           if (pkg_get_conffile(old_pkg, cf->name)) {
702                continue;
703           }
704
705           if (file_exists(cf_name) && (! backup_exists_for(cf_name))) {
706                err = backup_make_backup(cf_name);
707                if (err) {
708                     return err;
709                }
710           }
711           free(cf_name);
712      }
713
714      return 0;
715 }
716
717 static int
718 backup_modified_conffiles_unwind(pkg_t *pkg, pkg_t *old_pkg)
719 {
720      conffile_list_elt_t *iter;
721
722      if (old_pkg) {
723           for (iter = nv_pair_list_first(&old_pkg->conffiles); iter; iter = nv_pair_list_next(&old_pkg->conffiles, iter)) {
724                backup_remove(((nv_pair_t *)iter->data)->name);
725           }
726      }
727
728      for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) {
729           backup_remove(((nv_pair_t *)iter->data)->name);
730      }
731
732      return 0;
733 }
734
735
736 static int
737 check_data_file_clashes(pkg_t *pkg, pkg_t *old_pkg)
738 {
739      /* DPKG_INCOMPATIBILITY:
740         opkg takes a slightly different approach than dpkg at this
741         point.  dpkg installs each file in the new package while
742         creating a backup for any file that is replaced, (so that it
743         can unwind if necessary).  To avoid complexity and redundant
744         storage, opkg doesn't do any installation until later, (at the
745         point at which dpkg removes the backups.
746         
747         But, we do have to check for data file clashes, since after
748         installing a package with a file clash, removing either of the
749         packages involved in the clash has the potential to break the
750         other package.
751      */
752      str_list_t *files_list;
753      str_list_elt_t *iter, *niter;
754      char *filename;
755      int clashes = 0;
756
757      files_list = pkg_get_installed_files(pkg);
758      if (files_list == NULL)
759              return -1;
760
761      for (iter = str_list_first(files_list), niter = str_list_next(files_list, iter); 
762              iter; 
763              iter = niter, niter = str_list_next(files_list, iter)) {
764           filename = (char *) iter->data;
765           if (file_exists(filename) && (! file_is_dir(filename))) {
766                pkg_t *owner;
767                pkg_t *obs;
768
769                if (backup_exists_for(filename)) {
770                     continue;
771                }
772
773                /* Pre-existing files are OK if force-overwrite was asserted. */ 
774                if (conf->force_overwrite) {
775                     /* but we need to change who owns this file */
776                     file_hash_set_file_owner(filename, pkg);
777                     continue;
778                }
779
780                owner = file_hash_get_file_owner(filename);
781
782                /* Pre-existing files are OK if owned by the pkg being upgraded. */
783                if (owner && old_pkg) {
784                     if (strcmp(owner->name, old_pkg->name) == 0) {
785                          continue;
786                     }
787                }
788
789                /* Pre-existing files are OK if owned by a package replaced by new pkg. */
790                if (owner) {
791                     opkg_msg(DEBUG2, "Checking replaces for %s in package %s\n",
792                                 filename, owner->name);
793                     if (pkg_replaces(pkg, owner)) {
794                          continue;
795                     }
796 /* If the file that would be installed is owned by the same package, ( as per a reinstall or similar )
797    then it's ok to overwrite. */
798                     if (strcmp(owner->name,pkg->name)==0){
799                          opkg_msg(INFO, "Replacing pre-existing file %s"
800                                         " owned by package %s\n",
801                                         filename, owner->name);
802                          continue;
803                     }
804                }
805
806                /* Pre-existing files are OK if they are obsolete */
807                obs = hash_table_get(&conf->obs_file_hash, filename);
808                if (obs) {
809                     opkg_msg(INFO, "Pre-exiting file %s is obsolete."
810                                    " obs_pkg=%s\n",
811                                     filename, obs->name);
812                     continue;
813                }
814
815                /* We have found a clash. */
816                opkg_msg(ERROR, "Package %s wants to install file %s\n"
817                             "\tBut that file is already provided by package ",
818                             pkg->name, filename);
819                if (owner) {
820                     opkg_message(ERROR, "%s\n", owner->name);
821                } else {
822                     opkg_message(ERROR, "<no package>\n"
823                         "Please move this file out of the way and try again.\n");
824                }
825                clashes++;
826           }
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(NOTICE, "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(ERROR, "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         opkg_msg(NOTICE, "Unknown package '%s'.\n", pkg_name);
1143         return -1;
1144      }
1145
1146      opkg_msg(DEBUG2, "Versions from pkg_hash_fetch:");
1147      if ( old ) 
1148         opkg_msg(DEBUG2, " old %s ", old->version);
1149      opkg_msg(DEBUG2, " new %s\n", new->version);
1150
1151      new->state_flag |= SF_USER;
1152      if (old) {
1153           old_version = pkg_version_str_alloc(old);
1154           new_version = pkg_version_str_alloc(new);
1155
1156           cmp = pkg_compare_versions(old, new);
1157           if ( (conf->force_downgrade==1) && (cmp > 0) ){     /* We've been asked to allow downgrade  and version is precedent */
1158              opkg_msg(DEBUG, "Forcing downgrade\n");
1159              cmp = -1 ;                                       /* then we force opkg to downgrade */ 
1160                                                               /* We need to use a value < 0 because in the 0 case we are asking to */
1161                                                               /* reinstall, and some check could fail asking the "force-reinstall" option */
1162           } 
1163           opkg_msg(DEBUG, "Comparing visible versions of pkg %s:"
1164                        "\n\t%s is installed "
1165                        "\n\t%s is available "
1166                        "\n\t%d was comparison result\n",
1167                        pkg_name, old_version, new_version, cmp);
1168           if (cmp == 0 && !conf->force_reinstall) {
1169                opkg_msg(NOTICE,
1170                             "Package %s (%s) installed in %s is up to date.\n",
1171                             old->name, old_version, old->dest->name);
1172                free(old_version);
1173                free(new_version);
1174                return 0;
1175           } else if (cmp > 0) {
1176                opkg_msg(NOTICE,
1177                             "Not downgrading package %s on %s from %s to %s.\n",
1178                             old->name, old->dest->name, old_version, new_version);
1179                free(old_version);
1180                free(new_version);
1181                return 0;
1182           } else if (cmp < 0) {
1183                new->dest = old->dest;
1184                old->state_want = SW_DEINSTALL;    /* Here probably the problem for bug 1277 */
1185           }
1186           free(old_version);
1187           free(new_version);
1188      }
1189
1190      opkg_msg(DEBUG2,"Calling opkg_install_pkg.\n");
1191      return opkg_install_pkg(new, 0);
1192 }
1193
1194 /**
1195  *  @brief Really install a pkg_t 
1196  */
1197 int
1198 opkg_install_pkg(pkg_t *pkg, int from_upgrade)
1199 {
1200      int err = 0;
1201      int message = 0;
1202      pkg_t *old_pkg = NULL;
1203      pkg_vec_t *replacees;
1204      abstract_pkg_t *ab_pkg = NULL;
1205      int old_state_flag;
1206      char* file_md5;
1207 #ifdef HAVE_SHA256
1208      char* file_sha256;
1209 #endif
1210      sigset_t newset, oldset;
1211
1212      if ( from_upgrade ) 
1213         message = 1;            /* Coming from an upgrade, and should change the output message */
1214
1215      opkg_msg(DEBUG2, "Calling pkg_arch_supported.\n");
1216
1217      if (!pkg_arch_supported(pkg)) {
1218           opkg_msg(ERROR, "INTERNAL ERROR: architecture %s for pkg %s is unsupported.\n",
1219                        pkg->architecture, pkg->name);
1220           return -1;
1221      }
1222      if (pkg->state_status == SS_INSTALLED && conf->force_reinstall == 0 && conf->nodeps == 0) {
1223           err = satisfy_dependencies_for(pkg);
1224           if (err)
1225                   return -1;
1226
1227           opkg_msg(NOTICE, "Package %s is already installed on %s.\n", 
1228                        pkg->name, pkg->dest->name);
1229           return 0;
1230      }
1231
1232      if (pkg->dest == NULL) {
1233           pkg->dest = conf->default_dest;
1234      }
1235
1236      old_pkg = pkg_hash_fetch_installed_by_name(pkg->name);
1237
1238      err = opkg_install_check_downgrade(pkg, old_pkg, message);
1239      if (err)
1240              return -1;
1241
1242      pkg->state_want = SW_INSTALL;
1243      if (old_pkg){                          
1244          old_pkg->state_want = SW_DEINSTALL; /* needed for check_data_file_clashes of dependencies */
1245      }
1246
1247      err = check_conflicts_for(pkg);
1248      if (err)
1249              return -1;
1250     
1251      /* this setup is to remove the upgrade scenario in the end when
1252         installing pkg A, A deps B & B deps on A. So both B and A are
1253         installed. Then A's installation is started resulting in an
1254         uncecessary upgrade */ 
1255      if (pkg->state_status == SS_INSTALLED && conf->force_reinstall == 0)
1256              return 0;
1257     
1258      err = verify_pkg_installable(pkg);
1259      if (err)
1260              return -1;
1261
1262      if (pkg->local_filename == NULL) {
1263          if(!conf->cache && conf->download_only){
1264              char cwd[4096];
1265              if(getcwd(cwd, sizeof(cwd)) != NULL)
1266                 err = opkg_download_pkg(pkg, cwd);
1267              else
1268                 return -1;
1269          } else {
1270              err = opkg_download_pkg(pkg, conf->tmp_dir);
1271          }
1272           if (err) {
1273                opkg_msg(ERROR, "Failed to download %s. "
1274                                "Perhaps you need to run 'opkg update'?\n",
1275                             pkg->name);
1276                return -1;
1277           }
1278      }
1279
1280      /* check that the repository is valid */
1281      #if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
1282      char *list_file_name, *sig_file_name, *lists_dir;
1283
1284      /* check to ensure the package has come from a repository */
1285      if (conf->check_signature && pkg->src)
1286      {
1287        sprintf_alloc (&lists_dir, "%s",
1288                      (conf->restrict_to_default_dest)
1289                       ? conf->default_dest->lists_dir
1290                       : conf->lists_dir);
1291        sprintf_alloc (&list_file_name, "%s/%s", lists_dir, pkg->src->name);
1292        sprintf_alloc (&sig_file_name, "%s/%s.sig", lists_dir, pkg->src->name);
1293
1294        if (file_exists (sig_file_name))
1295        {
1296          if (opkg_verify_file (list_file_name, sig_file_name)){
1297            opkg_msg(ERROR, "Failed to verify the signature of %s.\n",
1298                            list_file_name);
1299            return -1;
1300          }
1301        }else{
1302          opkg_msg(ERROR, "Signature file is missing for %s. "
1303                          "Perhaps you need to run 'opkg update'?\n",
1304                          pkg->name);
1305          return -1;
1306        }
1307
1308        free (lists_dir);
1309        free (list_file_name);
1310        free (sig_file_name);
1311      }
1312      #endif
1313
1314      /* Check for md5 values */
1315      if (pkg->md5sum)
1316      {
1317          file_md5 = file_md5sum_alloc(pkg->local_filename);
1318          if (file_md5 && strcmp(file_md5, pkg->md5sum))
1319          {
1320               opkg_msg(ERROR, "Package %s md5sum mismatch. "
1321                         "Either the opkg or the package index are corrupt. "
1322                         "Try 'opkg update'.\n",
1323                         pkg->name);
1324               free(file_md5);
1325               return -1;
1326          }
1327          if (file_md5)
1328               free(file_md5);
1329      }
1330
1331 #ifdef HAVE_SHA256
1332      /* Check for sha256 value */
1333      if(pkg->sha256sum)
1334      {
1335          file_sha256 = file_sha256sum_alloc(pkg->local_filename);
1336          if (file_sha256 && strcmp(file_sha256, pkg->sha256sum))
1337          {
1338               opkg_msg(ERROR, "Package %s sha256sum mismatch. "
1339                         "Either the opkg or the package index are corrupt. "
1340                         "Try 'opkg update'.\n",
1341                         pkg->name);
1342               free(file_sha256);
1343               return -1;
1344          }
1345          if (file_sha256)
1346               free(file_sha256);
1347      }
1348 #endif
1349      if(conf->download_only) {
1350          if (conf->nodeps == 0) {
1351              err = satisfy_dependencies_for(pkg);
1352              if (err)
1353                  return -1;
1354          }
1355          return 0;
1356      }
1357
1358      if (pkg->tmp_unpack_dir == NULL) {
1359           if (unpack_pkg_control_files(pkg) == -1) {
1360                opkg_msg(ERROR, "Failed to unpack control files from %s.\n",
1361                                pkg->local_filename);
1362                return -1;
1363           }
1364      }
1365
1366      err = update_file_ownership(pkg, old_pkg);
1367      if (err)
1368              return -1;
1369
1370      if (conf->nodeps == 0) {
1371           err = satisfy_dependencies_for(pkg);
1372           if (err)
1373                 return -1;
1374           if (pkg->state_status == SS_UNPACKED)
1375                /* Circular dependency has installed it for us. */
1376                 return 0;
1377      }
1378
1379      replacees = pkg_vec_alloc();
1380      pkg_get_installed_replacees(pkg, replacees);
1381
1382      /* this next section we do with SIGINT blocked to prevent inconsistency between opkg database and filesystem */
1383
1384           sigemptyset(&newset);
1385           sigaddset(&newset, SIGINT);
1386           sigprocmask(SIG_BLOCK, &newset, &oldset);
1387
1388           opkg_state_changed++;
1389           pkg->state_flag |= SF_FILELIST_CHANGED;
1390
1391           if (old_pkg)
1392                pkg_remove_orphan_dependent(pkg, old_pkg);
1393
1394           /* XXX: BUG: we really should treat replacement more like an upgrade
1395            *      Instead, we're going to remove the replacees 
1396            */
1397           err = pkg_remove_installed_replacees(replacees);
1398           if (err)
1399                   goto UNWIND_REMOVE_INSTALLED_REPLACEES;
1400
1401           err = prerm_upgrade_old_pkg(pkg, old_pkg);
1402           if (err)
1403                   goto UNWIND_PRERM_UPGRADE_OLD_PKG;
1404
1405           err = prerm_deconfigure_conflictors(pkg, replacees);
1406           if (err)
1407                   goto UNWIND_PRERM_DECONFIGURE_CONFLICTORS;
1408
1409           err = preinst_configure(pkg, old_pkg);
1410           if (err)
1411                   goto UNWIND_PREINST_CONFIGURE;
1412
1413           err = backup_modified_conffiles(pkg, old_pkg);
1414           if (err)
1415                   goto UNWIND_BACKUP_MODIFIED_CONFFILES;
1416
1417           err = check_data_file_clashes(pkg, old_pkg);
1418           if (err)
1419                   goto UNWIND_CHECK_DATA_FILE_CLASHES;
1420
1421           err = postrm_upgrade_old_pkg(pkg, old_pkg);
1422           if (err)
1423                   goto UNWIND_POSTRM_UPGRADE_OLD_PKG;
1424
1425           if (conf->noaction)
1426                   return 0;
1427
1428           /* point of no return: no unwinding after this */
1429           if (old_pkg && !conf->force_reinstall) {
1430                old_pkg->state_want = SW_DEINSTALL;
1431
1432                if (old_pkg->state_flag & SF_NOPRUNE) {
1433                     opkg_msg(INFO, "Not removing obsolesced files because "
1434                                     "package %s marked noprune.\n",
1435                                     old_pkg->name);
1436                } else {
1437                     opkg_msg(INFO, "Removing obsolesced files for %s\n",
1438                                     old_pkg->name);
1439                     if (remove_obsolesced_files(pkg, old_pkg)) {
1440                         opkg_msg(ERROR, "Failed to determine "
1441                                         "obsolete files from previously "
1442                                         "installed %s\n", old_pkg->name);
1443                     }
1444                }
1445
1446                /* removing files from old package, to avoid ghost files */ 
1447                remove_data_files_and_list(old_pkg);
1448                remove_maintainer_scripts(old_pkg);
1449           }
1450
1451
1452           opkg_msg(INFO, "Installing maintainer scripts.\n");
1453           if (install_maintainer_scripts(pkg, old_pkg)) {
1454                 opkg_msg(ERROR, "Failed to extract maintainer scripts for %s."
1455                                " Package debris may remain!\n",
1456                                pkg->name);
1457                 goto pkg_is_hosed;
1458           }
1459
1460           /* the following just returns 0 */
1461           remove_disappeared(pkg);
1462
1463           opkg_msg(INFO, "Installing data files for %s.\n", pkg->name);
1464
1465           if (install_data_files(pkg)) {
1466                 opkg_msg(ERROR, "Failed to extract data files for %s. "
1467                                 "Package debris may remain!\n",
1468                                pkg->name);
1469                 goto pkg_is_hosed;
1470           }
1471
1472           err = check_data_file_clashes_change(pkg, old_pkg);
1473           if (err) {
1474                 opkg_msg(ERROR, "check_data_file_clashes_change() failed for "
1475                                "for files belonging to %s.\n",
1476                                pkg->name);
1477           }
1478
1479           opkg_msg(INFO, "Resolving conf files for %s\n", pkg->name);
1480           resolve_conffiles(pkg);
1481
1482           pkg->state_status = SS_UNPACKED;
1483           old_state_flag = pkg->state_flag;
1484           pkg->state_flag &= ~SF_PREFER;
1485           opkg_msg(DEBUG, "pkg=%s old_state_flag=%x state_flag=%x\n",
1486                           pkg->name, old_state_flag, pkg->state_flag);
1487
1488           if (old_pkg && !conf->force_reinstall) {
1489                old_pkg->state_status = SS_NOT_INSTALLED;
1490           }
1491
1492           time(&pkg->installed_time);
1493
1494           ab_pkg = pkg->parent;
1495           if (ab_pkg)
1496                ab_pkg->state_status = pkg->state_status;
1497
1498           sigprocmask(SIG_UNBLOCK, &newset, &oldset);
1499           pkg_vec_free (replacees);
1500           return 0;
1501      
1502
1503      UNWIND_POSTRM_UPGRADE_OLD_PKG:
1504           postrm_upgrade_old_pkg_unwind(pkg, old_pkg);
1505      UNWIND_CHECK_DATA_FILE_CLASHES:
1506           check_data_file_clashes_unwind(pkg, old_pkg);
1507      UNWIND_BACKUP_MODIFIED_CONFFILES:
1508           backup_modified_conffiles_unwind(pkg, old_pkg);
1509      UNWIND_PREINST_CONFIGURE:
1510           preinst_configure_unwind(pkg, old_pkg);
1511      UNWIND_PRERM_DECONFIGURE_CONFLICTORS:
1512           prerm_deconfigure_conflictors_unwind(pkg, replacees);
1513      UNWIND_PRERM_UPGRADE_OLD_PKG:
1514           prerm_upgrade_old_pkg_unwind(pkg, old_pkg);
1515      UNWIND_REMOVE_INSTALLED_REPLACEES:
1516           pkg_remove_installed_replacees_unwind(replacees);
1517
1518 pkg_is_hosed:
1519           sigprocmask(SIG_UNBLOCK, &newset, &oldset);
1520
1521           pkg_vec_free (replacees);
1522           return -1;
1523 }