Example #1
0
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;
}
Example #2
0
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*/
Example #3
0
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);
}