opkg: Consolidate error reporting from opkg_conf_init and ensure return value is
[project/opkg-lede.git] / libopkg / libopkg.c
1 /* opkglib.c - the opkg package management system
2
3 Florina Boor
4
5 Copyright (C) 2003 kernel concepts
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2, or (at
10 your option) any later version.
11
12 This program is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
16 */
17
18 #include "includes.h"
19 #include "libopkg.h"
20
21 #include "args.h"
22 #include "opkg_conf.h"
23 #include "opkg_cmd.h"
24 #include "file_util.h"
25
26 #include "opkg_message.h"
27 #include "opkg_error.h"
28
29 opkg_status_callback opkg_cb_status = NULL;
30 opkg_list_callback opkg_cb_list = NULL;
31
32
33 int
34 opkg_init (opkg_message_callback mcall,
35 opkg_response_callback rcall,
36 args_t * args)
37 {
38 opkg_cb_message = mcall;
39 opkg_cb_response = rcall;
40
41 args_init (args);
42
43 return 0;
44 }
45
46
47 int
48 opkg_deinit (args_t * args)
49 {
50 args_deinit (args);
51 opkg_cb_message = NULL;
52 opkg_cb_response = NULL;
53
54 /* place other cleanup stuff here */
55
56 return 0;
57 }
58
59
60 int
61 opkg_packages_list(args_t *args,
62 const char *packages,
63 opkg_list_callback cblist,
64 void *userdata)
65 {
66 opkg_cmd_t *cmd;
67 opkg_conf_t opkg_conf;
68 int err;
69
70 err = opkg_conf_init (&opkg_conf, args);
71 if (err)
72 {
73 return err;
74 }
75
76 opkg_cb_list = cblist;
77 /* we need to do this because of static declarations,
78 * maybe a good idea to change */
79 cmd = opkg_cmd_find ("list");
80 if (packages)
81 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &packages, userdata);
82 else
83 err = opkg_cmd_exec (cmd, &opkg_conf, 0, NULL, userdata);
84 opkg_cb_list = NULL;
85 opkg_conf_deinit (&opkg_conf);
86 return (err);
87 }
88
89
90 int
91 opkg_packages_status(args_t *args,
92 const char *packages,
93 opkg_status_callback cbstatus,
94 void *userdata)
95 {
96 opkg_cmd_t *cmd;
97 opkg_conf_t opkg_conf;
98 int err;
99
100 err = opkg_conf_init (&opkg_conf, args);
101 if (err)
102 {
103 return err;
104 }
105
106 opkg_cb_status = cbstatus;
107
108 /* we need to do this because of static declarations,
109 * maybe a good idea to change */
110 cmd = opkg_cmd_find ("status");
111 if (packages)
112 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &packages, userdata);
113 else
114 err = opkg_cmd_exec (cmd, &opkg_conf, 0, NULL, userdata);
115
116 opkg_cb_status = NULL;
117 opkg_conf_deinit (&opkg_conf);
118 return (err);
119 }
120
121
122 int
123 opkg_packages_info(args_t *args,
124 const char *packages,
125 opkg_status_callback cbstatus,
126 void *userdata)
127 {
128 opkg_cmd_t *cmd;
129 opkg_conf_t opkg_conf;
130 int err;
131
132 err = opkg_conf_init (&opkg_conf, args);
133 if (err)
134 {
135 return err;
136 }
137
138 opkg_cb_status = cbstatus;
139
140 /* we need to do this because of static declarations,
141 * maybe a good idea to change */
142 cmd = opkg_cmd_find ("info");
143 if (packages)
144 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &packages, userdata);
145 else
146 err = opkg_cmd_exec (cmd, &opkg_conf, 0, NULL, userdata);
147
148 opkg_cb_status = NULL;
149 opkg_conf_deinit (&opkg_conf);
150 return (err);
151 }
152
153
154 int
155 opkg_packages_install (args_t * args, const char *name)
156 {
157 opkg_cmd_t *cmd;
158 opkg_conf_t opkg_conf;
159 int err;
160
161 /* this error should be handled in application */
162 if (!name || !strlen (name))
163 return (-1);
164
165 err = opkg_conf_init (&opkg_conf, args);
166 if (err)
167 {
168 return err;
169 }
170
171 /* we need to do this because of static declarations,
172 * maybe a good idea to change */
173 cmd = opkg_cmd_find ("install");
174 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &name, NULL);
175
176 opkg_conf_deinit(&opkg_conf);
177 return (err);
178 }
179
180
181 int
182 opkg_packages_remove(args_t *args, const char *name, int purge)
183 {
184 opkg_cmd_t *cmd;
185 opkg_conf_t opkg_conf;
186 int err;
187
188 /* this error should be handled in application */
189 if (!name || !strlen (name))
190 return (-1);
191
192 err = opkg_conf_init (&opkg_conf, args);
193 if (err)
194 {
195 return err;
196 }
197
198 /* we need to do this because of static declarations,
199 * maybe a good idea to change */
200 if (purge)
201 cmd = opkg_cmd_find ("purge");
202 else
203 cmd = opkg_cmd_find ("remove");
204
205 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &name, NULL);
206
207 opkg_conf_deinit(&opkg_conf);
208 return (err);
209 }
210
211
212 int
213 opkg_lists_update(args_t *args)
214 {
215 opkg_cmd_t *cmd;
216 opkg_conf_t opkg_conf;
217 int err;
218
219 err = opkg_conf_init (&opkg_conf, args);
220 if (err)
221 {
222 return err;
223 }
224
225 /* we need to do this because of static declarations,
226 * maybe a good idea to change */
227 cmd = opkg_cmd_find ("update");
228
229 err = opkg_cmd_exec (cmd, &opkg_conf, 0, NULL, NULL);
230
231 opkg_conf_deinit(&opkg_conf);
232 return (err);
233 }
234
235
236 int
237 opkg_packages_upgrade(args_t *args)
238 {
239 opkg_cmd_t *cmd;
240 opkg_conf_t opkg_conf;
241 int err;
242
243 err = opkg_conf_init (&opkg_conf, args);
244 if (err)
245 {
246 return err;
247 }
248
249 /* we need to do this because of static declarations,
250 * maybe a good idea to change */
251 cmd = opkg_cmd_find ("upgrade");
252
253 err = opkg_cmd_exec (cmd, &opkg_conf, 0, NULL, NULL);
254
255 opkg_conf_deinit(&opkg_conf);
256 return (err);
257 }
258
259
260 int
261 opkg_packages_download (args_t * args, const char *name)
262 {
263 opkg_cmd_t *cmd;
264 opkg_conf_t opkg_conf;
265 int err;
266
267 /* this error should be handled in application */
268 if (!name || !strlen (name))
269 return (-1);
270
271 err = opkg_conf_init (&opkg_conf, args);
272 if (err)
273 {
274 opkg_print_error_list (&opkg_conf);
275 return err;
276 }
277
278 /* we need to do this because of static declarations,
279 * maybe a good idea to change */
280 cmd = opkg_cmd_find ("download");
281 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &name, NULL);
282
283 opkg_conf_deinit(&opkg_conf);
284 return (err);
285 }
286
287
288 int
289 opkg_package_files(args_t *args,
290 const char *name,
291 opkg_list_callback cblist,
292 void *userdata)
293 {
294 opkg_cmd_t *cmd;
295 opkg_conf_t opkg_conf;
296 int err;
297
298 /* this error should be handled in application */
299 if (!name || !strlen (name))
300 return (-1);
301
302 err = opkg_conf_init (&opkg_conf, args);
303 if (err)
304 {
305 return err;
306 }
307
308 opkg_cb_list = cblist;
309
310 /* we need to do this because of static declarations,
311 * maybe a good idea to change */
312 cmd = opkg_cmd_find ("files");
313
314 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &name, userdata);
315
316 opkg_cb_list = NULL;
317 opkg_conf_deinit(&opkg_conf);
318 return (err);
319 }
320
321
322 int
323 opkg_file_search(args_t *args,
324 const char *file,
325 opkg_list_callback cblist,
326 void *userdata)
327 {
328 opkg_cmd_t *cmd;
329 opkg_conf_t opkg_conf;
330 int err;
331
332 /* this error should be handled in application */
333 if (!file || !strlen (file))
334 return (-1);
335
336 err = opkg_conf_init (&opkg_conf, args);
337 if (err)
338 {
339 return err;
340 }
341
342 opkg_cb_list = cblist;
343
344 /* we need to do this because of static declarations,
345 * maybe a good idea to change */
346 cmd = opkg_cmd_find ("search");
347 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &file, userdata);
348
349 opkg_cb_list = NULL;
350 opkg_conf_deinit(&opkg_conf);
351 return(err);
352 }
353
354
355 int
356 opkg_file_what(args_t *args, const char *file, const char* command)
357 {
358 opkg_cmd_t *cmd;
359 opkg_conf_t opkg_conf;
360 int err;
361
362 /* this error should be handled in application */
363 if (!file || !strlen (file))
364 return (-1);
365
366 err = opkg_conf_init (&opkg_conf, args);
367 if (err)
368 {
369 return err;
370 }
371
372 /* we need to do this because of static declarations,
373 * maybe a good idea to change */
374 cmd = opkg_cmd_find (command);
375 err = opkg_cmd_exec (cmd, &opkg_conf, 1, &file, NULL);
376
377 opkg_conf_deinit(&opkg_conf);
378 return(err);
379 }
380
381 #define opkg_package_whatdepends(args,file) opkg_file_what(args,file,"whatdepends")
382 #define opkg_package_whatrecommends(args, file) opkg_file_what(args,file,"whatrecommends")
383 #define opkg_package_whatprovides(args, file) opkg_file_what(args,file,"whatprovides")
384 #define opkg_package_whatconflicts(args, file) opkg_file_what(args,file,"whatconflicts")
385 #define opkg_package_whatreplaces(args, file) opkg_file_what(args,file,"whatreplaces")
386
387
388 int default_opkg_message_callback(opkg_conf_t *conf, message_level_t level,
389 char *msg)
390 {
391 if (conf && (conf->verbosity < level)) {
392 return 0;
393 } else {
394 if ( level == OPKG_ERROR ){
395 push_error_list(&error_list, msg);
396 } else
397 printf(msg);
398 }
399 return 0;
400 }
401
402 int default_opkg_list_callback(char *name, char *desc, char *version,
403 pkg_state_status_t status, void *userdata)
404 {
405 if (desc)
406 printf("%s - %s - %s\n", name, version, desc);
407 else
408 printf("%s - %s\n", name, version);
409 return 0;
410 }
411
412 int default_opkg_files_callback(char *name, char *desc, char *version,
413 pkg_state_status_t status, void *userdata)
414 {
415 if (desc)
416 printf("%s\n", desc);
417 return 0;
418 }
419
420 int default_opkg_status_callback(char *name, int istatus, char *desc,
421 void *userdata)
422 {
423 printf("%s\n", desc);
424 return 0;
425 }
426
427 char* default_opkg_response_callback(char *question)
428 {
429 char *response = NULL;
430 printf(question);
431 fflush(stdout);
432 do {
433 response = (char *)file_read_line_alloc(stdin);
434 } while (response == NULL);
435 return response;
436 }
437
438 /* This is used for backward compatibility */
439 int
440 opkg_op (int argc, char *argv[])
441 {
442 int err, optind;
443 args_t args;
444 char *cmd_name;
445 opkg_cmd_t *cmd;
446 opkg_conf_t opkg_conf;
447
448 args_init (&args);
449
450 optind = args_parse (&args, argc, argv);
451 if (optind == argc || optind < 0)
452 {
453 args_usage ("opkg must have one sub-command argument");
454 }
455
456 cmd_name = argv[optind++];
457 /* Pigi: added a flag to disable the checking of structures if the command does not need to
458 read anything from there.
459 */
460 if ( !strcmp(cmd_name,"print-architecture") ||
461 !strcmp(cmd_name,"print_architecture") ||
462 !strcmp(cmd_name,"print-installation-architecture") ||
463 !strcmp(cmd_name,"print_installation_architecture") )
464 args.nocheckfordirorfile = 1;
465
466 /* Pigi: added a flag to disable the reading of feed files if the command does not need to
467 read anything from there.
468 */
469 if ( !strcmp(cmd_name,"flag") ||
470 !strcmp(cmd_name,"configure") ||
471 !strcmp(cmd_name,"remove") ||
472 !strcmp(cmd_name,"files") ||
473 !strcmp(cmd_name,"search") ||
474 !strcmp(cmd_name,"compare_versions") ||
475 !strcmp(cmd_name,"compare-versions") ||
476 !strcmp(cmd_name,"list_installed") ||
477 !strcmp(cmd_name,"list-installed") ||
478 !strcmp(cmd_name,"status") )
479 args.noreadfeedsfile = 1;
480
481 opkg_cb_message = default_opkg_message_callback;
482 opkg_cb_response = default_opkg_response_callback;
483 opkg_cb_status = default_opkg_status_callback;
484
485
486 err = opkg_conf_init (&opkg_conf, &args);
487 if (err)
488 {
489 opkg_print_error_list (&opkg_conf);
490 return err;
491 }
492
493 args_deinit (&args);
494
495 if ( strcmp(cmd_name, "files")==0)
496 opkg_cb_list = default_opkg_files_callback;
497 else
498 opkg_cb_list = default_opkg_list_callback;
499
500 cmd = opkg_cmd_find (cmd_name);
501 if (cmd == NULL)
502 {
503 fprintf (stderr, "%s: unknown sub-command %s\n", argv[0],
504 cmd_name);
505 args_usage (NULL);
506 }
507
508 if (cmd->requires_args && optind == argc)
509 {
510 fprintf (stderr,
511 "%s: the ``%s'' command requires at least one argument\n",
512 __FUNCTION__, cmd_name);
513 args_usage (NULL);
514 }
515
516 err = opkg_cmd_exec (cmd, &opkg_conf, argc - optind, (const char **) (argv + optind), NULL);
517
518 opkg_conf_deinit (&opkg_conf);
519
520 return err;
521 }