"Fossies" - the Fresh Open Source Software Archive

Member "unipkg-0.6.5/unipkg-trans.c" (16 Dec 2005, 12584 Bytes) of package /linux/privat/old/unipkg-0.6.5.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /******************************************************************************\
    2 *                                                                              *
    3 * UNIPKG (c) iSteve <isteve@bofh.cz>, 2005                                     *
    4 *                                                                              *
    5 * Universal PacKaGer.                                                          *
    6 * Licensed under GNU/GPL - if you don't like the software, fix it!             *
    7 *                                                                              *
    8 \******************************************************************************/
    9 
   10 #undef DEBUG
   11 #define _GNU_SOURCE
   12 
   13 #include <time.h>
   14 
   15 #include <stdlib.h>
   16 #include <stdio.h>
   17 #include <stdarg.h>
   18 #include <string.h>
   19 #include <unistd.h>
   20 
   21 #include <ctype.h>
   22 
   23 #include <sys/stat.h>
   24 #include <sys/types.h>
   25 #include <sys/wait.h>
   26 
   27 #include <signal.h>
   28 
   29 #include <fnmatch.h>
   30 #include <dlfcn.h>
   31 
   32 #include <getopt.h>
   33 
   34 #include "common.h"
   35 #include "manmachine.h"
   36 
   37 typedef struct {
   38     char    *fdb, *tdb, *ifp, *ofp;
   39 } params;
   40 
   41 void clearparams(params *prm) {
   42     prm->fdb = NULL;
   43     prm->tdb = NULL;
   44     prm->ifp = NULL;
   45     prm->ofp = NULL;
   46 }
   47 
   48 void freeparams(params *prm) {
   49     free(prm->fdb);
   50     free(prm->tdb);
   51     free(prm->ifp);
   52     free(prm->ofp);
   53 }
   54 
   55 int getaction(char *needle, actions *longopts) {
   56     unsigned int    i=0;
   57 
   58     while (longopts[i].text != NULL) {
   59         if (strcmp(needle, longopts[i].text) == 0) { return longopts[i].reval; }
   60         i++;
   61     }
   62     return 0;
   63 }
   64 
   65 int loaddbcalls(databasecalls *dbcalls) {
   66     dbcalls->opendb = (void* (*)(char*))dlsym(dbcalls->libhandle, "opendb");
   67     dbcalls->closedb = (void (*)(void*))dlsym(dbcalls->libhandle, "closedb");
   68     dbcalls->rewinddb = (void (*)(void*))dlsym(dbcalls->libhandle, "rewinddb");
   69     dbcalls->writepkg = (int (*)(void*, pkginfo*))dlsym(dbcalls->libhandle, "writepkg");
   70     dbcalls->readpkg = (int (*)(void*, pkginfo*))dlsym(dbcalls->libhandle, "readpkg");
   71     dbcalls->delpkg = (int (*)(void*, char*))dlsym(dbcalls->libhandle, "delpkg");
   72     dbcalls->findpkg = (int (*)(void*, pkginfo, pkginfo*, int))dlsym(dbcalls->libhandle, "findpkg");
   73     dbcalls->iswriteable = (int (*)(void*))dlsym(dbcalls->libhandle, "iswriteable");
   74     
   75     if (dlerror() != NULL)  { return 1; }
   76     return 0;
   77 }
   78 
   79 int main(int argc, char *argv[]) {
   80     int     c;
   81     actions configopts[] = { {"list", 1}, {"info", 2}, {"writetest", 3}, {"copydb", 4}, {"addtodb", 5}, {"sizerecalc", 6}, {NULL, 0} };
   82     params  parameters;
   83     pkginfo pinfo, needle;
   84     
   85     void    *dbhandle;
   86     void    *writedbhandle;
   87     databasecalls   dbcalls;
   88     databasecalls   writedbcalls;
   89     struct stat statbuf;
   90     unsigned long   i;
   91     
   92     clearparams(&parameters);
   93     
   94     while ((c = getopt(argc, argv, ":f:t:i:o:")) != -1) { 
   95         switch(c) {
   96             case 'f':
   97                 parameters.fdb = strdup(optarg);
   98                 break;
   99             case 't':
  100                 parameters.tdb = strdup(optarg);
  101                 break;
  102             case 'i':
  103                 parameters.ifp = strdup(optarg);
  104                 break;
  105             case 'o':
  106                 parameters.ofp = strdup(optarg);
  107                 break;
  108         }
  109     }
  110     
  111     if (optind>= argc){
  112         freeparams(&parameters);
  113 
  114         fprintf(stderr, "unipkg-trans -f <input library> -i <input dbpath> \\\n");
  115         fprintf(stderr, " [-t <output library> -o <output dbpath>] \\\n");
  116         fprintf(stderr, " {list|info|writetest|copydb|addtodb} [<param>]\n\n");
  117         fprintf(stderr, "  list             -- list input db\n");
  118         fprintf(stderr, "  info <pkgname>   -- pkg info about pkgname from input db\n");
  119         fprintf(stderr, "  writetest <name> -- write a test pkg of name <name> to input db\n");
  120         fprintf(stderr, "  copydb           -- read all pkgs from input and write to output\n");
  121         fprintf(stderr, "  addtodb          -- add all pkgs from input to output that output misses\n");
  122 
  123         return 1;
  124     }
  125 
  126     switch (getaction(argv[optind], configopts)) {
  127         case 1:
  128             if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
  129                 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
  130                 freeparams(&parameters);
  131                 return 1;
  132             }
  133             dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
  134             if (!dbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  135             loaddbcalls(&dbcalls);
  136             
  137             dbhandle = NULL;
  138             if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) { 
  139                 fprintf(stderr, "Failed: couldn't open database.\n");
  140             } else {
  141                 printseparator('-', '.', 2, 25, 50);
  142                 printcolumns('|', M_NOBORDERS, M_CENTER, 0, M_CUT, 2, 25, "Name", 50, "Version", "Description");
  143                 printseparator('-', '+', 2, 25, 50);
  144                 clearpinfo(&pinfo);
  145                 while (!dbcalls.readpkg(dbhandle, &pinfo)) {
  146                     printcolumns('|', M_NOBORDERS, M_LEFT, 1, M_CUT, 2, 25, pinfo.name, 50, pinfo.version, pinfo.description);
  147                     freepinfo(&pinfo);
  148                     clearpinfo(&pinfo);
  149                 }
  150                 printseparator('-', '\'', 2, 25, 50);
  151                 dbcalls.closedb(dbhandle);
  152             }
  153             dlclose(dbcalls.libhandle);
  154             break;
  155         case 2:
  156             optind++;
  157             if (optind >= argc) { 
  158                 fprintf(stderr, "Add the name of pkg you want info about.\n");
  159                 freeparams(&parameters);
  160                 return 1;
  161             }
  162             if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
  163                 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
  164                 freeparams(&parameters);
  165                 return 1;
  166             }
  167             dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
  168             if (!dbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  169             loaddbcalls(&dbcalls);
  170             dbhandle = NULL;
  171             if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) { 
  172                 fprintf(stderr, "Failed: couldn't open database.\n");
  173             } else {
  174                 clearpinfo(&pinfo);
  175                 clearpinfo(&needle);
  176                 needle.name = argv[optind];
  177                 fprintf(stderr, "needle: %s\n", needle.name);
  178                 if (dbcalls.findpkg(dbhandle, needle, &pinfo, MATCH_NAME)) {
  179                     printpinfo(pinfo);
  180                     freepinfo(&pinfo);
  181                     clearpinfo(&pinfo);
  182                 }
  183                 else {
  184                     printf("No such package.\n");
  185                 }
  186                 dbcalls.closedb(dbhandle);
  187             }
  188             dlclose(dbcalls.libhandle);
  189             break;
  190             
  191         case 3:
  192             optind++;
  193             if (optind >= argc) { 
  194                 fprintf(stderr, "Add the name of pkg you want to write in.\n");
  195                 freeparams(&parameters);
  196                 return 1;
  197             }
  198             if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
  199                 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
  200                 freeparams(&parameters);
  201                 return 1;
  202             }
  203             dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
  204             if (!dbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  205             loaddbcalls(&dbcalls);
  206             dbhandle = NULL;
  207             if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) { 
  208                 fprintf(stderr, "Failed: couldn't open database.\n");
  209             } else {
  210                 if (dbcalls.iswriteable(dbhandle)) {
  211                     clearpinfo(&pinfo);
  212                     pinfo.name = argv[optind];
  213                     pinfo.version = strdup("testver");
  214                     pinfo.description = strdup("Testing package");
  215                     pinfo.filecount = 1;
  216                     pinfo.files = malloc(sizeof(char *) * pinfo.filecount);
  217                     pinfo.files[0].name = malloc(strlen(pinfo.name) + strlen("/test/file/") + 1);
  218                     strcpy(pinfo.files[0].name, "/test/file/");
  219                     strcat(pinfo.files[0].name, pinfo.name);
  220                     fprintf(stderr, "Writing: %s\nFile: %s\n", pinfo.name, pinfo.files[0].name);
  221                     if (!dbcalls.writepkg(dbhandle, &pinfo)) {
  222                         printf("Write fine.\n");
  223                     }
  224                     else {
  225                         printf("Write err.\n");
  226                     }
  227                 }
  228                 dbcalls.closedb(dbhandle);
  229             }
  230             dlclose(dbcalls.libhandle);
  231             break;
  232             
  233         case 4:
  234             if ((parameters.fdb == NULL) || (parameters.ifp == NULL) || (parameters.tdb == NULL) || (parameters.ofp == NULL)) {
  235                 fprintf(stderr, "Use -f to specify input library, -i to specify input filedb path, -t to specify target library and -o to specify output db path\n");
  236                 freeparams(&parameters);
  237                 return 1;
  238             }
  239             
  240             dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
  241             if (!dbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  242             loaddbcalls(&dbcalls);
  243             dbhandle = NULL;
  244             if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) { 
  245                 fprintf(stderr, "Failed: couldn't open input database.\n");
  246             } else {
  247                 writedbcalls.libhandle = dlopen(parameters.tdb, RTLD_LAZY);
  248                 if (!writedbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  249                 loaddbcalls(&writedbcalls);
  250                 writedbhandle = NULL;
  251                 if ((writedbhandle = writedbcalls.opendb(parameters.ofp)) == NULL) { 
  252                     fprintf(stderr, "Failed: couldn't open input database.\n");
  253                 } else {
  254                     if (writedbcalls.iswriteable(writedbhandle)) {
  255                         clearpinfo(&pinfo);
  256                         while (!dbcalls.readpkg(dbhandle, &pinfo)) {
  257                             fprintf(stderr, "Attempting to write: %s\n", pinfo.name);
  258                                 if (writedbcalls.writepkg(writedbhandle, &pinfo)) {
  259                                     fprintf(stderr, "Couldn't write\n");
  260                                     break;
  261                                 }
  262                                 freepinfo(&pinfo);
  263                             clearpinfo(&pinfo);
  264                         }
  265                     }
  266                     writedbcalls.closedb(writedbhandle);
  267                 }
  268                 dbcalls.closedb(dbhandle);
  269             }
  270             dlclose(dbcalls.libhandle);
  271             dlclose(writedbcalls.libhandle);
  272             break;
  273         case 5:
  274             if ((parameters.fdb == NULL) || (parameters.ifp == NULL) || (parameters.tdb == NULL) || (parameters.ofp == NULL)) {
  275                 fprintf(stderr, "Use -f to specify input library, -i to specify input filedb path, -t to specify target library and -o to specify output db path\n");
  276                 freeparams(&parameters);
  277                 return 1;
  278             }
  279             
  280             dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
  281             if (!dbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  282             loaddbcalls(&dbcalls);
  283             dbhandle = NULL;
  284             if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) { 
  285                 fprintf(stderr, "Failed: couldn't open input database.\n");
  286             } else {
  287                 writedbcalls.libhandle = dlopen(parameters.tdb, RTLD_LAZY);
  288                 if (!writedbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  289                 loaddbcalls(&writedbcalls);
  290                 writedbhandle = NULL;
  291                 if ((writedbhandle = writedbcalls.opendb(parameters.ofp)) == NULL) { 
  292                     fprintf(stderr, "Failed: couldn't open input database.\n");
  293                 } else {
  294                     if (writedbcalls.iswriteable(writedbhandle)) {
  295                         clearpinfo(&pinfo);
  296                         while (!dbcalls.readpkg(dbhandle, &pinfo)) {
  297                             if (!writedbcalls.findpkg(writedbhandle, pinfo, NULL, MATCH_NAME)) {
  298                                 fprintf(stderr, "Attempting to write: %s\n", pinfo.name);
  299                                 if (writedbcalls.writepkg(writedbhandle, &pinfo)) {
  300                                     fprintf(stderr, "Couldn't write\n");
  301                                     break;
  302                                 }
  303                             }
  304                             else {
  305                                 fprintf(stderr, "Skipping write: %s\n", pinfo.name);
  306                             }
  307                             freepinfo(&pinfo);
  308                             clearpinfo(&pinfo);
  309                         }
  310                     }
  311                     writedbcalls.closedb(writedbhandle);
  312                 }
  313                 dbcalls.closedb(dbhandle);
  314             }
  315             dlclose(dbcalls.libhandle);
  316             dlclose(writedbcalls.libhandle);
  317             break;
  318             
  319         case 6:
  320             optind++;
  321             if (optind >= argc) { 
  322                 fprintf(stderr, "Add the name of pkg you want to recalculate.\n");
  323                 freeparams(&parameters);
  324                 return 1;
  325             }
  326             if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
  327                 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
  328                 freeparams(&parameters);
  329                 return 1;
  330             }
  331             dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
  332             if (!dbcalls.libhandle) { freeparams(&parameters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
  333             loaddbcalls(&dbcalls);
  334             
  335             dbhandle = NULL;
  336             if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) { 
  337                 fprintf(stderr, "Failed: couldn't open database.\n");
  338             } else {
  339                 clearpinfo(&pinfo);
  340                 needle.name = argv[optind];
  341                 if (dbcalls.findpkg(dbhandle, needle, &pinfo, MATCH_NAME)) {
  342                     pinfo.pkgsize = 0;
  343                     for (i = 0; i < pinfo.filecount; i++) {
  344                         if (!stat(pinfo.files[i].name, &statbuf)) {
  345                             pinfo.pkgsize += statbuf.st_size;
  346                         }
  347                     }
  348                     
  349                     if (dbcalls.iswriteable(dbhandle)) {
  350                         // ugly, ugly.
  351                         dbcalls.rewinddb(dbhandle);
  352                         
  353                         if (!dbcalls.delpkg(dbhandle, needle.name)) {
  354                             if (!dbcalls.writepkg(dbhandle, &pinfo)) {
  355                                 fprintf(stderr, "Updated %s\n", pinfo.name);
  356                             }
  357                         }
  358                     } else {
  359                         fprintf(stderr, "Can't write, %s has size: %ld\n", pinfo.name, pinfo.pkgsize);
  360                     }
  361                     freepinfo(&pinfo);
  362                     clearpinfo(&pinfo);
  363                 } else {
  364                     fprintf(stderr, "Couldn't find %s.\n", needle.name);
  365                 }
  366                 dbcalls.closedb(dbhandle);
  367             }
  368             dlclose(dbcalls.libhandle);
  369             break;
  370         case 0:
  371             fprintf(stderr, "foo\n");
  372             break;
  373     }
  374     
  375     freeparams(&parameters);
  376     return 0;
  377 }