On Mon, 2016-12-05 at 15:37 +0800, Shih-Yuan Lee (FourDollars) wrote:
> The sysfs path may not exist due to race conditions while accessing
> sysfs.
> 
> It's better to check the prefix 'wlan' as the last fallback method.
> 
> For example, 'wlan0' has been renamed to 'wlp1s0', but it's still
> checking
> 'wlan0' above so it will always fail.
> 
> You can see this problem below.

Hi,


I think it would be better to solve this differently. Relying on a
certain name is a terrible hack.

The problem exists with all those APIs that use a ifname instead of an
ifindex. In this case, it's worse because we don't re-detect the
device-type after having it done once.

How about, wifi_utils_is_wifi() gets also an argument ifindex.
Instead of operating on the path name directly, it would first
open("/sys/class/net/wlan0") and then use openat to navigate inside
this directory.

  int
  nmp_utils_open_sysctl(int ifindex, const char *ifname)
  {
      #define SYS_CLASS_NET "/sys/class/net/"
      char ifname_buf[IFNAMSIZ];
      guint try_count = 0;
      char sysdir[NM_STRLEN (SYS_CLASS_NET) + IFNAMSIZ + 1] = SYS_CLASS_NET;
      char fd_buf[256];

      while (++try_count < 4) {
           if (!ifname) {
              ifname = if_indextoname(ifindex, ifname_buf);
              if (!ifname)
                  return -1;
           }
      
           nm_utils_ifname_cpy (&sysdir[NM_STRLEN (SYS_CLASS_NET)], ifname);
           fd = open (sysdir, O_DIRECTORY);
           if (fd < 0)
                goto next;
           fd_ifindex = openat (fd, "ifindex", 0);
           if {fd_ifindex < 0) {
               close(fd);
               goto next;
           }
           /* read ifindex file, and compare it to @ifindex. If match, return 
fd. */
           nn = nm_utils_fd_read_loop (fd_ifindex, fd_buf, sizeof (fd_buf) - 1, 
FALSE);
           if (nn < 0) {
                 close(fd);
                 close (fd_ifindex);
                 goto next;
           }
           fd_buf[sizeof (fd_buf) - 1] = '\0'

           if (ifindex != _nm_utils_ascii_str_to_int64 (fd_buf, 10, 1, 
G_MAXINT, -1) {
                 close(fd); 
                 close (fd_ifindex);
                 goto next;
           }
           return fd;
next:
          ifname = NULL;
     }     
     return -1;
 }




Thomas

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
networkmanager-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to