* Re: Building udev-142 w/o inotify or ppoll
2009-07-16 8:06 Building udev-142 w/o inotify or ppoll Philip A. Prindeville
2009-07-16 9:26 ` Kay Sievers
@ 2009-07-16 16:24 ` Bryan Kadzban
1 sibling, 0 replies; 3+ messages in thread
From: Bryan Kadzban @ 2009-07-16 16:24 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1: Type: text/plain, Size: 2816 bytes --]
Kay Sievers wrote:
> On Thu, Jul 16, 2009 at 10:06, Philip A.
> Prindeville<philipp_subx@redfish-solutions.com> wrote:
>> I'm building udev-142 on a Linux 2.6.27.26 system, but unfortunately the
>> version of uClibc (0.9.28) that we're using supports neither inotify nor
>> ppoll.
>>
>> We had been using 115.
>>
>> Is there a workaround for this?
>
> They are required. More recent udev versions also need signalfd.
> Inotify can probably be patched out without too much trouble, but
> ppoll() and singalfd() will need to be added to the libc or emulated
> locally.
Yeah, I was complaining about signalfd a while ago too.
I ended up using the "fake" sys/signalfd.h header below. (I don't know
if you can do the same with ppoll or not; my glibc at least provides a
wrapper for it, even though it may still have the ppoll race condition.
I suspect you can do the same with inotify fairly easily.) Most of this
is copied from the kernel sources, some from newer glibc versions.
#ifndef _SYS_SIGNALFD_H
#define _SYS_SIGNALFD_H 1
#include <stdint.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
struct signalfd_siginfo {
uint32_t ssi_signo; /* Signal number */
int32_t ssi_errno; /* Error number (unused) */
int32_t ssi_code; /* Signal code */
uint32_t ssi_pid; /* PID of sender */
uint32_t ssi_uid; /* Real UID of sender */
int32_t ssi_fd; /* File descriptor (SIGIO) */
uint32_t ssi_tid; /* Kernel timer ID (POSIX timers) */
uint32_t ssi_band; /* Band event (SIGIO) */
uint32_t ssi_overrun; /* POSIX timer overrun count */
uint32_t ssi_trapno; /* Trap number that caused signal */
int32_t ssi_status; /* Exit status or signal (SIGCHLD) */
int32_t ssi_int; /* Integer sent by sigqueue(2) */
uint64_t ssi_ptr; /* Pointer sent by sigqueue(2) */
uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */
uint64_t ssi_stime; /* System CPU time consumed (SIGCHLD) */
uint64_t ssi_addr; /* Address that generated signal
(for hardware-generated signals) */
uint8_t pad[48]; /* Pad size to 128 bytes (allow for
additional fields in the future) */
};
#if __x86_64__
# define __NR_signalfd4 289
# define __NR_signalfd 282
#elif __i386__
# define __NR_signalfd4 327
# define __NR_signalfd 321
#else
#error "Unknown architecture..."
#endif
static inline int signalfd(int fd, sigset_t *mask, uint32_t flags)
{
int rv = syscall(__NR_signalfd4, fd, mask, (size_t)8, flags);
if(rv < 0) {
if(flags != 0) {
errno = EINVAL;
return -1;
}
return syscall(__NR_signalfd, fd, mask, (size_t)8);
}
else
return rv;
}
#undef __NR_signalfd4
#undef __NR_signalfd
#endif /* _SYS_SIGNALFD_H */
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 260 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread