int iscsi_io_tcp_poll(iscsi_conn_t *conn, int timeout_ms) { int rc; struct pollfd pdesc; char serv[NI_MAXSERV], lserv[NI_MAXSERV]; struct sockaddr_storage ss; socklen_t len; pdesc.fd = conn->socket_fd; pdesc.events = POLLOUT; rc = poll(&pdesc, 1, timeout_ms); if (rc == 0) return 0; if (rc < 0) { getnameinfo((struct sockaddr *) &conn->saddr, sizeof(conn->saddr), conn->host, sizeof(conn->host), serv, sizeof(serv), NI_NUMERICHOST|NI_NUMERICSERV); log_error("cannot make connection to %s:%s (%s)", conn->host, serv, strerror(errno)); return rc; } len = sizeof(int); if (getsockopt(conn->socket_fd, SOL_SOCKET, SO_ERROR, (char *) &rc, &len) < 0) { log_error("getsockopt for connect poll failed\n"); return -1; } if (rc) { getnameinfo((struct sockaddr *) &conn->saddr, sizeof(conn->saddr), conn->host, sizeof(conn->host), serv, sizeof(serv), NI_NUMERICHOST|NI_NUMERICSERV); log_error("connect to %s:%s failed (%s)\n", conn->host, serv, strerror(rc)); return -rc; } len = sizeof(ss); if (log_level > 0 || !conn->session->netdev[0]) rc = getsockname(conn->socket_fd, (struct sockaddr *)&ss, &len); if (log_level > 0 && rc >= 0) { getnameinfo((struct sockaddr *) &conn->saddr, sizeof(conn->saddr), conn->host, sizeof(conn->host), serv, sizeof(serv), NI_NUMERICHOST|NI_NUMERICSERV); getnameinfo((struct sockaddr *) &ss, sizeof(ss), NULL, 0, lserv, sizeof(lserv), NI_NUMERICSERV); log_debug(1, "connected local port %s to %s:%s", lserv, conn->host, serv); } if (!conn->session->netdev[0] && rc >= 0) { struct ifaddrs *ifa; char *ifname; rc = getifaddrs(&ifa); if (rc < 0) log_error("getifaddrs failed with %d\n", errno); else { ifname = find_ifname(ifa, (union sockaddr_u *)&ss); if (ifname) set_dcb_priority(conn, ifname); freeifaddrs(ifa); } } return 1; }
int sock_init( char *_interface, char *_startIP, char *_endIP) { int rv; uchar *pb; uchar val; #ifdef WIN32 DWORD rvl; rvl = WSAStartup(0x0101,&lan_ws); if (rvl != 0) { printerr("init: WSAStartup(1.1) error %ld\n", rvl); return((int)rvl); } #else char findif; #endif if ((g_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SockInvalid) { printerr("socket: %s\n", showlasterr()); return(-1); } memset(&_srcaddr, 0, sizeof(_srcaddr)); _srcaddr.sin_family = AF_INET; _srcaddr.sin_port = htons(0); _srcaddr.sin_addr.s_addr = htonl(INADDR_ANY); #ifdef WIN32 { int ret; uchar osip[4]; uchar osmac[6]; uchar osname[64]; char ipstr[20]; char *temp_start; if (fBroadcastOk && (g_startDest[0] == 0)) { ret = GetFirstIP(osip,osmac,osname,fdebug); /*ilan.c*/ if (ret == 0) { // osip[3] = 0xFF; /*255 for broadcast*/ sprintf(ipstr,"%d.%d.%d.255",osip[0],osip[1],osip[2]); temp_start = ipstr; strcpy(g_startDest,temp_start); strcpy(g_endDest,temp_start); } else { /*use some defaults*/ strcpy(g_startDest,"255.255.255.255"); strcpy(g_endDest,"255.255.255.255"); } } } #elif defined(HPUX) { /*find the OS eth interface to use*/ char devname[INET_ADDRSTRLEN+1]; int i, n; n = 0; sprintf(devname,"lan%d",n); } #else { /*find the OS eth interface to use*/ struct sockaddr_in temp_sockaddr; char *temp_start; struct ifreq ifr; char devname[INET_ADDRSTRLEN+1]; int i, n; if (_interface == NULL) findif = 1; else if (_interface[0] == 0) findif = 1; else findif = 0; if (findif) { n = find_ifname(devname); if (n >= 0) { _interface = devname; findif = 0; } } if (findif) { /* try again to find the first active ethN interface */ n = -1; for (i = 0; (i < 16) && (n == -1); i++) { #ifdef SOLARIS sprintf(devname,"e1000g%d",i); #elif BSD sprintf(devname,"em%d",i); #else sprintf(devname,"eth%d",i); #endif strcpy(ifr.ifr_name, devname); ifr.ifr_addr.sa_family = AF_INET; if (ioctl(g_sockfd, SIOCGIFADDR, &ifr) >= 0) { /* valid IP address, so active interface, use it */ temp_sockaddr = *((struct sockaddr_in *)&ifr.ifr_addr); memcpy(&_srcaddr.sin_addr.s_addr, &temp_sockaddr.sin_addr.s_addr, sizeof(_srcaddr.sin_addr.s_addr)); strcpy(g_interface, devname); temp_start = inet_ntoa(temp_sockaddr.sin_addr); if (temp_start == NULL) temp_start = ""; else if (fBroadcastOk && (g_startDest[0] == 0)) { pb = (uchar *)&temp_sockaddr.sin_addr.s_addr; pb[3] = 0xFF; /*255 for broadcast*/ temp_start = inet_ntoa(temp_sockaddr.sin_addr); strcpy(g_startDest,temp_start); strcpy(g_endDest,temp_start); } printf("sock_init: found %s with %s\n",devname,temp_start); n = i; break; } } if (n < 0) rv = LAN_ERR_OTHER; /*-13*/ } else { /* valid _interface string */ if (strchr(_interface, '.') != NULL) { /* assume it is an IP address*/ if ((rv = inet_pton(AF_INET, _interface, &_srcaddr.sin_addr)) < 0) printerr("inet_pton: %s\n", showlasterr()); if (rv == 0) printerr("invalid interface address\n"); return(rv); } else { /* assume interface name, like eth0 */ strncpy(ifr.ifr_name, _interface, IFNAMSIZ); ifr.ifr_addr.sa_family = AF_INET; if (ioctl(g_sockfd, SIOCGIFADDR, &ifr) < 0) { printerr("ioctl(%s): %s\n", _interface, showlasterr()); return(-1); } temp_sockaddr = *((struct sockaddr_in *)&ifr.ifr_addr); memcpy(&_srcaddr.sin_addr.s_addr, &temp_sockaddr.sin_addr.s_addr, sizeof(_srcaddr.sin_addr.s_addr)); if (fBroadcastOk && (g_startDest[0] == 0)) { pb = (uchar *)&temp_sockaddr.sin_addr.s_addr; pb[3] = 0xFF; /*255 for broadcast*/ temp_start = inet_ntoa(temp_sockaddr.sin_addr); strcpy(g_startDest,temp_start); strcpy(g_endDest,temp_start); } } } } #endif if (fBroadcastOk) { rv = setsockopt(g_sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast_pings, sizeof(broadcast_pings)); if (rv) { printerr("setsockopt: %s\n", showlasterr()); return(-1); } } if (bind(g_sockfd, (struct sockaddr *)&_srcaddr, sizeof(_srcaddr)) < 0) { printerr("bind: %s\n", showlasterr()); return(-1); } rv = inet_aton(_startIP, &_startAddr); if (rv ) { _startAddr.s_addr = ntohl(_startAddr.s_addr); if (fdebug) show_ip(_startAddr.s_addr); pb = (unsigned char*)&_startAddr.s_addr; if (pb[0] < 1) printerr("Malformed begin IP: %s\n", _startIP); else if (!fBroadcastOk && (pb[0] >254) ) printerr("Malformed begin IP: %s\n", _startIP); else if (fBroadcastOk) { val = pb[0] & 0x0f; if (val == 0x0f) rv = 0; else printerr("Malformed begin broadcast IP: %s\n", _startIP); } else rv = 0; } else { printerr("Invalid begin IP: %s\n", _startIP); } if (rv) return(rv); rv = inet_aton(_endIP, &_endAddr); if (rv ) { _endAddr.s_addr = ntohl(_endAddr.s_addr); if (fdebug) show_ip(_endAddr.s_addr); pb = (unsigned char*)&_endAddr.s_addr; if (pb[0] < 1) printerr("Malformed end IP: %s\n", _endIP); else if (!fBroadcastOk && (pb[0] >254) ) printerr("Malformed end IP: %s\n", _endIP); else rv = 0; } else { printerr("Invalid end IP: %s\n", _endIP); } /* calculate g_num_packets */ g_num_packets = ntoi(_endAddr.s_addr) - ntoi(_startAddr.s_addr) + 1; if (fdebug) printerr("g_num_packets = %d\n",g_num_packets); if (g_num_packets < 1) g_num_packets = 0; return(rv); } /*end sock_init*/
int main(int argc, char *argv[]) { int s, r, n; struct sockaddr_in sin; char msg[NDIS_INDICATION_LEN]; struct rt_msghdr *rtm; struct if_msghdr *ifm; char ifname[IFNAMSIZ]; int ch; while ((ch = getopt(argc, argv, "dva")) != -1) { switch(ch) { case 'd': debug++; break; case 'v': verbose++; break; case 'a': all_events++; break; default: usage(); break; } } if (!debug && daemon(0, 0)) err(1, "failed to daemonize ourselves"); if (!debug) openlog(PROGNAME, LOG_PID | LOG_CONS, LOG_DAEMON); bzero((char *)&sin, sizeof(sin)); /* Create a datagram socket. */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) { dbgmsg("socket creation failed"); exit(1); } sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_port = htons(WPA_SUPPLICANT_PORT); /* Create a routing socket. */ r = socket (PF_ROUTE, SOCK_RAW, 0); if (r < 0) { dbgmsg("routing socket creation failed"); exit(1); } /* Now sit and spin, waiting for events. */ if (verbose) dbgmsg("Listening for events"); while (1) { n = read(r, msg, NDIS_INDICATION_LEN); rtm = (struct rt_msghdr *)msg; if (rtm->rtm_type != RTM_IFINFO) continue; ifm = (struct if_msghdr *)msg; if (find_ifname(ifm->ifm_index, ifname)) continue; if (strstr(ifname, "ndis")) { while(announce_event(ifname, s, &sin) == 0) ; } else { if (verbose) dbgmsg("Skipping ifinfo message from %s", ifname); } } /* NOTREACHED */ exit(0); }