예제 #1
0
파일: rtdm.c 프로젝트: JackieXie168/xenomai
int __wrap_accept(int fd, struct sockaddr *addr, socklen_t * addrlen)
{
	if (fd >= __pse51_rtdm_fd_start) {
		struct _rtdm_getsockaddr_args args = { addr, addrlen };
		int oldtype;

		pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);

		fd = XENOMAI_SKINCALL3(__pse51_rtdm_muxid,
				       __rtdm_ioctl,
				       fd - __pse51_rtdm_fd_start,
				       _RTIOC_ACCEPT, &args);

		pthread_setcanceltype(oldtype, NULL);

		if (fd < 0)
			return set_errno(fd);

		return fd + __pse51_rtdm_fd_start;
	} else {
		fd = __real_accept(fd, addr, addrlen);

		if (fd >= __pse51_rtdm_fd_start) {
			__real_close(fd);
			errno = EMFILE;
			fd = -1;
		}

		return fd;
	}
}
예제 #2
0
파일: rtdm.c 프로젝트: JackieXie168/xenomai
int __wrap_open64(const char *path, int oflag, ...)
{
	int ret = sys_rtdm_open(path, oflag);
	if (ret >= 0)
		return ret;
#ifdef HAVE_OPEN64
	else if (ret == -ENODEV || ret == -ENOSYS) {
		va_list ap;

		va_start(ap, oflag);

		ret = __real_open64(path, oflag, va_arg(ap, mode_t));

		va_end(ap);

		if (ret >= __pse51_rtdm_fd_start) {
			__real_close(ret);
			errno = EMFILE;
			ret = -1;
		}
#endif
	} else {
		errno = -ret;
		ret = -1;
	}

	return ret;	
}
예제 #3
0
파일: rtdm.c 프로젝트: JackieXie168/xenomai
int __wrap_close(int fd)
{
	extern int __shm_close(int fd);
	int ret;

	if (fd >= __pse51_rtdm_fd_start) {
		int oldtype;

		pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);

		ret = set_errno(XENOMAI_SKINCALL1(__pse51_rtdm_muxid,
						  __rtdm_close,
						  fd - __pse51_rtdm_fd_start));

		pthread_setcanceltype(oldtype, NULL);

		return ret;
	} else
		ret = __shm_close(fd);

	if (ret == -1 && (errno == EBADF || errno == ENOSYS))
		return __real_close(fd);

	return ret;
}
예제 #4
0
파일: rtdm.c 프로젝트: JackieXie168/xenomai
int __wrap_socket(int protocol_family, int socket_type, int protocol)
{
	int ret;

	ret = XENOMAI_SKINCALL3(__pse51_rtdm_muxid,
				__rtdm_socket,
				protocol_family, socket_type, protocol);
	if (ret >= 0)
		ret += __pse51_rtdm_fd_start;
	else if (ret == -EAFNOSUPPORT || ret == -EPROTONOSUPPORT || 
		 ret == -ENOSYS) {
		ret = __real_socket(protocol_family, socket_type, protocol);

		if (ret >= __pse51_rtdm_fd_start) {
			__real_close(ret);
			errno = -EMFILE;
			ret = -1;
		}
	} else {
		errno = -ret;
		ret = -1;
	}

	return ret;
}
예제 #5
0
static int __map_queue_memory(RT_QUEUE *q, RT_QUEUE_PLACEHOLDER * php)
{
	int err, heapfd;

	/* Open the heap device to share the message pool memory with the
	   in-kernel skin and bound clients. */
	heapfd = __real_open(XNHEAP_DEV_NAME, O_RDWR);

	if (heapfd < 0)
		return -ENOENT;

	/* Bind this file instance to the shared heap. */
	err = __real_ioctl(heapfd, 0, php->opaque2);

	if (err)
		goto close_and_exit;

	/* Map the heap memory into our address space. */
	php->mapbase = (caddr_t) __real_mmap(NULL,
					     php->mapsize,
					     PROT_READ | PROT_WRITE,
					     MAP_SHARED, heapfd, 0L);

	if (php->mapbase != MAP_FAILED)
		/* Copy back a complete placeholder only if all is ok. */
		*q = *php;
	else
		err = -ENOMEM;

      close_and_exit:

	__real_close(heapfd);

	return err;
}
예제 #6
0
int __wrap_open(const char *path, int oflag, ...)
{
	int ret, oldtype;
	const char *rtdm_path = path;

	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);

	/* skip path prefix for RTDM invocation */
	if (strncmp(path, "/dev/", 5) == 0)
		rtdm_path += 5;

	ret = XENOMAI_SKINCALL2(__rtdm_muxid, __rtdm_open, rtdm_path, oflag);

	pthread_setcanceltype(oldtype, NULL);

	if (ret >= 0)
		ret += __rtdm_fd_start;
	else if (ret == -ENODEV || ret == -ENOSYS) {
		va_list ap;

		va_start(ap, oflag);

		ret = __real_open(path, oflag, va_arg(ap, mode_t));

		va_end(ap);

		if (ret >= __rtdm_fd_start) {
			__real_close(ret);
			errno = EMFILE;
			ret = -1;
		}
	} else {
		errno = -ret;
		ret = -1;
	}

	return ret;
}
예제 #7
0
파일: wrappers.c 프로젝트: smowton/llpe
__attribute__((always_inline)) int __wrap_close(int fd) {

    delete_fake_fd(fd);
    __real_close(fd);

}
예제 #8
0
파일: close.c 프로젝트: anukat2015/tup
int __wrap_close(int fd)
{
	if(!win32_rm_dirpath(fd))
		__real_close(fd);
	return 0;
}