Remove remaining uses of pkg->*_str arrays and free() them after parsing.
[oweals/opkg-lede.git] / libopkg / pkg.c
index c41629cb13d10e196ce5272cb44daeb64378ed4f..bba04ff75f95aae85079c85025146a81cc9807a6 100644 (file)
@@ -203,21 +203,6 @@ void pkg_deinit(pkg_t *pkg)
                free (pkg->replaces);
        pkg->replaces = NULL;
 
-       for (i = 0; i < pkg->depends_count; i++)
-               free (pkg->depends_str[i]);
-       free(pkg->depends_str);
-       pkg->depends_str = NULL;
-
-       for (i = 0; i < pkg->recommends_count; i++)
-               free (pkg->recommends_str[i]);
-       free(pkg->recommends_str);
-       pkg->recommends_str = NULL;
-
-       for (i = 0; i < pkg->suggests_count; i++)
-               free (pkg->suggests_str[i]);
-       free(pkg->suggests_str);
-       pkg->suggests_str = NULL;
-
        if (pkg->depends) {
                int count = pkg->pre_depends_count
                                + pkg->depends_count
@@ -239,10 +224,6 @@ void pkg_deinit(pkg_t *pkg)
                free (pkg->provides);
 
        pkg->pre_depends_count = 0;
-       if (pkg->pre_depends_str)
-               free(pkg->pre_depends_str);
-       pkg->pre_depends_str = NULL;
-       
        pkg->provides_count = 0;
        
        if (pkg->filename)
@@ -301,7 +282,7 @@ void pkg_deinit(pkg_t *pkg)
 }
 
 int
-pkg_init_from_file(pkg_t *pkg, const char *filename)
+pkg_init_from_file(opkg_conf_t *conf, pkg_t *pkg, const char *filename)
 {
        int fd, err = 0;
        FILE *control_file;
@@ -311,7 +292,9 @@ pkg_init_from_file(pkg_t *pkg, const char *filename)
 
        pkg->local_filename = xstrdup(filename);
 
-       sprintf_alloc(&control_path, "%s.control.XXXXXX", filename);
+       sprintf_alloc(&control_path, "%s/%s.control.XXXXXX", 
+                        conf->tmp_dir,
+                        basename(filename));
        fd = mkstemp(control_path);
        if (fd == -1) {
                perror_msg("%s: mkstemp(%s)", __FUNCTION__, control_path);
@@ -319,7 +302,7 @@ pkg_init_from_file(pkg_t *pkg, const char *filename)
                goto err0;
        }
 
-       control_file = fdopen(fd, "rw+");
+       control_file = fdopen(fd, "r+");
        if (control_file == NULL) {
                perror_msg("%s: fdopen", __FUNCTION__, control_path);
                close(fd);
@@ -358,6 +341,9 @@ int pkg_merge(pkg_t *oldpkg, pkg_t *newpkg, int set_status)
          return 0;
      }
 
+     if (!oldpkg->auto_installed)
+         oldpkg->auto_installed = newpkg->auto_installed;
+
      if (!oldpkg->src)
          oldpkg->src = newpkg->src;
      if (!oldpkg->dest)
@@ -385,27 +371,19 @@ int pkg_merge(pkg_t *oldpkg, pkg_t *newpkg, int set_status)
          oldpkg->state_flag |= newpkg->state_flag;
      }
 
-     if (!oldpkg->depends_str && !oldpkg->pre_depends_str && !oldpkg->recommends_str && !oldpkg->suggests_str) {
-         oldpkg->depends_str = newpkg->depends_str;
-         newpkg->depends_str = NULL;
+     if (!oldpkg->depends_count && !oldpkg->pre_depends_count && !oldpkg->recommends_count && !oldpkg->suggests_count) {
          oldpkg->depends_count = newpkg->depends_count;
          newpkg->depends_count = 0;
 
          oldpkg->depends = newpkg->depends;
          newpkg->depends = NULL;
 
-         oldpkg->pre_depends_str = newpkg->pre_depends_str;
-         newpkg->pre_depends_str = NULL;
          oldpkg->pre_depends_count = newpkg->pre_depends_count;
          newpkg->pre_depends_count = 0;
 
-         oldpkg->recommends_str = newpkg->recommends_str;
-         newpkg->recommends_str = NULL;
          oldpkg->recommends_count = newpkg->recommends_count;
          newpkg->recommends_count = 0;
 
-         oldpkg->suggests_str = newpkg->suggests_str;
-         newpkg->suggests_str = NULL;
          oldpkg->suggests_count = newpkg->suggests_count;
          newpkg->suggests_count = 0;
      }
@@ -525,30 +503,14 @@ void set_flags_from_control(opkg_conf_t *conf, pkg_t *pkg){
      return;
 }
 
-const char*
-constraint_to_str(enum version_constraint c)
-{
-       switch (c) {
-       case NONE:
-               return "";
-       case EARLIER:
-               return "< ";
-       case EARLIER_EQUAL:
-              return "<= ";
-       case EQUAL:
-              return "= ";
-       case LATER_EQUAL:
-             return ">= ";
-       case LATER:
-            return "> ";
-       }
-
-       return "";
-}
-
 void pkg_formatted_field(FILE *fp, pkg_t *pkg, const char *field)
 {
-     int i;
+     int i, j;
+     char *str;
+     int depends_count = pkg->pre_depends_count +
+                        pkg->depends_count +
+                        pkg->recommends_count +
+                        pkg->suggests_count;
 
      if (strlen(field) < PKG_MINIMUM_FIELD_NAME_LEN) {
          goto UNKNOWN_FMT_FIELD;
@@ -594,7 +556,7 @@ void pkg_formatted_field(FILE *fp, pkg_t *pkg, const char *field)
                         fprintf(fp, "%s %s", i == 0 ? "" : ",",
                                cdep->pkg->name);
                        if (cdep->version) {
-                               fprintf(fp, "(%s%s)",
+                               fprintf(fp, " (%s%s)",
                                        constraint_to_str(cdep->constraint),
                                        cdep->version);
                        }
@@ -610,8 +572,13 @@ void pkg_formatted_field(FILE *fp, pkg_t *pkg, const char *field)
          if (strcasecmp(field, "Depends") == 0) {
               if (pkg->depends_count) {
                     fprintf(fp, "Depends:");
-                   for(i = 0; i < pkg->depends_count; i++) {
-                        fprintf(fp, "%s %s", i == 0 ? "" : ",", pkg->depends_str[i]);
+                   for (j=0, i=0; i<depends_count; i++) {
+                       if (pkg->depends[i].type != DEPEND)
+                               continue;
+                       str = pkg_depend_str(pkg, i);
+                       fprintf(fp, "%s %s", j == 0 ? "" : ",", str);
+                       free(str);
+                       j++;
                     }
                    fprintf(fp, "\n");
               }
@@ -690,8 +657,13 @@ void pkg_formatted_field(FILE *fp, pkg_t *pkg, const char *field)
          } else if (strcasecmp (field, "Recommends") == 0) {
               if (pkg->recommends_count) {
                     fprintf(fp, "Recommends:");
-                   for(i = 0; i < pkg->recommends_count; i++) {
-                        fprintf(fp, "%s %s", i == 0 ? "" : ",", pkg->recommends_str[i]);
+                   for (j=0, i=0; i<depends_count; i++) {
+                       if (pkg->depends[i].type != RECOMMEND)
+                               continue;
+                       str = pkg_depend_str(pkg, i);
+                       fprintf(fp, "%s %s", j == 0 ? "" : ",", str);
+                       free(str);
+                       j++;
                     }
                     fprintf(fp, "\n");
               }
@@ -735,8 +707,13 @@ void pkg_formatted_field(FILE *fp, pkg_t *pkg, const char *field)
          } else if (strcasecmp(field, "Suggests") == 0) {
               if (pkg->suggests_count) {
                     fprintf(fp, "Suggests:");
-                   for(i = 0; i < pkg->suggests_count; i++) {
-                        fprintf(fp, "%s %s", i == 0 ? "" : ",", pkg->suggests_str[i]);
+                   for (j=0, i=0; i<depends_count; i++) {
+                       if (pkg->depends[i].type != SUGGEST)
+                               continue;
+                       str = pkg_depend_str(pkg, i);
+                       fprintf(fp, "%s %s", j == 0 ? "" : ",", str);
+                       free(str);
+                       j++;
                     }
                     fprintf(fp, "\n");
               }
@@ -1041,7 +1018,7 @@ str_list_t *pkg_get_installed_files(opkg_conf_t *conf, pkg_t *pkg)
               free(list_file_name);
               return pkg->installed_files;
          }
-         list_file = fdopen(fd, "rw+");
+         list_file = fdopen(fd, "r+");
          if (list_file == NULL) {
               opkg_message(conf, OPKG_ERROR, "%s: fdopen: %s",
                               __FUNCTION__, strerror(errno));