static int cmd_initbus_run (urj_chain_t *chain, char *params[]) { int drv, i; const urj_param_t **bus_params; if (urj_cmd_params (params) < 2) { urj_error_set (URJ_ERROR_SYNTAX, "%s: #parameters should be >= %d, not %d", params[0], 2, urj_cmd_params (params)); return URJ_STATUS_FAIL; } if (urj_cmd_test_cable (chain) != URJ_STATUS_OK) return URJ_STATUS_FAIL; if (urj_tap_chain_active_part (chain) == NULL) return URJ_STATUS_FAIL; for (drv = 0; urj_bus_drivers[drv] != NULL; drv++) if (strcasecmp (urj_bus_drivers[drv]->name, params[1]) == 0) break; if (urj_bus_drivers[drv] == NULL) { urj_error_set (URJ_ERROR_NOTFOUND, _("Unknown bus: %s"), params[1]); return URJ_STATUS_FAIL; } urj_param_init (&bus_params); for (i = 2; params[i] != NULL; i++) if (urj_param_push (&urj_bus_param_list, &bus_params, params[i]) != URJ_STATUS_OK) { urj_param_clear (&bus_params); return URJ_STATUS_FAIL; } if (urj_bus_init_bus(chain, urj_bus_drivers[drv], bus_params) == NULL) { urj_param_clear (&bus_params); return URJ_STATUS_FAIL; } urj_param_clear (&bus_params); return URJ_STATUS_OK; }
int urj_param_init_list (const urj_param_t ***bp, char *params[], const urj_param_list_t *param_list) { int ret; size_t i; ret = urj_param_init (bp); if (ret != URJ_STATUS_OK) return ret; for (i = 0; params[i] != NULL; ++i) { ret = urj_param_push (param_list, bp, params[i]); if (ret != URJ_STATUS_OK) { urj_param_clear (bp); return ret; } } return URJ_STATUS_OK; }
int urj_tap_chain_connect (urj_chain_t *chain, const char *drivername, char *params[]) { urj_cable_t *cable; int j, paramc; const urj_param_t **cable_params; const urj_cable_driver_t *driver; urj_cable_parport_devtype_t devtype; const char *devname; int param_start; param_start = 0; paramc = urj_cmd_params (params); driver = urj_tap_cable_find (drivername); if (!driver) { urj_error_set (URJ_ERROR_INVALID, "unknown cable driver '%s'", drivername); return URJ_STATUS_FAIL; } if (driver->device_type == URJ_CABLE_DEVICE_PARPORT) { if (paramc < 2) { urj_error_set (URJ_ERROR_SYNTAX, "parallel cable requires >= 4 parameters, got %d", paramc); return URJ_STATUS_FAIL; } for (j = 0; j < URJ_CABLE_PARPORT_N_DEVS; j++) if (strcasecmp (params[0], urj_cable_parport_devtype_string (j)) == 0) break; if (j == URJ_CABLE_PARPORT_N_DEVS) { urj_error_set (URJ_ERROR_INVALID, "unknown parallel port device type '%s'", params[0]); return URJ_STATUS_FAIL; } devtype = j; devname = params[1]; param_start = 2; } else { /* Silence gcc uninitialized warnings */ devtype = -1; devname = NULL; } if (urj_param_init_list (&cable_params, ¶ms[param_start], &urj_cable_param_list) != URJ_STATUS_OK) return URJ_STATUS_FAIL; switch (driver->device_type) { case URJ_CABLE_DEVICE_PARPORT: cable = urj_tap_cable_parport_connect (chain, driver, devtype, devname, cable_params); break; case URJ_CABLE_DEVICE_USB: cable = urj_tap_cable_usb_connect (chain, driver, cable_params); break; case URJ_CABLE_DEVICE_OTHER: cable = urj_tap_cable_other_connect (chain, driver, cable_params); break; default: cable = NULL; break; } urj_param_clear (&cable_params); if (cable == NULL) return URJ_STATUS_FAIL; chain->cable->chain = chain; return URJ_STATUS_OK; }