public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
* Failed to get interface list while using ioctl (WSAIoctl) compiled by cygwin
@ 2022-08-12 12:01 dragon
  2022-08-12 12:22 ` Marco Atzeri
  0 siblings, 1 reply; 2+ messages in thread
From: dragon @ 2022-08-12 12:01 UTC (permalink / raw)
  To: cygwin

Hi, 

    Thans for your attention.

    I had a problem doing porting the network part。I want to get a list of network devices that can be implemented on Linux with an ioctl interface. A set of ioctl interfaces is also provided on Windows called WSAIoctl with cmd SIO_GET_INTERFACE_LIST。The WSAIoctl interface is also encapsulated in cygwin and placed in /usr/include/w32api/, libs place in /usr/lib/w32api/ws2_32 . 

   The code implemented by this interface can work correctly after compilation in MinGW and MSVC environments. But the error code of 10045 is returned after cygwin compiles. I have tested on different win10 hosts with different cygwin1.dll, but it still returned 10045(not supported).

Cygwin winsup/cygwin/fhandler/socket_inet.cc also called WSAIoctl,it should workable, I don't understand why return error. 

I am new to cygwin,locating the issue was a bit difficult for me and hope to be able to get your help and response. 

   Thank you very much




The system environment and test code is as follows:

      host:  windows 10  (17134)

      cygwin version:   3.3.5

      gcc version:       11.3.0

gcc cmd:  gcc -C test.c -o test.exe -lws2_32

minGw cmd:  x86_64-w64-mingw32-gcc  test.c -o test.exe -lws2_32




test code is very simple, just like this:




#include <winsock2.h>

#include <ws2tcpip.h>




int main (int argc, char *argv[]){

    int s = SOCKET_ERROR;

    INTERFACE_INFO IOInfo[16];

    int ByteRet = 0;

    WSADATA wsa;

    int err = 0;

    

    if (WSAStartup (MAKEWORD(2,2), &wsa) != 0) {

        return -1;

    }

    s = WSASocket (AF_INET, SOCK_DGRAM, IPPROTO_IP, 0, 0, 0);

    if (s == SOCKET_ERROR){

        return -1;

    }

    err = WSAIoctl (s, SIO_GET_INTERFACE_LIST, 0 ,0 ,&IOInfo, sizeof (IOInfo), &ByteRet, 0 ,0);

   if (err != 0) {

      err = WSAGetLastError ();

       printf ("err:%d\r\n", err);

       return -err;

  }

    return 0;

}



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Failed to get interface list while using ioctl (WSAIoctl) compiled by cygwin
  2022-08-12 12:01 Failed to get interface list while using ioctl (WSAIoctl) compiled by cygwin dragon
@ 2022-08-12 12:22 ` Marco Atzeri
  0 siblings, 0 replies; 2+ messages in thread
From: Marco Atzeri @ 2022-08-12 12:22 UTC (permalink / raw)
  To: cygwin

[-- Attachment #1: Type: text/plain, Size: 834 bytes --]

On 12.08.2022 14:01, dragon wrote:
> Hi,
> 
>      Thans for your attention.
> 
>      I had a problem doing porting the network part。I want to get a list of network devices that can be implemented on Linux with an ioctl interface. A set of ioctl interfaces is also provided on Windows called WSAIoctl with cmd SIO_GET_INTERFACE_LIST。The WSAIoctl interface is also encapsulated in cygwin and placed in /usr/include/w32api/, libs place in /usr/lib/w32api/ws2_32 .

mixing Posix and W32 API is seldom a good idea.

The attached code provides the full list of Network interface and
some details as

internal_name:  {E9617ED6-8C03-4C53-AA3F-4FD6DBC596D5}
  flags:         AF_INET6 up multicast
  address:       fe80::9cbb:5d97:6ef:565%22
  friendly_name: LAN-Verbindung* 2

feel free to modify it for your purpose

Regards
Marco






[-- Attachment #2: get-interface.c --]
[-- Type: text/plain, Size: 2969 bytes --]

/* #define _GNU_SOURCE  * To get defns of NI_MAXSERV and NI_MAXHOST */
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>


void print_flags(unsigned int flags)
{
        const char* sep = "", *sp = " ";
        if (flags & IFF_UP) {
                printf("%sup", sep);
                sep = sp;
        }
        if (flags & IFF_BROADCAST) {
                printf("%sbroadcast", sep);
                sep = sp;
        }
        if (flags & IFF_LOOPBACK) {
                printf("%sloopback", sep);
                sep = sp;
        }
        if (flags & IFF_NOTRAILERS) {
                printf("%snotrailers", sep);
                sep = sp;
        }
        if (flags & IFF_RUNNING) {
                printf("%srunning", sep);
                sep = sp;
        }
        if (flags & IFF_PROMISC) {
                printf("%spromisc", sep);
                sep = sp;
        }
        if (flags & IFF_MULTICAST) {
                printf("%smulticast", sep);
                sep = sp;
        }
}

int main(int argc, char *argv[])
{
    struct ifaddrs *ifaddr, *ifa;
    int family, s, n;
    char host[NI_MAXHOST];

    struct ifreq ifr;
    struct ifreq_frndlyname iff;
    struct ifreq_frndlyname * iffp;
    
    struct ifaddrs_hwdata * ifhwdata;

    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }

    /* Walk through linked list, maintaining head pointer so we
       can free list later */

    for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
        if (ifa->ifa_addr == NULL)
            continue;

        family = ifa->ifa_addr->sa_family;

        /* Display interface name and family (including symbolic
           form of the latter for the common families) */

        printf("internal_name: \t%s\n",ifa->ifa_name);

	printf(" flags: \t%s ",
               (family == AF_INET) ? "AF_INET " :
               (family == AF_INET6) ? "AF_INET6" : "unknown ");

        print_flags(ifa->ifa_flags);
	printf("\n");

        /* For an AF_INET* interface address, display the address */

        if (family == AF_INET || family == AF_INET6) {
            s = getnameinfo(ifa->ifa_addr,
                    (family == AF_INET) ? sizeof(struct sockaddr_in) :
                                          sizeof(struct sockaddr_in6),
                    host, NI_MAXHOST,
                    NULL, 0, NI_NUMERICHOST);
            if (s != 0) {
                printf("getnameinfo() failed: %s\n", gai_strerror(s));
                exit(EXIT_FAILURE);
            }

            printf(" address:\t%s\n", host);
            ifhwdata=ifa->ifa_data;
            iffp=&(ifhwdata->ifa_frndlyname);
            printf(" friendly_name:\t%s\n\n", iffp->ifrf_friendlyname);

        }
    }

    freeifaddrs(ifaddr);
    exit(EXIT_SUCCESS);
}

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-08-12 12:22 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-12 12:01 Failed to get interface list while using ioctl (WSAIoctl) compiled by cygwin dragon
2022-08-12 12:22 ` Marco Atzeri

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).