| 1 | /* |
|---|
| 2 | * Initialize the library |
|---|
| 3 | * |
|---|
| 4 | * Copyright (C) 2003 Olaf Kirch <okir@suse.de> |
|---|
| 5 | */ |
|---|
| 6 | |
|---|
| 7 | #include "internal.h" |
|---|
| 8 | #include <stdlib.h> |
|---|
| 9 | #include <ltdl.h> |
|---|
| 10 | |
|---|
| 11 | static int configure_driver(ifd_conf_node_t * cf); |
|---|
| 12 | |
|---|
| 13 | int ifd_init(void) |
|---|
| 14 | { |
|---|
| 15 | unsigned int ival; |
|---|
| 16 | char *sval; |
|---|
| 17 | ifd_conf_node_t **nodes; |
|---|
| 18 | int i, n; |
|---|
| 19 | |
|---|
| 20 | /* initialize ltdl */ |
|---|
| 21 | i = lt_dlinit(); |
|---|
| 22 | if (i != 0) |
|---|
| 23 | ct_error("lt_dlinit returned %d", i); |
|---|
| 24 | |
|---|
| 25 | /* Register built-in drivers */ |
|---|
| 26 | ifd_acr30u_register(); |
|---|
| 27 | ifd_cardman_register(); |
|---|
| 28 | ifd_cm4000_register(); |
|---|
| 29 | ifd_egate_register(); |
|---|
| 30 | ifd_epass3k_register(); |
|---|
| 31 | ifd_etoken_register(); |
|---|
| 32 | ifd_etoken64_register(); |
|---|
| 33 | ifd_eutron_register(); |
|---|
| 34 | ifd_gempc_register(); |
|---|
| 35 | ifd_ikey2k_register(); |
|---|
| 36 | ifd_ikey3k_register(); |
|---|
| 37 | ifd_kaan_register(); |
|---|
| 38 | ifd_pertosmart_ac1030_register(); |
|---|
| 39 | ifd_pertosmart_ac1038_register(); |
|---|
| 40 | ifd_smartboard_register(); |
|---|
| 41 | ifd_smph_register(); |
|---|
| 42 | ifd_starkey_register(); |
|---|
| 43 | ifd_towitoko_register(); |
|---|
| 44 | ifd_rutoken_register(); |
|---|
| 45 | /* ifd_wbeiuu_register(); driver not working yet */ |
|---|
| 46 | ifd_cyberjack_register(); |
|---|
| 47 | /* ccid last */ |
|---|
| 48 | ifd_ccid_register(); |
|---|
| 49 | |
|---|
| 50 | /* Register all builtin protocols */ |
|---|
| 51 | ifd_protocol_register(&ifd_protocol_t0); |
|---|
| 52 | ifd_protocol_register(&ifd_protocol_t1); |
|---|
| 53 | ifd_protocol_register(&ifd_protocol_gbp); |
|---|
| 54 | ifd_protocol_register(&ifd_protocol_trans); |
|---|
| 55 | ifd_protocol_register(&ifd_protocol_i2c_short); |
|---|
| 56 | ifd_protocol_register(&ifd_protocol_i2c_long); |
|---|
| 57 | ifd_protocol_register(&ifd_protocol_2wire); |
|---|
| 58 | ifd_protocol_register(&ifd_protocol_3wire); |
|---|
| 59 | ifd_protocol_register(&ifd_protocol_eurochip); |
|---|
| 60 | ifd_protocol_register(&ifd_protocol_esc); |
|---|
| 61 | |
|---|
| 62 | if (ifd_conf_get_integer("debug", &ival) >= 0 && ival > ct_config.debug) |
|---|
| 63 | ct_config.debug = ival; |
|---|
| 64 | |
|---|
| 65 | if (ifd_conf_get_string("ifdhandler.program", &sval) >= 0) |
|---|
| 66 | ct_config.ifdhandler = sval; |
|---|
| 67 | |
|---|
| 68 | /* Register all driver information (use hotplug ids) */ |
|---|
| 69 | n = ifd_conf_get_nodes("driver", NULL, 0); |
|---|
| 70 | if (n >= 0) { |
|---|
| 71 | nodes = (ifd_conf_node_t **) calloc(n, sizeof(*nodes)); |
|---|
| 72 | if (!nodes) { |
|---|
| 73 | ct_error("out of memory"); |
|---|
| 74 | return 1; |
|---|
| 75 | } |
|---|
| 76 | n = ifd_conf_get_nodes("driver", nodes, n); |
|---|
| 77 | for (i = 0; i < n; i++) { |
|---|
| 78 | if (configure_driver(nodes[i])) { |
|---|
| 79 | free(nodes); |
|---|
| 80 | return 1; |
|---|
| 81 | } |
|---|
| 82 | } |
|---|
| 83 | free(nodes); |
|---|
| 84 | } |
|---|
| 85 | return 0; |
|---|
| 86 | } |
|---|
| 87 | |
|---|
| 88 | /* |
|---|
| 89 | * Configure a reader driver |
|---|
| 90 | */ |
|---|
| 91 | static int configure_driver(ifd_conf_node_t * cf) |
|---|
| 92 | { |
|---|
| 93 | const char *driver; |
|---|
| 94 | char **ids; |
|---|
| 95 | int j, n; |
|---|
| 96 | |
|---|
| 97 | if (!(driver = cf->value)) |
|---|
| 98 | return 1; |
|---|
| 99 | if ((n = ifd_conf_node_get_string_list(cf, "ids", NULL, 0)) >= 0) { |
|---|
| 100 | ids = (char **)calloc(n, sizeof(char *)); |
|---|
| 101 | if (!ids) { |
|---|
| 102 | ct_error("out of memory"); |
|---|
| 103 | return 1; |
|---|
| 104 | } |
|---|
| 105 | n = ifd_conf_node_get_string_list(cf, "ids", ids, n); |
|---|
| 106 | for (j = 0; j < n; j++) |
|---|
| 107 | ifd_driver_add_id(ids[j], driver); |
|---|
| 108 | free(ids); |
|---|
| 109 | } |
|---|
| 110 | return 0; |
|---|
| 111 | } |
|---|