Задача: доступ к USB из модуля PAM (по крайне мере взятие серийников у всех USB устройств подключенных в данный момент к Системе)
Создал модуль PAM
#include </usr/include/security/pam_modules.h>
#include </usr/include/security/pam_appl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include </usr/local/include/usb.h>
#define PAM_SM_AUTH
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char *argv[])
{
struct pam_conv *conv;
struct pam_message msg;
const struct pam_message *msgp;
struct pam_response *response;
const char *user;
int retval;
char *serialF;
retval = pam_get_user(pamh, &user, "login: ");
retval = pam_get_item(pamh, PAM_CONV, (const void **)&conv);
msg.msg_style = PAM_PROMPT_ECHO_OFF;
msgp = &msg;
serialF = "899000000000000000000072";
/********************************************************************/
struct usb_bus *bus;
struct usb_device *dev;
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_busses; bus; bus = bus->next)
{
for (dev = bus->devices; dev; dev = dev->next)
{
int ret, i;
char string[50];
usb_dev_handle *udev;
udev = usb_open(dev);
if (udev)
{
if (dev->descriptor.iSerialNumber)
{
ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));
if (ret > 0)
{
if (!(strcmp(serialF,string)))
{
msg.msg = "YSPEX/nazmite ENTER: ";
retval=(*conv->conv)(1, &msgp, &response, conv->appdata_ptr);
return PAM_SUCCESS;
}
}
else
{
msg.msg = "Device not found: ";
retval=(*conv->conv)(1, &msgp, &response, conv->appdata_ptr);
return PAM_SUCCESS;
}
}
usb_close (udev);
}
if (!dev->config)
{
continue;
}
}
}
/***************************************************/
msg.msg = "oO!??? ";
retval=(*conv->conv)(1, &msgp, &response, conv->appdata_ptr);
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags, int argc, const char **argv)
{
return PAM_SUCCESS;
}
#ifdef PAM_STATIC
struct pam_module _pam_only_usb_modstruct = {
"pam_only_usb",
pam_sm_authenticate,
pam_sm_setcred,
NULL,
NULL,
NULL,
NULL,
};
#endif
компилирую:
(root$)gcc -c -fPIC -o pam_only_usb.o pam_only_usb.c -I/usr/local/include -L. -lnsl -lm -lc -L/usr/local/lib -lusb
(root$)gcc -shared -fPIC -o pam_only_usb.so pam_only_usb.o
Использовал libusb-0.1.12, которая установилась:
libusb.so в /usr/local/lib/
usb.h в /usr/local/include/
вот что в логах:
:PAM unable to dlopen(/lib/security/pan_only_usb.so): /lib/security/pam_only_usb.so: undefined symbol: usb_init
:PAM adding faulty module: /lib/security/pan_only_usb.so
Если кто знает, подскажите пожалуйста