почему запущенная программа udevd не может правильно определить имя? - PullRequest
0 голосов
/ 18 марта 2020

Я бы хотел, чтобы мои часы Garmin автоматически обновлялись при подключении к USB-сокету Ubuntu. поэтому я добавил 90-garmin-fenix-3hr.rules в /etc/udev/rules.d/, например:

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/usr/local/bin/device_added.sh"

и вызов внешней программы в device_added. sh

#!/bin/bash
if ! /usr/local/bin/showip 2>&1
then
        echo "successfully update" 
else
        echo "fail to update" 
fi

внешняя программа showip использует getaddrinfo для разрешения имени,

int main(int argc, char *argv[])
{
  struct addrinfo hints, *res, *p;
  int status;
  char ipstr[INET6_ADDRSTRLEN];


  /* setlogmask (LOG_UPTO (LOG_NOTICE)); */
  openlog ("usbhotplug", LOG_CONS | LOG_PID , 0);

  memset(&hints, 0, sizeof hints);

  hints.ai_socktype = SOCK_STREAM;

  if ((status = getaddrinfo("www.google.com", NULL, &hints, &res)) != 0) {
    syslog(LOG_INFO, "getaddrinfo: %s\n", gai_strerror(status));
    return 2;
  }
}

Однако, когда это вызывается событием горячего подключения usb, оно заканчивается следующей ошибкой

Mar 18 00:33:17 surreywater usbhotplug[7197]: getaddrinfo: Name or service not known

Когда эта программа запускается вручную, у нее не возникает проблем с разрешением имен.

не root идентификатор пользователя запуска процесса с помощью udevd? Почему это не удается в getaddrinfo?

...