On 19/3/19 9:56, aitor_czr wrote:

Hi Nick,

On 19/3/19 9:21, Dr. Nikolaus Klepp wrote:
You might call me ignorant, but with bash this can be done a bit simpler (this 
is from my solution to the detect-if-kable-present-while-booting-problem):-)

#!/bin/bash

while sleep 1; do
     for i in /sys/class/net/eth*; do
         VAR=$(basename $i)
         VAL=$(sed -n 's/0/UN/p' $i/carrier)PLUGGED
         if [ "${!VAR}" != "$VAL" ]; then
             echo $VAR $VAL
             declare $VAR=$VAL
         fi
     done
done


Nik
Thanks for your script! Interesting to know... With a short look, i seems to read the value content in the /sys/class/eth0/carrier file, set to "0" or "1". I was thinking about this possibility a couple of days ago, but i'm not pretty sure if its value also depends on the status of the network hotpluggable device. I'm testing it... On the other hand, here you are the code used in the ethtool-lite.c file of the netcfg udeb package used by debian-installer, doing something similar (in the case of the FreeBSD kernel
it uses a raw socket instead):

    int len = strlen(SYSCLASSNET) + strlen(iface) + strlen("/carrier") + 1;
    char* filename = malloc(len);
    snprintf(filename, len, SYSCLASSNET "%s/carrier", iface);
    FILE* fp = fopen(filename, "r");
    free(filename);

    char result[2];
    if (fgets(result, sizeof(result), fp) == NULL) {
        fclose(fp);
        if (errno == EINVAL) {
            di_info("ethtool-lite: %s is down", iface);
            return DISCONNECTED;
        }
        di_error("ethtool-lite: getting carrier failed: %s",
            strerror(errno));
        return UNKNOWN;
    }
    fclose(fp);

    switch (result[0]) {
    case '1':
        di_info("ethtool-lite: %s: carrier up", iface);
        return CONNECTED;
    case '0':
        di_info("ethtool-lite: %s: carrier down", iface);
        return DISCONNECTED;
    }
    di_info("ethtool-lite: %s: could not determine carrier state; got \"%s\"",
        iface, result);
    return UNKNOWN;

Cheers,

#if defined(__linux__)

    /* The above code */

#elif defined(__FreeBSD_kernel__)
    int fd = socket(AF_INET, SOCK_DGRAM, 0);

    if (fd < 0)
    {
        di_warning("ethtool-lite: could not open control socket\n");
        return UNKNOWN;

    }


_______________________________________________
Dng mailing list
Dng@lists.dyne.org
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to