add utf8 helpers to util.c
[platform/upstream/libsolv.git] / tools / rpms2solv.c
index 1075046..54ea4e9 100644 (file)
 #include "repo_solv.h"
 #include "common_write.h"
 
+static char *
+fgets0(char *s, int size, FILE *stream)
+{
+  char *p = s;
+  int c;
+
+  while (--size > 0)
+    {
+      c = getc(stream);
+      if (c == EOF)
+       {
+         if (p == s)
+           return 0;
+         c = 0;
+       }
+      *p++ = c;
+      if (!c)
+       return s;
+    }
+  *p = 0;
+  return s;
+}
+
 int
 main(int argc, char **argv)
 {
   const char **rpms = 0;
   char *manifest = 0;
-  int c, nrpms = 0;
+  int manifest0 = 0;
+  int c, i, res, nrpms = 0;
   Pool *pool = pool_create();
   Repo *repo;
   FILE *fp;
   char buf[4096], *p;
+  const char *basefile = 0;
 
-  while ((c = getopt(argc, argv, "m:")) >= 0)
+  while ((c = getopt(argc, argv, "0b:m:")) >= 0)
     {
       switch(c)
        {
+       case 'b':
+         basefile = optarg;
+         break;
        case 'm':
          manifest = optarg;
          break;
+       case '0':
+         manifest0 = 1;
+         break;
        default:
          exit(1);
        }
     }
   if (manifest)
     {
-      if ((fp = fopen(manifest, "r")) == 0)
+      if (!strcmp(manifest, "-"))
+        fp = stdin;
+      else if ((fp = fopen(manifest, "r")) == 0)
        {
          perror(manifest);
          exit(1);
        }
-      while(fgets(buf, sizeof(buf), fp))
+      for (;;)
        {
-         if ((p = strchr(buf, '\n')) != 0)
-           *p = 0;
-          rpms = sat_extend(rpms, nrpms, 1, sizeof(char *), 15);
+         if (manifest0)
+           {
+             if (!fgets0(buf, sizeof(buf), fp))
+               break;
+           }
+         else
+           {
+             if (!fgets(buf, sizeof(buf), fp))
+               break;
+             if ((p = strchr(buf, '\n')) != 0)
+               *p = 0;
+           }
+          rpms = solv_extend(rpms, nrpms, 1, sizeof(char *), 15);
          rpms[nrpms++] = strdup(buf);
        }
-      fclose(fp);
+      if (fp != stdin)
+        fclose(fp);
     }
   while (optind < argc)
     {
-      rpms = sat_extend(rpms, nrpms, 1, sizeof(char *), 15);
+      rpms = solv_extend(rpms, nrpms, 1, sizeof(char *), 15);
       rpms[nrpms++] = strdup(argv[optind++]);
     }
   repo = repo_create(pool, "rpms2solv");
-  repo_add_rpms(repo, rpms, nrpms);
-  tool_write(repo, 0, 0);
+  repo_add_repodata(repo, 0);
+  res = 0;
+  for (i = 0; i < nrpms; i++)
+    {
+      if (repo_add_rpm(repo, rpms[i], REPO_REUSE_REPODATA|REPO_NO_INTERNALIZE) == 0)
+       {
+         fprintf(stderr, "rpms2solv: %s\n", pool_errstr(pool));
+         res = 1;
+       }
+    }
+  repo_internalize(repo);
+  tool_write(repo, basefile, 0);
   pool_free(pool);
   for (c = 0; c < nrpms; c++)
     free((char *)rpms[c]);
-  sat_free(rpms);
-  exit(0);
+  solv_free(rpms);
+  exit(res);
 }