Merge pull request #267 from n3ph/master
[project/luci.git] / contrib / lar / cli.c
1 #include "lar.h"
2
3 int do_print_member( lar_archive *ar, const char *name )
4 {
5         lar_member *member;
6
7         if( (member = lar_open_member(ar, name)) != NULL )
8         {
9                 write(fileno(stdout), member->data, member->length);
10                 lar_close_member(member);
11         }
12         else
13                 LAR_DIE("Unable to locate archive member");
14
15         return 0;
16 }
17
18 int do_print_index( lar_archive *ar )
19 {
20         lar_index *index = ar->index;
21
22         if( ar->has_filenames )
23         {
24                 while(index)
25                 {
26                         if( index->type == LAR_TYPE_REGULAR )
27                         {
28                                 printf("%s\n", index->filename);
29                         }
30
31                         index = index->next;
32                 }
33
34                 return 0;
35         }
36
37         LAR_DIE("The archive contains no file list");
38         return 1;
39 }
40
41 int do_require( const char *package, const char *path )
42 {
43         int stat = 1;
44         lar_archive *ar;
45         lar_member *mb;
46
47         if( (ar = lar_find_archive(package, path, 1)) != NULL )
48         {
49                 if( (mb = lar_find_member(ar, package)) != NULL )
50                 {
51                         write(fileno(stdout), mb->data, mb->length);
52                         lar_close_member(mb);
53                         stat = 0;
54                 }
55
56                 lar_close(ar);
57         }
58
59         return stat;
60 }
61
62 int do_findfile( const char *filename, const char *path )
63 {
64         int stat = 1;
65         lar_archive *ar;
66         lar_member *mb;
67
68         if( (ar = lar_find_archive(filename, path, 0)) != NULL )
69         {
70                 if( (mb = lar_open_member(ar, filename)) != NULL )
71                 {
72                         write(fileno(stdout), mb->data, mb->length);
73                         lar_close_member(mb);
74                         stat = 0;
75                 }
76
77                 lar_close(ar);
78         }
79
80         return stat;
81 }
82
83 int main( int argc, const char* argv[] )
84 {
85         lar_archive *ar;
86         int stat = 0;
87
88         if( argv[1] != NULL && argv[2] != NULL )
89         {
90                 switch(argv[1][0])
91                 {
92                         case 's':
93                                 if( (ar = lar_open(argv[2])) != NULL )
94                                 {
95                                         if( argv[3] != NULL )
96                                                 stat = do_print_member(ar, argv[3]);
97                                         else
98                                                 stat = do_print_index(ar);
99
100                                         lar_close(ar);
101                                 }
102                                 else
103                                 {
104                                         LAR_DIE("Failed to open archive");
105                                 }
106
107                                 break;
108
109                         case 'r':
110                                 stat = do_require(argv[2], argv[3]);
111                                 break;
112
113                         case 'f':
114                                 stat = do_findfile(argv[2], argv[3]);
115                                 break;
116                 }
117
118                 return stat;
119         }
120         else
121         {
122                 printf("Usage:\n");
123                 printf("\tlar show <archive> [<member>]\n");
124                 printf("\tlar require <package> [<path>]\n");
125                 printf("\tlar find <filename> [<path>]\n");
126
127                 return 1;
128         }
129
130         return 0;
131 }