mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-25 00:59:13 +08:00
networking: socket to/from file descriptor
o Move rtems_bsdnet_fdToSocket() and rtems_bsdnet_makeFdForSocket() to "cpukit/libnetworking/rtems/rtems_syscall.c". o The rtems_bsdnet_makeFdForSocket() function is now static. o Check in rtems_bsdnet_fdToSocket() function that the file descriptor uses the socket handlers, otherwise an error status will be returned and errno set to ENOTSOCK. o New test libtests/syscall01.
This commit is contained in:
@@ -60,10 +60,6 @@ BASE_FS_C_FILES = src/base_fs.c src/mount.c src/unmount.c src/libio.c \
|
||||
src/privateenv.c \
|
||||
src/open_dev_console.c src/__usrenv.c src/rtems_mkdir.c
|
||||
|
||||
if LIBNETWORKING
|
||||
BASE_FS_C_FILES += src/libio_sockets.c
|
||||
endif
|
||||
|
||||
TERMIOS_C_FILES = src/cfgetispeed.c src/cfgetospeed.c src/cfsetispeed.c \
|
||||
src/cfsetospeed.c src/tcgetattr.c src/tcsetattr.c src/tcdrain.c \
|
||||
src/tcflow.c src/tcflush.c src/tcgetpgrp.c src/tcsendbreak.c \
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* This file contains the support infrastructure used to manage the
|
||||
* table of integer style file descriptors used by the socket calls.
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1999.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/libio_.h>
|
||||
#include <rtems/seterr.h>
|
||||
#include <rtems/rtems_bsdnet_internal.h>
|
||||
|
||||
/*
|
||||
* Convert an RTEMS file descriptor to a BSD socket pointer.
|
||||
*/
|
||||
|
||||
struct socket *rtems_bsdnet_fdToSocket(
|
||||
int fd
|
||||
)
|
||||
{
|
||||
rtems_libio_t *iop;
|
||||
|
||||
/* same as rtems_libio_check_fd(_fd) but different return */
|
||||
if ((uint32_t)fd >= rtems_libio_number_iops) {
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
iop = &rtems_libio_iops[fd];
|
||||
|
||||
/* same as rtems_libio_check_is_open(iop) but different return */
|
||||
if ((iop->flags & LIBIO_FLAGS_OPEN) == 0) {
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (iop->data1 == NULL)
|
||||
errno = EBADF;
|
||||
return iop->data1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an RTEMS file descriptor for a socket
|
||||
*/
|
||||
|
||||
int rtems_bsdnet_makeFdForSocket(
|
||||
void *so,
|
||||
const rtems_filesystem_file_handlers_r *h
|
||||
)
|
||||
{
|
||||
rtems_libio_t *iop;
|
||||
int fd;
|
||||
|
||||
iop = rtems_libio_allocate();
|
||||
if (iop == 0)
|
||||
rtems_set_errno_and_return_minus_one( ENFILE );
|
||||
|
||||
fd = iop - rtems_libio_iops;
|
||||
iop->flags |= LIBIO_FLAGS_WRITE | LIBIO_FLAGS_READ;
|
||||
iop->data0 = fd;
|
||||
iop->data1 = so;
|
||||
iop->pathinfo.handlers = h;
|
||||
iop->pathinfo.ops = &rtems_filesystem_operations_default;
|
||||
iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
|
||||
rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
|
||||
return fd;
|
||||
}
|
||||
@@ -199,8 +199,6 @@ int ioctl (int, ioctl_command_t, ...);
|
||||
# error "Network event conflict"
|
||||
#endif
|
||||
|
||||
int rtems_bsdnet_makeFdForSocket(
|
||||
void *so, const rtems_filesystem_file_handlers_r *h);
|
||||
struct socket *rtems_bsdnet_fdToSocket(int fd);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
#include <rtems.h>
|
||||
#include <rtems/libio.h>
|
||||
#include <rtems/libio_.h>
|
||||
#include <rtems/error.h>
|
||||
#include <rtems/rtems_bsdnet.h>
|
||||
|
||||
@@ -43,6 +43,61 @@ ssize_t recv(int, void *, size_t, int);
|
||||
*/
|
||||
static const rtems_filesystem_file_handlers_r socket_handlers;
|
||||
|
||||
/*
|
||||
* Convert an RTEMS file descriptor to a BSD socket pointer.
|
||||
*/
|
||||
struct socket *
|
||||
rtems_bsdnet_fdToSocket (int fd)
|
||||
{
|
||||
rtems_libio_t *iop;
|
||||
|
||||
/* same as rtems_libio_check_fd(_fd) but different return */
|
||||
if ((uint32_t)fd >= rtems_libio_number_iops) {
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
iop = &rtems_libio_iops[fd];
|
||||
|
||||
/* same as rtems_libio_check_is_open(iop) but different return */
|
||||
if ((iop->flags & LIBIO_FLAGS_OPEN) == 0) {
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (iop->pathinfo.handlers != &socket_handlers) {
|
||||
errno = ENOTSOCK;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (iop->data1 == NULL)
|
||||
errno = EBADF;
|
||||
return iop->data1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an RTEMS file descriptor for a socket
|
||||
*/
|
||||
static int
|
||||
rtems_bsdnet_makeFdForSocket (void *so)
|
||||
{
|
||||
rtems_libio_t *iop;
|
||||
int fd;
|
||||
|
||||
iop = rtems_libio_allocate();
|
||||
if (iop == 0)
|
||||
rtems_set_errno_and_return_minus_one( ENFILE );
|
||||
|
||||
fd = iop - rtems_libio_iops;
|
||||
iop->flags |= LIBIO_FLAGS_WRITE | LIBIO_FLAGS_READ;
|
||||
iop->data0 = fd;
|
||||
iop->data1 = so;
|
||||
iop->pathinfo.handlers = &socket_handlers;
|
||||
iop->pathinfo.ops = &rtems_filesystem_operations_default;
|
||||
iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
|
||||
rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
|
||||
return fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* Package system call argument into mbuf.
|
||||
*/
|
||||
@@ -82,7 +137,7 @@ socket (int domain, int type, int protocol)
|
||||
rtems_bsdnet_semaphore_obtain ();
|
||||
error = socreate(domain, &so, type, protocol, NULL);
|
||||
if (error == 0) {
|
||||
fd = rtems_bsdnet_makeFdForSocket (so, &socket_handlers);
|
||||
fd = rtems_bsdnet_makeFdForSocket (so);
|
||||
if (fd < 0)
|
||||
soclose (so);
|
||||
}
|
||||
@@ -233,7 +288,7 @@ accept (int s, struct sockaddr *name, int *namelen)
|
||||
TAILQ_REMOVE(&head->so_comp, so, so_list);
|
||||
head->so_qlen--;
|
||||
|
||||
fd = rtems_bsdnet_makeFdForSocket (so, &socket_handlers);
|
||||
fd = rtems_bsdnet_makeFdForSocket (so);
|
||||
if (fd < 0) {
|
||||
TAILQ_INSERT_HEAD(&head->so_comp, so, so_list);
|
||||
head->so_qlen++;
|
||||
|
||||
@@ -21,6 +21,7 @@ SUBDIRS += bspcmdline01 cpuuse devfs01 devfs02 devfs03 devfs04 \
|
||||
|
||||
if NETTESTS
|
||||
SUBDIRS += ftp01
|
||||
SUBDIRS += syscall01
|
||||
endif
|
||||
|
||||
include $(top_srcdir)/../automake/subdirs.am
|
||||
|
||||
@@ -43,6 +43,7 @@ AM_CONDITIONAL(NETTESTS,test "$rtems_cv_RTEMS_NETWORKING" = "yes")
|
||||
|
||||
# Explicitly list all Makefiles here
|
||||
AC_CONFIG_FILES([Makefile
|
||||
syscall01/Makefile
|
||||
flashdisk01/Makefile
|
||||
block01/Makefile
|
||||
block02/Makefile
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
rtems_tests_PROGRAMS = syscall01
|
||||
syscall01_SOURCES = init.c
|
||||
|
||||
dist_rtems_tests_DATA = syscall01.scn syscall01.doc
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
|
||||
include $(top_srcdir)/../automake/compile.am
|
||||
include $(top_srcdir)/../automake/leaf.am
|
||||
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
|
||||
|
||||
LINK_OBJS = $(syscall01_OBJECTS)
|
||||
LINK_LIBS = $(syscall01_LDLIBS)
|
||||
|
||||
syscall01$(EXEEXT): $(syscall01_OBJECTS) $(syscall01_DEPENDENCIES)
|
||||
@rm -f syscall01$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright (c) 2012 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Obere Lagerstr. 30
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "tmacros.h"
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <rtems/libio.h>
|
||||
#include <rtems/rtems_bsdnet.h>
|
||||
|
||||
static const char open_driver_path [] = "/dev/open_driver";
|
||||
|
||||
struct rtems_bsdnet_config rtems_bsdnet_config;
|
||||
|
||||
static void test(void)
|
||||
{
|
||||
int rv;
|
||||
char buf [1];
|
||||
ssize_t n;
|
||||
int fd = open(open_driver_path, O_RDWR);
|
||||
rtems_test_assert(fd >= 0);
|
||||
|
||||
n = send(fd, buf, sizeof(buf), 0);
|
||||
rtems_test_assert(n == -1);
|
||||
rtems_test_assert(errno == ENOTSOCK);
|
||||
|
||||
n = recv(fd, buf, sizeof(buf), 0);
|
||||
rtems_test_assert(n == -1);
|
||||
rtems_test_assert(errno == ENOTSOCK);
|
||||
|
||||
rv = close(fd);
|
||||
rtems_test_assert(rv == 0);
|
||||
}
|
||||
|
||||
static void Init(rtems_task_argument arg)
|
||||
{
|
||||
int rv;
|
||||
|
||||
puts("\n\n*** TEST SYSCALL 1 ***");
|
||||
|
||||
rv = rtems_bsdnet_initialize_network();
|
||||
rtems_test_assert(rv == 0);
|
||||
|
||||
test();
|
||||
|
||||
puts("*** END OF TEST SYSCALL 1 ***");
|
||||
|
||||
rtems_test_exit(0);
|
||||
}
|
||||
|
||||
static rtems_device_driver open_driver_initialize(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = rtems_io_register_name(open_driver_path, major, 0);
|
||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static rtems_device_driver open_driver_open(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
rtems_libio_open_close_args_t *oc = arg;
|
||||
|
||||
oc->iop->data0 = 1;
|
||||
oc->iop->data1 = (void *) 1;
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
#define OPEN_DRIVER { \
|
||||
.initialization_entry = open_driver_initialize, \
|
||||
.open_entry = open_driver_open \
|
||||
}
|
||||
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
#define CONFIGURE_APPLICATION_EXTRA_DRIVERS OPEN_DRIVER
|
||||
|
||||
#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
|
||||
|
||||
#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
@@ -0,0 +1,11 @@
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: syscall01
|
||||
|
||||
directives:
|
||||
|
||||
TBD
|
||||
|
||||
concepts:
|
||||
|
||||
TBD
|
||||
@@ -0,0 +1,2 @@
|
||||
*** TEST SYSCALL 1 ***
|
||||
*** END OF TEST SYSCALL 1 ***
|
||||
Reference in New Issue
Block a user