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