|
25 | 25 | #include <linux/can/error.h> |
26 | 26 | #include <linux/can/raw.h> |
27 | 27 | #include <net/if.h> |
| 28 | +#include <stdarg.h> |
28 | 29 | #include <stdbool.h> |
29 | 30 | #include <stdint.h> |
30 | 31 | #include <stdio.h> |
@@ -122,27 +123,25 @@ void show_help_and_exit() |
122 | 123 | exit(EXIT_SUCCESS); |
123 | 124 | } |
124 | 125 |
|
125 | | -void err_exit(const char *msg) |
| 126 | +void __attribute__((format (printf, 1, 2))) err_exit(const char *format, ...) |
126 | 127 | { |
127 | | - printf("%s", msg); |
128 | | - exit(EXIT_FAILURE); |
129 | | -} |
| 128 | + va_list ap; |
130 | 129 |
|
131 | | -void show_custom_format_and_exit(const char *param, const char *format) |
132 | | -{ |
133 | | - char str_buf[80]; |
134 | | - sprintf(str_buf, format, param); |
135 | | - err_exit(str_buf); |
| 130 | + va_start(ap, format); |
| 131 | + vfprintf(stdout, format, ap); |
| 132 | + va_end(ap); |
| 133 | + |
| 134 | + exit(EXIT_FAILURE); |
136 | 135 | } |
137 | 136 |
|
138 | 137 | void show_invalid_option(const char *option) |
139 | 138 | { |
140 | | - show_custom_format_and_exit(option, "Error: Invalid option %s\n"); |
| 139 | + err_exit("Error: Invalid option %s\n", option); |
141 | 140 | } |
142 | 141 |
|
143 | 142 | void show_err_and_exit(const char *err_type) |
144 | 143 | { |
145 | | - show_custom_format_and_exit(err_type, "Error: You can only have one %s parameter!\n"); |
| 144 | + err_exit("Error: You can only have one %s parameter!\n", err_type); |
146 | 145 | } |
147 | 146 |
|
148 | 147 | void show_loc_err_and_exit() |
@@ -176,7 +175,6 @@ int main(int argc, char *argv[]) |
176 | 175 | struct ifreq ifr; |
177 | 176 | struct can_frame frame; |
178 | 177 | bool show_bits = false, location_processed = false, transceiver_processed = false, arbitration_processed = false; |
179 | | - char tmp_str[256]; |
180 | 178 |
|
181 | 179 | printf("CAN Sockets Error Messages Simulator\n"); |
182 | 180 | if (argc < 3) |
@@ -537,24 +535,25 @@ int main(int argc, char *argv[]) |
537 | 535 |
|
538 | 536 | // create socket |
539 | 537 | if ((sock = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) |
540 | | - err_exit("Error while opening socket"); |
| 538 | + err_exit("Error while opening socket\n"); |
541 | 539 |
|
542 | 540 | // set interface name |
| 541 | + if (strlen(argv[1]) >= IFNAMSIZ) |
| 542 | + err_exit("Name of CAN device '%s' is too long!\n\n", argv[1]); |
| 543 | + |
543 | 544 | strcpy(ifr.ifr_name, argv[1]); // can0, vcan0... |
544 | | - if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) { |
545 | | - sprintf(tmp_str, "Error setting CAN interface name %s", argv[1]); |
546 | | - err_exit(tmp_str); |
547 | | - } |
| 545 | + if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) |
| 546 | + err_exit("Error setting CAN interface name %s\n", argv[1]); |
548 | 547 |
|
549 | 548 | // bind socket to the CAN interface |
550 | 549 | addr.can_family = AF_CAN; |
551 | 550 | addr.can_ifindex = ifr.ifr_ifindex; |
552 | 551 | if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) |
553 | | - err_exit("Error in socket bind"); |
| 552 | + err_exit("Error in socket bind\n"); |
554 | 553 |
|
555 | 554 | // Send CAN error frame |
556 | 555 | if (write(sock, &frame, sizeof(frame)) < 0) |
557 | | - err_exit("Error writing to socket"); |
| 556 | + err_exit("Error writing to socket\n"); |
558 | 557 | else |
559 | 558 | printf("CAN error frame sent\n"); |
560 | 559 |
|
|
0 commit comments