{
struct tfm_context ctx;
const char *part_table = "/usr/share/partition.info";
+ char *opt_table = NULL;
int ret, opt;
memset(&ctx, 0, sizeof(ctx));
switch (opt) {
case 'i':
if (optarg) {
- part_table = strdup(optarg);
+ if (opt_table)
+ free(opt_table);
+ opt_table = strdup(optarg);
+ part_table = opt_table;
} else {
fprintf(stderr,
"path should be specified with '-i'\n");
- exit(-1);
+ ret = -1;
+ goto out;
}
break;
case 'p':
if (*optarg == '\0' || (endptr && *endptr != '\0')) {
fprintf(stderr,
"value should be provided as a number for '-p'\n");
- exit(-1);
+ ret = -1;
+ goto out_optfree;
}
ctx.port = (int)val;
break;
}
default:
- return 0;
+ ret = -1;
+ goto out_optfree;
}
}
ret = dfu_init(&ctx, part_table);
- if (ret < 0)
- exit(-1);
+ if (ret < 0) {
+ ret = -1;
+ goto out_optfree;
+ }
ret = net_connect(&ctx);
if (ret < 0) {
- dfu_exit(&ctx);
- exit(-1);
+ ret = -1;
+ goto out_dfuexit;
}
ret = thor_init(&ctx);
if (ret < 0) {
- net_disconnect(&ctx);
- dfu_exit(&ctx);
- exit(-1);
+ ret = -1;
+ goto out_netdisconn;
}
ret = thor_process(&ctx);
if (ret < 0) {
- net_disconnect(&ctx);
- dfu_exit(&ctx);
- exit(-1);
+ ret = -1;
+ goto out_netdisconn;
}
+out_netdisconn:
net_disconnect(&ctx);
+
+out_dfuexit:
dfu_exit(&ctx);
- exit(0);
+
+out_optfree:
+ if (opt_table)
+ free(opt_table);
+
+out:
+ exit(ret);
}
int main(int argc, char *argv[])