forked from Imagelibrary/rtems
posix_devctl - Add support for SOCKCLOSE
The FACE Technical Standard, Edition 3.0 and later require the definition of the subcommand SOCKCLOSE in <devctl.h>. Reference: https://www.opengroup.org/face closes #3856.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Joel Sherrill <joel@rtems.org>. All rights reserved.
|
||||
* Copyright (c) 2016, 2020 Joel Sherrill <joel@rtems.org>.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -33,6 +34,8 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <rtems/seterr.h>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
int posix_devctl(
|
||||
int fd,
|
||||
int dcmd,
|
||||
@@ -68,5 +71,16 @@ int posix_devctl(
|
||||
*dev_info_ptr = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The FACE Technical Standard Edition 3.0 and newer requires the SOCKCLOSE
|
||||
* ioctl command. This is because the Security Profile does not include
|
||||
* close() and applications need a way to close sockets. Closing sockets is
|
||||
* a minimum requirement so using close() in the implementation meets that
|
||||
* requirement but also lets the application close other file types.
|
||||
*/
|
||||
if (dcmd == SOCKCLOSE ) {
|
||||
return close(fd);
|
||||
}
|
||||
|
||||
return ioctl(fd, dcmd, dev_data_ptr);
|
||||
}
|
||||
|
||||
@@ -39,6 +39,8 @@ rtems_task Init(
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||
|
||||
#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 4
|
||||
|
||||
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
@@ -19,5 +19,11 @@ concepts:
|
||||
+ Ensure that proper error values result when passing different combinations of
|
||||
arguments to posix_devctl().
|
||||
|
||||
+ Ensure that a requestn is passed through the underlying ioctl() operation
|
||||
+ Ensure that a request is passed through the underlying ioctl() operation
|
||||
to the console device driver and flagged as an error.
|
||||
|
||||
+ Ensure that the SOCKCLOSE subcommand is supported by posix_devctl()
|
||||
and returns an error on invalid file descriptors.
|
||||
|
||||
+ Ensure that the SOCKCLOSE subcommand is supported by posix_devctl()
|
||||
and will close a file descriptor.
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
*** BEGIN OF TEST PSXDEVCTL 1 ***
|
||||
posix_devctl() FIONBIO on stdin return dev_info -- EBADF
|
||||
posix_devctl() FIONBIO on stdin return dev_info -- EBADF
|
||||
posix_devctl() FIONBIO on stdin NULL dev_info -- EBADF
|
||||
posix_devctl() SOCKCLOSE on invalid file descriptor -- EBADF
|
||||
posix_devctl() SOCKCLOSE on valid file descriptor -- OK
|
||||
*** END OF TEST PSXDEVCTL 1 ***
|
||||
|
||||
@@ -76,6 +76,32 @@ int main(
|
||||
rtems_test_assert( status == -1 );
|
||||
rtems_test_assert( errno == EBADF );
|
||||
|
||||
puts( "posix_devctl() SOCKCLOSE on invalid file descriptor -- EBADF" );
|
||||
fd = 21;
|
||||
dcmd = SOCKCLOSE;
|
||||
dev_data_ptr = NULL;
|
||||
nbyte = 0;
|
||||
status = posix_devctl( fd, dcmd, dev_data_ptr, nbyte, NULL );
|
||||
rtems_test_assert( status == -1 );
|
||||
rtems_test_assert( errno == EBADF );
|
||||
|
||||
/*
|
||||
* Create a file, open it, and close it via posix_devctl().
|
||||
* Then verify it is really closed.
|
||||
*/
|
||||
puts( "posix_devctl() SOCKCLOSE on valid file descriptor -- OK" );
|
||||
fd = open("tmp_for_close", O_CREAT | O_RDWR, S_IRWXU );
|
||||
rtems_test_assert( fd != -1 );
|
||||
|
||||
dcmd = SOCKCLOSE;
|
||||
dev_data_ptr = NULL;
|
||||
nbyte = 0;
|
||||
status = posix_devctl( fd, dcmd, dev_data_ptr, nbyte, NULL );
|
||||
rtems_test_assert( status == 0 );
|
||||
|
||||
status = close( fd );
|
||||
rtems_test_assert( status == -1 );
|
||||
rtems_test_assert( errno == EBADF );
|
||||
TEST_END();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user