delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2012/03/07/13:52:22

X-Recipient: archive-cygwin AT delorie DOT com
X-SWARE-Spam-Status: No, hits=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW
X-Spam-Check-By: sourceware.org
MIME-Version: 1.0
Date: Wed, 7 Mar 2012 12:51:53 -0600
Message-ID: <CALAQL3J43=MA-fFHSd-VVyuJ_n1cpAuEQ1zpxvrRDXptQk8sSQ@mail.gmail.com>
Subject: Anamoly with ioctl() in cygwin 1.7.10
From: Lee Collier <klcollierjr AT gmail DOT com>
To: cygwin AT cygwin DOT com
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

Hello,

I'm new to cygwin and ran into an anamoly with calling ioctl() that
I've not experienced on Linux. It appears that ioctl() behaves as
expected when it is called from the main thread; however, it does not
when called from a thread created by the main thread. Is this expected
behavior when using cygwin?

I've added a sample program to demonstrate the anomaly. The call to
listInterfaces() from main() will function properly. The call to
listInterfaces() from handlePackets() will fail at ioctl(sck,
SIOCGIFCONF, &ifc); however, the errno result reported by perror is
"No error".

Regards,
LC

#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <pthread.h>

int listInterfaces(void);
void* handlePackets (void* data);

int main(void)
{
   pthread_t pktHandlerThreadId;
   pthread_mutex_t pktMutex;

   printf("Result from main thread:\n");
   listInterfaces();
   pthread_mutex_lock(&pktMutex);
   pthread_create(&pktHandlerThreadId, NULL, &handlePackets, &pktMutex);
   pthread_mutex_unlock(&pktMutex);
   pthread_join(pktHandlerThreadId, NULL); //Wait until Event Handler
thread exits..
   printf("\nProgram is exiting.\n");
   return 0;
}


void * handlePackets(void* data)
{
  	pthread_mutex_t *pktMutex;
  	pktMutex = (pthread_mutex_t *)data;
  	pthread_mutex_lock(pktMutex);
  	printf("\nResult from packet handler thread:\n");
  	pktMutex = (pthread_mutex_t *)data;
    listInterfaces();
  	pthread_mutex_unlock(pktMutex);
    return NULL;
}

int listInterfaces(void)
{
	int retVal =0;
    /*
      Example code to obtain IP and MAC for all available interfaces on Linux.
      by Adam Pierce <adam AT doctort DOT org>

    http://www.doctort.org/adam/
    */
    char          buf[1024];
    struct ifconf ifc;
    struct ifreq *ifr;
    int           sck;
    int           nInterfaces;
    int           i;

    /* Get a socket handle. */
    sck = socket(AF_INET, SOCK_DGRAM, 0);
    if(sck < 0)
    {
    	perror("socket");
    	return -1;
    }

    /* Query available interfaces. */
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = buf;
    if(ioctl(sck, SIOCGIFCONF, &ifc) < 0)
    {
    	perror("ioctl(SIOCGIFCONF)");
		return -1;
    }

    /* Iterate through the list of interfaces. */
    ifr         = ifc.ifc_req;
    nInterfaces = ifc.ifc_len / sizeof(struct ifreq);
    for(i = 0; i < nInterfaces; i++)
    {
    	struct ifreq *item = &ifr[i];
		/* Show the device name and IP address */
		printf("%s: IP %s",
			   item->ifr_name,
			   inet_ntoa(((struct sockaddr_in *)&item->ifr_addr)->sin_addr));

		/* Get the MAC address */
		if(ioctl(sck, SIOCGIFHWADDR, item) < 0)
		{
			perror("ioctl(SIOCGIFHWADDR)");
			return -1;
		}

		/* Get the broadcast address (added by Eric) */
		if(ioctl(sck, SIOCGIFBRDADDR, item) >= 0)
				printf(", BROADCAST %s", inet_ntoa(((struct sockaddr_in
*)&item->ifr_broadaddr)->sin_addr));
		printf("\n");
    }
	return retVal;
}

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019