applications/luci-upnp: add a note that up and download speeds are informational...
[project/luci.git] / contrib / lar / cli.c
index 026150e..36216d4 100644 (file)
@@ -18,44 +18,114 @@ int do_print_member( lar_archive *ar, const char *name )
 int do_print_index( lar_archive *ar )
 {
        lar_index *index = ar->index;
-       LAR_FNAME(filename);
 
-       while(index)
+       if( ar->has_filenames )
        {
-               lar_get_filename(ar, index, filename);
-               printf("%s\n", filename);
-               index = index->next;
+               while(index)
+               {
+                       if( index->type == LAR_TYPE_REGULAR )
+                       {
+                               printf("%s\n", index->filename);
+                       }
+
+                       index = index->next;
+               }
+
+               return 0;
        }
 
-       return 0;       
+       LAR_DIE("The archive contains no file list");
+       return 1;
 }
 
-int main( int argc, const char* argv[] )
+int do_require( const char *package, const char *path )
 {
+       int stat = 1;
        lar_archive *ar;
-       
-       if( argv[1] != NULL )
+       lar_member *mb;
+
+       if( (ar = lar_find_archive(package, path, 1)) != NULL )
        {
-               if( (ar = lar_open(argv[1])) != NULL )
+               if( (mb = lar_find_member(ar, package)) != NULL )
                {
-                       if( argv[2] )
-                               return do_print_member(ar, argv[2]);
-                       else
-                               return do_print_index(ar);
+                       write(fileno(stdout), mb->data, mb->length);
+                       lar_close_member(mb);
+                       stat = 0;
+               }
+
+               lar_close(ar);
+       }
 
-                       lar_close(ar);
+       return stat;
+}
+
+int do_findfile( const char *filename, const char *path )
+{
+       int stat = 1;
+       lar_archive *ar;
+       lar_member *mb;
+
+       if( (ar = lar_find_archive(filename, path, 0)) != NULL )
+       {
+               if( (mb = lar_open_member(ar, filename)) != NULL )
+               {
+                       write(fileno(stdout), mb->data, mb->length);
+                       lar_close_member(mb);
+                       stat = 0;
                }
-               else
+
+               lar_close(ar);
+       }
+
+       return stat;
+}
+
+int main( int argc, const char* argv[] )
+{
+       lar_archive *ar;
+       int stat = 0;
+
+       if( argv[1] != NULL && argv[2] != NULL )
+       {
+               switch(argv[1][0])
                {
-                       LAR_DIE("Failed to open archive");
+                       case 's':
+                               if( (ar = lar_open(argv[2])) != NULL )
+                               {
+                                       if( argv[3] != NULL )
+                                               stat = do_print_member(ar, argv[3]);
+                                       else
+                                               stat = do_print_index(ar);
+
+                                       lar_close(ar);
+                               }
+                               else
+                               {
+                                       LAR_DIE("Failed to open archive");
+                               }
+
+                               break;
+
+                       case 'r':
+                               stat = do_require(argv[2], argv[3]);
+                               break;
+
+                       case 'f':
+                               stat = do_findfile(argv[2], argv[3]);
+                               break;
                }
+
+               return stat;
        }
        else
-    {
-               printf("Usage: lar <archive> [<member>]\n");
+       {
+               printf("Usage:\n");
+               printf("\tlar show <archive> [<member>]\n");
+               printf("\tlar require <package> [<path>]\n");
+               printf("\tlar find <filename> [<path>]\n");
+
                return 1;
        }
 
        return 0;
 }
-