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