1 /***************************************************************************
2  begin       : Tue May 03 2005
3  copyright   : (C) 2005-2010 by Martin Preuss
4  email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  *          Please see toplevel file COPYING for license details           *
8  ***************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 #define GSA_IS_EXPERIMENTAL
15 #define DEBUG_GSA_TOOL */
16 
17 #include <gwenhywfar/debug.h>
18 #include <gwenhywfar/cgui.h>
19 
20 #include "globals.h"
21 
22 
23 
24 
readFile(const char * fname,GWEN_BUFFER * dbuf)25 int readFile(const char *fname, GWEN_BUFFER *dbuf)
26 {
27   FILE *f;
28 
29   f=fopen(fname, "rb");
30   if (f) {
31     while (!feof(f)) {
32       uint32_t l;
33       ssize_t s;
34       char *p;
35 
36       GWEN_Buffer_AllocRoom(dbuf, 1024);
37       l=GWEN_Buffer_GetMaxUnsegmentedWrite(dbuf);
38       p=GWEN_Buffer_GetPosPointer(dbuf);
39       s=fread(p, 1, l, f);
40       if (s==0)
41         break;
42       if (s==(ssize_t)-1) {
43         DBG_INFO(GWEN_LOGDOMAIN,
44                  "fread(%s): %s",
45                  fname, strerror(errno));
46         fclose(f);
47         return GWEN_ERROR_IO;
48       }
49 
50       GWEN_Buffer_IncrementPos(dbuf, s);
51       GWEN_Buffer_AdjustUsedBytes(dbuf);
52     }
53 
54     fclose(f);
55     return 0;
56   }
57   else {
58     DBG_INFO(GWEN_LOGDOMAIN,
59              "fopen(%s): %s",
60              fname, strerror(errno));
61     return GWEN_ERROR_IO;
62   }
63 }
64 
65 
66 
67 
68 
main(int argc,char ** argv)69 int main(int argc, char **argv)
70 {
71   GWEN_DB_NODE *db;
72   const char *cmd;
73   int rv;
74   int err;
75   GWEN_GUI *gui;
76   const GWEN_ARGS args[]= {
77     {
78       GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */
79       GWEN_ArgsType_Int,             /* type */
80       "help",                       /* name */
81       0,                            /* minnum */
82       0,                            /* maxnum */
83       "h",                          /* short option */
84       "help",                       /* long option */
85       "Show this help screen",      /* short description */
86       "Show this help screen"       /* long description */
87     }
88   };
89 
90   err=GWEN_Init();
91   if (err) {
92     fprintf(stderr, "Could not initialize Gwenhywfar.\n");
93     return 2;
94   }
95 
96   gui=GWEN_Gui_CGui_new();
97   GWEN_Gui_SetGui(gui);
98 
99   GWEN_Logger_Open(GSA_LOGDOMAIN, "gsa", 0,
100                    GWEN_LoggerType_Console,
101                    GWEN_LoggerFacility_User);
102 
103   GWEN_Logger_SetLevel(GSA_LOGDOMAIN, GWEN_LoggerLevel_Warning);
104   GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Warning);
105 
106 #ifdef GSA_IS_EXPERIMENTAL
107   fprintf(stderr, "\n");
108   fprintf(stderr, "\n");
109   fprintf(stderr, "=================== WARNING ===================\n");
110   fprintf(stderr, "This tool is still EXPERIMENTAL !!!\n");
111   fprintf(stderr, "Please DON'T USE it with your data files !\n");
112   fprintf(stderr, "===============================================\n");
113   fprintf(stderr, "\n");
114   fprintf(stderr, "\n");
115 #endif
116 
117   db=GWEN_DB_Group_new("arguments");
118   rv=GWEN_Args_Check(argc, argv, 1,
119                      GWEN_ARGS_MODE_ALLOW_FREEPARAM |
120                      GWEN_ARGS_MODE_STOP_AT_FREEPARAM,
121                      args,
122                      db);
123   if (rv==GWEN_ARGS_RESULT_ERROR) {
124     fprintf(stderr, "ERROR: Could not parse arguments main\n");
125     return -1;
126   }
127   else if (rv==GWEN_ARGS_RESULT_HELP) {
128     GWEN_BUFFER *ubuf;
129 
130     ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
131     GWEN_Buffer_AppendString(ubuf,
132                              I18N("GWEN's Simple Archiver"));
133     GWEN_Buffer_AppendString(ubuf,
134                              " (Gwenhywfar v" GWENHYWFAR_VERSION_FULL_STRING ")\n");
135     GWEN_Buffer_AppendString(ubuf,
136                              I18N("Usage: "));
137     GWEN_Buffer_AppendString(ubuf, argv[0]);
138     GWEN_Buffer_AppendString(ubuf,
139                              I18N(" [GLOBAL OPTIONS] COMMAND "
140                                   "[LOCAL OPTIONS]\n"));
141     GWEN_Buffer_AppendString(ubuf,
142                              I18N("\nGlobal Options:\n"));
143     if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
144       fprintf(stderr, "ERROR: Could not create help string\n");
145       return 1;
146     }
147     GWEN_Buffer_AppendString(ubuf,
148                              I18N("\nCommands:\n\n"));
149     GWEN_Buffer_AppendString(ubuf,
150                              I18N("  create:\n"
151                                   "    This command creates an archive file"
152                                   "\n\n"));
153     GWEN_Buffer_AppendString(ubuf,
154                              I18N("  add:\n"
155                                   "    Add files and folders to an archive file\n\n"));
156     GWEN_Buffer_AppendString(ubuf,
157                              I18N("  list:\n"
158                                   "    List files and folders in an archive file\n\n"));
159 
160     GWEN_Buffer_AppendString(ubuf,
161                              I18N("  check:\n"
162                                   "    Check integrity of files and folders in an archive file\n\n"));
163 
164     fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf));
165     GWEN_Buffer_free(ubuf);
166     return 0;
167   }
168   if (rv) {
169     argc-=rv-1;
170     argv+=rv-1;
171   }
172 
173   cmd=GWEN_DB_GetCharValue(db, "params", 0, 0);
174   if (!cmd) {
175     fprintf(stderr, "ERROR: Command needed.\n");
176     return 1;
177   }
178 
179   if (strcasecmp(cmd, "create")==0) {
180     rv=createArchive(db, argc, argv);
181   }
182   else if (strcasecmp(cmd, "add")==0) {
183     rv=add2Archive(db, argc, argv);
184   }
185   else if (strcasecmp(cmd, "list")==0) {
186     rv=listArchive(db, argc, argv);
187   }
188   else if (strcasecmp(cmd, "check")==0) {
189     rv=checkArchive(db, argc, argv);
190   }
191   else if (strcasecmp(cmd, "extract")==0) {
192     rv=extractArchive(db, argc, argv);
193   }
194   else if (strcasecmp(cmd, "sign")==0) {
195     rv=signArchive(db, argc, argv);
196   }
197   else if (strcasecmp(cmd, "verify")==0) {
198     rv=verifyArchive(db, argc, argv);
199   }
200   else if (strcasecmp(cmd, "mkkey")==0) {
201     rv=mkArchiveKey(db, argc, argv);
202   }
203   else if (strcasecmp(cmd, "rfi")==0) {
204     rv=releaseFillIn(db, argc, argv);
205   }
206   else {
207     fprintf(stderr, "ERROR: Unknown command \"%s\".\n", cmd);
208     rv=1;
209   }
210 
211   err=GWEN_Fini();
212   if (err) {
213     fprintf(stderr,
214             "WARNING: Could not deinitialize Gwenhywfar.\n");
215   }
216 
217   return rv;
218 }
219 
220 
221 
222