C: Как скопировать массив символов в структуру ifreq? - PullRequest
2 голосов
/ 20 июня 2020

Невозможно скопировать массив символов в структуру ifreq s. Ниже приведено объявление, которое было определено:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netdb.h>

char interface[100];//="wlp1s0";
char reader_mac[13] = {00};

int main()
{
  FILE *f = popen("ip addr show | awk '/inet.*brd/{print $NF}'", "r");
  while (fgets(interface, 100, f) != NULL) {
  }
  strtok(interface, "\n");  // kaylum's Suggestion from the comments below
  printf( "interface :: %s\n", interface);
  pclose(f);

  struct ifreq s;    
  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);  


  strcpy(s.ifr_name, interface);
  // strcpy(s.ifr_name, "wlp1s0");


  if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
  int i;

  for (i = 0; i < 6; ++i){
    unsigned char data  =  s.ifr_addr.sa_data[i];
    // printf("ddd:::%02x\n", data );
    sprintf(reader_mac+(i*2), "%02x", data);
  }
  reader_mac[12] = '\0';
  printf("reader_mac ::: %s\n",reader_mac);
}
}

Теперь, копируя интерфейс в s.ifr_name, я не могу получить адрес ma c данного интерфейса, тогда как если я заменю strcpy (s .ifr_name, interface) как strcpy (s.ifr_name, "wlp1s0"), то же самое может вернуть адрес ma c.

Я могу получить активные сетевые интерфейсы с помощью системной команды,

interface :: wlp1s0

Принимая во внимание, что полученный сетевой интерфейс передается в strcpy () для копирования интерфейса в s.ifr_name, I Я не могу получить адрес ma c.

Как это здесь решать?

Предложение kaylum из комментариев:

После добавления strtok (interface, "\ n"); в приведенном выше скрипте он не может получить адрес ma c.

reader_mac ::: fc017c0f2b75

1 Ответ

3 голосов
/ 20 июня 2020

Из руководства fgets :

Если новая строка читается, она сохраняется в буфере

Итак interface может содержать завершающую новую строку, которая сбивает с толку ioctl. Используйте любой метод, чтобы сначала удалить \n перед переходом к ioctl.. Например:

if ((p=strchr(interface, '\n')) != NULL) {
    *p = '\0';
}
...