Re: Building udev-142 w/o inotify or ppoll

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Kay Sievers wrote:
> On Thu, Jul 16, 2009 at 10:06, Philip A.
> Prindeville<philipp_subx@xxxxxxxxxxxxxxxxxxxxx> 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: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [Linux Kernel]     [Linux DVB]     [Asterisk Internet PBX]     [DCCP]     [Netdev]     [X.org]     [Util Linux NG]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux