main.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <sys/types.h>
  9. #include <dirent.h>
  10. void errExit(const char *err)
  11. {
  12. fprintf(stderr, "%s\n", err);
  13. exit(1);
  14. }
  15. char *addDevice(const char *bus, const char *dev, const char *vmid)
  16. {
  17. DIR *dirfd = opendir("/sys/bus/usb/devices/");
  18. if (dirfd)
  19. {
  20. struct dirent *dirEntry;
  21. char *devaddr = NULL;
  22. char dirStartWith[32];
  23. snprintf(dirStartWith, 32, "%s-", bus);
  24. while (dirEntry = readdir(dirfd))
  25. {
  26. if (strncmp(dirStartWith, dirEntry->d_name, strlen(dirStartWith)))
  27. continue;
  28. char path[1024];
  29. snprintf(path, 1024, "/sys/bus/usb/devices/%s/devnum", dirEntry->d_name);
  30. int fic = open(path, O_RDONLY);
  31. if (fic >= 0)
  32. {
  33. char devnum[32];
  34. int rd = read(fic, devnum, 32);
  35. close(fic);
  36. if (rd)
  37. devnum[rd -1] = 0;
  38. printf("{cmp %s vs %s at %s}\n", devnum, dev, dirEntry->d_name);
  39. if (!strcmp(devnum, dev))
  40. {
  41. devaddr = strdup(dirEntry->d_name +strlen(dirStartWith));
  42. printf("Found device %s\n", dirEntry->d_name);
  43. break;
  44. }
  45. }
  46. }
  47. closedir(dirfd);
  48. if (devaddr)
  49. {
  50. char *res = malloc(sizeof(*res) * 1024);
  51. snprintf(res, 1024, "echo device_add usb-host,hostbus=%s,hostport=%s,id=hubhotplug-%s-%s | qm monitor %s\n", bus, devaddr, bus, dev, vmid);
  52. free(devaddr);
  53. return res;
  54. }
  55. }
  56. return NULL;
  57. }
  58. char *delDevice(const char *bus, const char *dev, const char *vmid)
  59. {
  60. char *res = malloc(sizeof(*res) * 1024);
  61. snprintf(res, 1024, "echo device_del hubhotplug-%s-%s | qm monitor %s\n", bus, dev, vmid);
  62. return res;
  63. }
  64. int main(int ac, char **av)
  65. {
  66. const char *vmid = av[1];
  67. const char *devtypeStr = getenv("DEVTYPE");
  68. const char *actionStr = getenv("ACTION");
  69. const char *busNumStr = getenv("BUSNUM");
  70. const char *devNumStr = getenv("DEVNUM");
  71. if (!vmid)
  72. {
  73. fprintf(stderr, "Usage: %s VM-id\n", *av);
  74. exit(1);
  75. }
  76. if (!devtypeStr)
  77. errExit("Missing udev DEVTYPE");
  78. if (!actionStr)
  79. errExit("Missing udev ACTION");
  80. if (!busNumStr)
  81. errExit("Missing udev BUSNUM");
  82. if (!devNumStr)
  83. errExit("Missing udev DEVNUM");
  84. if (strcmp(devtypeStr, "usb_device"))
  85. errExit("Ignoring, devtype not matched");
  86. while (*busNumStr == '0')
  87. ++busNumStr;
  88. while (*devNumStr == '0')
  89. ++devNumStr;
  90. char *action;
  91. FILE *f = fopen("/tmp/log", "w+");
  92. fprintf(f, "%s:%s\n", busNumStr, devNumStr);
  93. if (!strcmp(actionStr, "add"))
  94. action = addDevice(busNumStr, devNumStr, vmid);
  95. else if (!strcmp(actionStr, "remove"))
  96. action = delDevice(busNumStr, devNumStr, vmid);
  97. else
  98. errExit("Invalid ACTION");
  99. if (action)
  100. {
  101. fprintf(f, ">>> %s\n", action);
  102. system(action);
  103. free(action);
  104. }
  105. fclose(f);
  106. }