LINUX.ORG.RU

Получить список USB устройств на С

 , ,


0

1

У меня немного запор мозга. Мне нужно найти узел /dev/bus/usb/, на котором сидит девайс с нужным именем. В какую сторону копать, чтобы сделать это без разного рода lsusb и прочего парсинга предназначенного для человека вывода?


Парси /sys/bus/usb/devices/, да оно выглядят как «предназначенный для человека вывод», но другого апи там скорее всего нет. Все библиотеки занимаются тем же самым внутри.

firkax ★★★★★
()

Кусок из какого-то проекта:

#include <stdio.h>
#include <wchar.h>
#include <usb.h>
 
int main(){
  struct usb_bus *bus;
  struct usb_device *dev;
  char buf[256];
  wchar_t devVendor[128], devProduct[128];
  int len, i;
  usb_dev_handle *handle = NULL;
  usb_init();
  usb_find_busses();
  usb_find_devices();
  for(bus = usb_get_busses(); bus; bus = bus->next){
    for(dev = bus->devices; dev; dev = dev->next){
      handle = usb_open(dev);
      if(handle == NULL){
        printf("Can not open\n");
        continue;
      }

      len = usb_get_string(handle, dev->descriptor.iManufacturer, 0x0409, buf, sizeof(buf));
      if(len<0){printf("0x%.4X:0x%.4X\n",dev->descriptor.idVendor, dev->descriptor.idProduct); usb_close(handle); continue;}
      len = len/2 - 1;
      for(i=0; i<len; i++)devVendor[i]=buf[i+i+2];
      devVendor[len]=0;
      
      len = usb_get_string(handle, dev->descriptor.iProduct, 0x0409, buf, sizeof(buf));
      if(len<0){printf("0x%.4X:0x%.4X\n",dev->descriptor.idVendor, dev->descriptor.idProduct); usb_close(handle); continue;}
      len = len/2 - 1;
      for(i=0; i<len; i++)devProduct[i]=buf[i+i+2];
      devProduct[len]=0;
      
      printf("0x%.4X:0x%.4X\t[%ls]\t[%ls]\n",dev->descriptor.idVendor, dev->descriptor.idProduct, devVendor, devProduct);
      usb_close(handle);
    }
  }
}
COKPOWEHEU
()
Ответ на: комментарий от bo4ok

Проще всего дергать lsusb через system или пайпить выхлоп в твою поделку. А «ядерное апи» — не нужно оно тебе, если спрашиваешь :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)

Копай в сторону фильтра на баше или что у тебя там, чтоб было уже распарсено, отфильтровано и отсортировано... и не заниматься велосипедной «антиюниксвейной»(тм) фигней.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)

ага-угу.

Вопрос немного изменился. Есть USB модем, который иногда зависает. При вызове usbreset он не сбрасывается, но при перезагрузке компьютера - вполне. Питание при этом не сбрасывается (одноплатник, USB кормится напрямую). В чём различие ситуаций, и можно ли как-то имитировать для модема перезагрузку хоста программно?

bo4ok
() автор топика