inline static void initClientFD(struct FdInfo *fd, /*@in@*//*@observer@*/struct InterfaceInfo const *iface) /*@globals internalState, fileSystem@*/ /*@modifies internalState, fileSystem, *fd@*/ { struct sockaddr_in s; int const ON = 1; assert(fd!=0 && iface!=0); fd->iface = iface; fd->fd = Esocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); Esetsockopt(fd->fd, SOL_IP, IP_PKTINFO, &ON, sizeof ON); Esetsockopt(fd->fd, SOL_SOCKET, SO_BROADCAST, &ON, sizeof ON); Esetsockopt(fd->fd, SOL_SOCKET, SO_REUSEADDR, &ON, sizeof ON); Esetsockopt(fd->fd, SOL_SOCKET, SO_BINDTODEVICE, iface->name, strlen(iface->name)+1); memset(&s, 0, sizeof(s)); /*@-type@*/ s.sin_family = AF_INET; /*@=type@*/ s.sin_port = htons(DHCP_PORT_SERVER); s.sin_addr.s_addr = htonl(INADDR_ANY); Ebind(fd->fd, &s); }
static int doit(char const *filename, struct timeval *timeout) { int fd; struct sockaddr_un sock; pid_t pid; fd_set fdset; ENSC_INIT_UNIX_SOCK(sock, filename); fd = Esocket(PF_UNIX, SOCK_STREAM, 0); Ebind(fd, &sock, sizeof sock); Elisten(fd, 5); printXid(1); FD_ZERO(&fdset); FD_SET(fd, &fdset); pid = Efork(); if (pid==0) { Eselect(fd+1, &fdset, 0,0, timeout); if (FD_ISSET(fd, &fdset)) handleMessage(fd); exit(1); } return EXIT_SUCCESS; }
inline static void initRawFD(/*@out@*/int *fd) /*@globals internalState@*/ /*@modifies internalState, *fd@*/ /*@requires maxSet(fd)==0@*/ { assert(fd!=0); *fd = Esocket(AF_PACKET, SOCK_RAW, 0xFFFF); }
static int sendQuitSignal(char const *filename, char const *msg) { int fd; struct sockaddr_un addr; ENSC_INIT_UNIX_SOCK(addr, filename); fd = Esocket(PF_UNIX, SOCK_STREAM, 0); Econnect(fd, &addr, sizeof(addr)); if (msg) EsendAll(fd, msg, strlen(msg)); Eclose(fd); return EXIT_SUCCESS; }
inline static void fillInterfaceInfo(struct InterfaceInfoList *ifs) /*@globals fileSystem, internalState@*/ /*@modifies ifs->dta, fileSystem, internalState@*/ /*@requires maxRead(ifs->dta)==ifs->len /\ maxRead(ifs)==0@*/ { int fd = Esocket(AF_INET, SOCK_DGRAM, 0); size_t i; assert(ifs->len==0 || ifs->dta!=0); for (i=0; i<ifs->len; ++i) { struct ifreq iface; struct InterfaceInfo *ifinfo; assert(ifs->dta!=0); ifinfo = &ifs->dta[i]; memcpy(iface.ifr_name, ifinfo->name, IFNAMSIZ); if (ioctl(fd, SIOCGIFINDEX, &iface)==-1) goto err; if (iface.ifr_ifindex<0) goto err; ifinfo->if_idx = (unsigned int)(iface.ifr_ifindex); if (ioctl(fd, SIOCGIFADDR, &iface)==-1) goto err; ifinfo->if_real_ip = sockaddrToInet4(&iface.ifr_addr); if (ioctl(fd, SIOCGIFMTU, &iface)==-1) goto err; ifinfo->if_mtu = static_cast(size_t)(iface.ifr_mtu); if (!ifinfo->need_mac) ifinfo->if_maclen = 0; else { if (ioctl(fd, SIOCGIFHWADDR, &iface)==-1) goto err; sockaddrToHwAddr(&iface.ifr_hwaddr, ifinfo->if_mac, &ifinfo->if_maclen); } if (ifinfo->if_ip==INADDR_NONE) ifinfo->if_ip = ifinfo->if_real_ip; } Eclose(fd); return; err: perror("ioctl()"); scEXITFATAL("Can not get interface information"); }
inline static void initSenderFD(/*@out@*/int *fd) /*@globals internalState, fileSystem@*/ /*@modifies internalState, fileSystem, *fd@*/ /*@requires maxRead(fd)==0 /\ maxSet(fd)==0@*/ { struct sockaddr_in s; assert(fd!=0); *fd = Esocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); memset(&s, 0, sizeof(s)); /*@-type@*/ s.sin_family = AF_INET; /*@=type@*/ s.sin_port = htons(DHCP_PORT_CLIENT); s.sin_addr.s_addr = htonl(INADDR_ANY); Ebind(*fd, &s); }