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 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); }