Я бы хотел, чтобы мои часы 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
?