diff --git a/canutils/slcan/slcan.c b/canutils/slcan/slcan.c index f6b6c4e3ccc..6515194dd09 100644 --- a/canutils/slcan/slcan.c +++ b/canutils/slcan/slcan.c @@ -137,8 +137,7 @@ static int caninit(char *candev, int *s, struct sockaddr_can *addr, syslog(LOG_ERR, "Error opening CAN socket\n"); return -1; } - strncpy(ifr.ifr_name, candev, 4); - ifr.ifr_name[4] = '\0'; + strlcpy(ifr.ifr_name, candev, IFNAMSIZ); ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name); if (!ifr.ifr_ifindex) { @@ -317,9 +316,22 @@ int main(int argc, char *argv[]) { /* open CAN interface */ - mode = 1; - debug_print("Open interface\n"); - ok_return(fd); + struct ifreq ifr; + + strlcpy(ifr.ifr_name, argv[1], IFNAMSIZ); + + ifr.ifr_flags = IFF_UP; + if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0) + { + syslog(LOG_ERR, "Open interface failed\n"); + fail_return(fd); + } + else + { + mode = 1; + debug_print("Open interface\n"); + ok_return(fd); + } } else if (buf[0] == 'S') { @@ -395,9 +407,22 @@ int main(int argc, char *argv[]) { /* close interface */ - mode = 0; - debug_print("Close interface\n"); - ok_return(fd); + struct ifreq ifr; + + strlcpy(ifr.ifr_name, argv[1], IFNAMSIZ); + + ifr.ifr_flags = 0; + if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0) + { + syslog(LOG_ERR, "Close interface failed\n"); + fail_return(fd); + } + else + { + mode = 0; + debug_print("Close interface\n"); + ok_return(fd); + } } else if (buf[0] == 'T') {