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