How to find out if the eth0 mode is static or dhcp?

后端 未结 3 974
梦毁少年i
梦毁少年i 2020-12-20 19:51

I want to use a C program to get if the ip of the network interface is set manually or via dhcp.

I\'ve tried to use the following code and it has worked in Debian, b

相关标签:
3条回答
  • 2020-12-20 20:04

    There is AFAIK no definitive way.

    Reading the interfaces file would be a hint only: there is no guarantee that the current seup came from there.

    You could look at 'asking' the DBUS interface if there is one. You could check for a dhclient process running. You could check other files in /etc that specify network setup on different distros.

    I think the most reliable option would be a multi-layered thing: check a whole host of hints to come up with the answer.

    Another option: send a DHCP check packet to the dhcp server to verify the address.. if you don't get an answer though it could be that the network is down but was up when the address was allocated.

    0 讨论(0)
  • 2020-12-20 20:09

    for OpenWRT you can get a such information with the following command:

    $uci get network.lan.proto
    

    so I take the program you put in your question and I change only the command used to get information:

    #include <stdio.h> <br>
    int main(void)
    {
        FILE *fp;
        char buffer[80];
        fp=popen("uci get network.lan.proto","r");
        fgets(buffer, sizeof(buffer), fp);
        printf("%s", buffer);
        pclose(fp);
    }
    

    to see all network interfaces available in your OpenWRT you can use the following command:

    $uci show network
    

    You can avoid using calling linux command in your c by using the libuci. The libuci contains C function to execute uci commands without passing via popen ( popen is used to execute external command from shell).

    The libuci exist by default in the development environment of OpenWRT, not need to download it, no need to build it and no need to install it on your OpenWRT machine

    You can use libuci in this way

    #include <uci.h>
    void main()
    {
        char path[]="network.lan.proto";
        char buffer[80];
        struct  uci_ptr ptr;
        struct  uci_context *c = uci_alloc_context();
    
        if(!c) return;
    
        if ((uci_lookup_ptr(c, &ptr, path, true) != UCI_OK) ||
            (ptr.o==NULL || ptr.o->v.string==NULL)) { 
            uci_free_context(c);
            return;
        }
    
        if(ptr.flags & UCI_LOOKUP_COMPLETE)
                strcpy(buffer, ptr.o->v.string);
    
        uci_free_context(c);
    
        printf("%s\n", buffer);
    }
    

    (Not tested)

    and when you compile your program you have to add the -luci in the compilation command gcc

    0 讨论(0)
  • 2020-12-20 20:11

    There's no required way for an OS to decide how an interface should be configured. The kernel (the Linux part of e.g. GNU/Linux) doesn't decide, it doesn't (and shouldn't) care, it just gets told which network addresses go with which interfaces by whatever configuration system the OS is using. OpenWRT's not GNU, it operates differently.

    0 讨论(0)
提交回复
热议问题