void chain_free( chain_t *chain ) { if (!chain) return; chain_disconnect( chain ); parts_free( chain->parts ); free( chain ); }
static int cmd_cable_run( chain_t *chain, char *params[] ) { cable_t *cable; int i; int paramc = cmd_params( params ); /* we need at least one parameter for 'cable' command */ if (paramc < 2) return -1; /* maybe old syntax was used? search connection type driver */ for (i = 0; parport_drivers[i]; i++) if (strcasecmp( params[1], parport_drivers[i]->type ) == 0) break; if (parport_drivers[i] != 0) { /* Old syntax was used. Swap params. */ printf( _("Note: the 'cable' command syntax changed, please read the help text\n") ); if (paramc >= 4) { char *tmparam; tmparam = params[3]; params[3] = params[2]; params[2] = params[1]; params[1] = tmparam; } else return -1; } /* search cable driver list */ for (i = 0; cable_drivers[i]; i++) if (strcasecmp( params[1], cable_drivers[i]->name ) == 0) break; if (!cable_drivers[i]) { printf( _("Unknown cable type: %s\n"), params[1] ); return 1; } if (paramc >= 3) { if (strcasecmp( params[2], "help" ) == 0) { cable_drivers[i]->help(cable_drivers[i]->name); return 1; } } if (bus) { bus_free( bus ); bus = NULL; } chain_disconnect( chain ); cable = calloc(1, sizeof(cable_t) ); if (!cable) { printf( _("%s(%d) malloc failed!\n"), __FILE__, __LINE__); return 1; } cable->driver = cable_drivers[i]; if ( cable->driver->connect( ++params, cable ) ) { printf( _("Error: Cable connection failed!\n") ); free( cable ); return 1; } chain->cable = cable; if (cable_init( chain->cable )) { printf( _("Error: Cable initialization failed!\n") ); chain_disconnect( chain ); return 1; } chain_set_trst( chain, 0 ); chain_set_trst( chain, 1 ); tap_reset( chain ); return 1; }