#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "rpc.h" /* call ioctl system call */ ret_code if_ioctl(unsigned long request, caddr_t ifreq, int *ret) { int sock; int err = 0; if(ret) { *ret = 0; } sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { rpc_log_error("Cannot create UDP socket"); return RET_SOCKERR; } if ((err = ioctl(sock, request, ifreq)) < 0) { rpc_log_error("Ioctl error: %s\n", strerror(errno)); } close(sock); if (err < 0) { if(ret) { *ret = err; } return RET_SYSERR; } return RET_OK; } /* Set a certain interface flag. */ static int if_set_flag(char *ifname, short flag, int *code) { struct ifreq ifr = {0}; ret_code ret = RET_OK; strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1); ret = if_ioctl(SIOCGIFFLAGS, (caddr_t)&ifr, code); ASSERT_RET(ret); strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1); ifr.ifr_flags |= flag; ret = if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifr, code); ASSERT_RET(ret); return ret; } /* Clear a certain interface flag. */ static int if_clear_flag(char *ifname, short flag, int *code) { struct ifreq ifr = {0}; ret_code ret; strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1); ret = if_ioctl(SIOCGIFFLAGS, (caddr_t)&ifr, code); ASSERT_RET(ret); strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1); ifr.ifr_flags &= ~flag; ret = if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifr, code); ASSERT_RET(ret); return ret; } ret_code if_set_up(char *ifname, int *code) { return if_set_flag(ifname, (IFF_UP | IFF_RUNNING), code); } ret_code if_set_down(char *ifname, int *code) { return if_clear_flag(ifname, IFF_UP, code); }