static errno_t utun_detach_ip( ifnet_t interface, protocol_family_t protocol, socket_t pf_socket) { errno_t result = EPROTONOSUPPORT; /* Attempt a detach */ if (protocol == PF_INET) { struct ifreq ifr; bzero(&ifr, sizeof(ifr)); snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", ifnet_name(interface), ifnet_unit(interface)); result = sock_ioctl(pf_socket, SIOCPROTODETACH, &ifr); } else if (protocol == PF_INET6) { struct in6_ifreq ifr6; bzero(&ifr6, sizeof(ifr6)); snprintf(ifr6.ifr_name, sizeof(ifr6.ifr_name), "%s%d", ifnet_name(interface), ifnet_unit(interface)); result = sock_ioctl(pf_socket, SIOCPROTODETACH_IN6, &ifr6); } return result; }
static void utun_remove_address( ifnet_t interface, protocol_family_t protocol, ifaddr_t address, socket_t pf_socket) { errno_t result = 0; /* Attempt a detach */ if (protocol == PF_INET) { struct ifreq ifr; bzero(&ifr, sizeof(ifr)); snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", ifnet_name(interface), ifnet_unit(interface)); result = ifaddr_address(address, &ifr.ifr_addr, sizeof(ifr.ifr_addr)); if (result != 0) { printf("utun_remove_address - ifaddr_address failed: %d", result); } else { result = sock_ioctl(pf_socket, SIOCDIFADDR, &ifr); if (result != 0) { printf("utun_remove_address - SIOCDIFADDR failed: %d", result); } } } else if (protocol == PF_INET6) { struct in6_ifreq ifr6; bzero(&ifr6, sizeof(ifr6)); snprintf(ifr6.ifr_name, sizeof(ifr6.ifr_name), "%s%d", ifnet_name(interface), ifnet_unit(interface)); result = ifaddr_address(address, (struct sockaddr*)&ifr6.ifr_addr, sizeof(ifr6.ifr_addr)); if (result != 0) { printf("utun_remove_address - ifaddr_address failed (v6): %d", result); } else { result = sock_ioctl(pf_socket, SIOCDIFADDR_IN6, &ifr6); if (result != 0) { printf("utun_remove_address - SIOCDIFADDR_IN6 failed: %d", result); } } } }
int ioctl_decode(struct tcb *tcp, long code, long arg) { switch ((code >> 8) & 0xff) { #if defined(ALPHA) || defined(POWERPC) case 'f': case 't': case 'T': #else /* !ALPHA */ case 0x54: #endif /* !ALPHA */ return term_ioctl(tcp, code, arg); case 0x89: return sock_ioctl(tcp, code, arg); case 'p': return rtc_ioctl(tcp, code, arg); case 0x03: case 0x12: return block_ioctl(tcp, code, arg); case 0x22: return scsi_ioctl(tcp, code, arg); case 'L': return loop_ioctl(tcp, code, arg); case 'M': return mtd_ioctl(tcp, code, arg); default: break; } return 0; }
int fifo_charcount(struct vnode *vp, int *count) { int mcount; int err = sock_ioctl(vp->v_fifoinfo->fi_readsock, FIONREAD, (void*)&mcount); if (err == 0) { *count = mcount; } return err; }
static int ioctl_decode(struct tcb *tcp) { const unsigned int code = tcp->u_arg[1]; const long arg = tcp->u_arg[2]; switch (_IOC_TYPE(code)) { #if defined(ALPHA) || defined(POWERPC) case 'f': case 't': case 'T': #else /* !ALPHA */ case 0x54: #endif /* !ALPHA */ return term_ioctl(tcp, code, arg); case 0x89: return sock_ioctl(tcp, code, arg); case 'p': return rtc_ioctl(tcp, code, arg); case 0x03: case 0x12: case 'X': return block_ioctl(tcp, code, arg); #ifdef HAVE_SCSI_SG_H case 0x22: return scsi_ioctl(tcp, code, arg); #endif case 'L': return loop_ioctl(tcp, code, arg); case 'M': return mtd_ioctl(tcp, code, arg); case 'o': case 'O': return ubi_ioctl(tcp, code, arg); case 'V': return v4l2_ioctl(tcp, code, arg); case '=': return ptp_ioctl(tcp, code, arg); #ifdef HAVE_LINUX_INPUT_H case 'E': return evdev_ioctl(tcp, code, arg); #endif default: break; } return 0; }
int libcfs_ipif_query (char *name, int *up, __u32 *ip, __u32 *mask) { struct ifreq ifr; socket_t so; __u32 val; int nob; int rc; rc = -sock_socket(PF_INET, SOCK_STREAM, 0, NULL, NULL, &so); if (rc != 0) { CERROR ("Can't create socket: %d\n", rc); return rc; } nob = strnlen(name, IFNAMSIZ); if (nob == IFNAMSIZ) { CERROR("Interface name %s too long\n", name); rc = -EINVAL; goto out; } CLASSERT (sizeof(ifr.ifr_name) >= IFNAMSIZ); bzero(&ifr, sizeof(ifr)); strcpy(ifr.ifr_name, name); rc = -sock_ioctl (so, SIOCGIFFLAGS, &ifr); if (rc != 0) { CERROR("Can't get flags for interface %s\n", name); goto out; } if ((ifr.ifr_flags & IFF_UP) == 0) { CDEBUG(D_NET, "Interface %s down\n", name); *up = 0; *ip = *mask = 0; goto out; } *up = 1; bzero(&ifr, sizeof(ifr)); strcpy(ifr.ifr_name, name); *((struct sockaddr_in *)&ifr.ifr_addr) = blank_sin(); rc = -sock_ioctl(so, SIOCGIFADDR, &ifr); if (rc != 0) { CERROR("Can't get IP address for interface %s\n", name); goto out; } val = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; *ip = ntohl(val); bzero(&ifr, sizeof(ifr)); strcpy(ifr.ifr_name, name); *((struct sockaddr_in *)&ifr.ifr_addr) = blank_sin(); rc = -sock_ioctl(so, SIOCGIFNETMASK, &ifr); if (rc != 0) { CERROR("Can't get netmask for interface %s\n", name); goto out; } val = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; *mask = ntohl(val); out: sock_close(so); return rc; }
int libcfs_ipif_enumerate (char ***namesp) { /* Allocate and fill in 'names', returning # interfaces/error */ char **names; int toobig; int nalloc; int nfound; socket_t so; struct ifreq *ifr; struct ifconf ifc; int rc; int nob; int i; rc = -sock_socket(PF_INET, SOCK_STREAM, 0, NULL, NULL, &so); if (rc != 0) { CERROR ("Can't create socket: %d\n", rc); return (rc); } nalloc = 16; /* first guess at max interfaces */ toobig = 0; for (;;) { if (nalloc * sizeof(*ifr) > CFS_PAGE_SIZE) { toobig = 1; nalloc = CFS_PAGE_SIZE/sizeof(*ifr); CWARN("Too many interfaces: only enumerating first %d\n", nalloc); } LIBCFS_ALLOC(ifr, nalloc * sizeof(*ifr)); if (ifr == NULL) { CERROR ("ENOMEM enumerating up to %d interfaces\n", nalloc); rc = -ENOMEM; goto out0; } ifc.ifc_buf = (char *)ifr; ifc.ifc_len = nalloc * sizeof(*ifr); #if 1 /* * XXX Liang: * sock_ioctl(..., SIOCGIFCONF, ...) is not supposed to be used in * kernel space because it always try to copy result to userspace. * So we can't get interfaces name by sock_ioctl(...,SIOCGIFCONF,...). * I've created a bug for Apple, let's wait... */ nfound = 0; for (i = 0; i < 16; i++) { struct ifreq en; bzero(&en, sizeof(en)); snprintf(en.ifr_name, IFNAMSIZ, "en%d", i); rc = -sock_ioctl (so, SIOCGIFFLAGS, &en); if (rc != 0) continue; strcpy(ifr[nfound++].ifr_name, en.ifr_name); } #else /* NOT in using now */ rc = -sock_ioctl(so, SIOCGIFCONF, (caddr_t)&ifc); if (rc < 0) { CERROR ("Error %d enumerating interfaces\n", rc); goto out1; } nfound = ifc.ifc_len/sizeof(*ifr); LASSERT (nfound <= nalloc); #endif if (nfound < nalloc || toobig) break; LIBCFS_FREE(ifr, nalloc * sizeof(*ifr)); nalloc *= 2; } if (nfound == 0) goto out1; LIBCFS_ALLOC(names, nfound * sizeof(*names)); if (names == NULL) { rc = -ENOMEM; goto out1; } /* NULL out all names[i] */ memset (names, 0, nfound * sizeof(*names)); for (i = 0; i < nfound; i++) { nob = strnlen (ifr[i].ifr_name, IFNAMSIZ); if (nob == IFNAMSIZ) { /* no space for terminating NULL */ CERROR("interface name %.*s too long (%d max)\n", nob, ifr[i].ifr_name, IFNAMSIZ); rc = -ENAMETOOLONG; goto out2; } LIBCFS_ALLOC(names[i], IFNAMSIZ); if (names[i] == NULL) { rc = -ENOMEM; goto out2; } memcpy(names[i], ifr[i].ifr_name, nob); names[i][nob] = 0; } *namesp = names; rc = nfound; out2: if (rc < 0) libcfs_ipif_free_enumeration(names, nfound); out1: LIBCFS_FREE(ifr, nalloc * sizeof(*ifr)); out0: sock_close(so); return rc; }
static int ioctl_decode(struct tcb *tcp) { const unsigned int code = tcp->u_arg[1]; const kernel_ulong_t arg = tcp->u_arg[2]; switch (_IOC_TYPE(code)) { #if defined(ALPHA) || defined(POWERPC) case 'f': { int ret = file_ioctl(tcp, code, arg); if (ret != RVAL_DECODED) return ret; } case 't': case 'T': return term_ioctl(tcp, code, arg); #else /* !ALPHA */ case 'f': return file_ioctl(tcp, code, arg); case 0x54: #endif /* !ALPHA */ return term_ioctl(tcp, code, arg); case 0x89: return sock_ioctl(tcp, code, arg); case 'p': return rtc_ioctl(tcp, code, arg); case 0x03: return hdio_ioctl(tcp, code, arg); case 0x12: return block_ioctl(tcp, code, arg); case 'X': return fs_x_ioctl(tcp, code, arg); case 0x22: return scsi_ioctl(tcp, code, arg); case 'L': return loop_ioctl(tcp, code, arg); case 'M': return mtd_ioctl(tcp, code, arg); case 'o': case 'O': return ubi_ioctl(tcp, code, arg); case 'V': return v4l2_ioctl(tcp, code, arg); case '=': return ptp_ioctl(tcp, code, arg); #ifdef HAVE_LINUX_INPUT_H case 'E': return evdev_ioctl(tcp, code, arg); #endif #ifdef HAVE_LINUX_USERFAULTFD_H case 0xaa: return uffdio_ioctl(tcp, code, arg); #endif #ifdef HAVE_LINUX_BTRFS_H case 0x94: return btrfs_ioctl(tcp, code, arg); #endif #ifdef HAVE_LINUX_DM_IOCTL_H case 0xfd: return dm_ioctl(tcp, code, arg); #endif default: break; } return 0; }