Changeset 045ff6e in rtems-libbsd


Ignore:
Timestamp:
Feb 21, 2017, 2:26:31 PM (2 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
fd86c091b97759106da7355ce1dd81ebe030e285, f020f08430150c1656a0ad0a1de13699db9b980b
Children:
ae9e46d
Parents:
631fb98
git-author:
Sebastian Huber <sebastian.huber@…> (02/21/17 14:26:31)
git-committer:
Sebastian Huber <sebastian.huber@…> (02/28/17 09:54:50)
Message:

Add poll() and select() support for Termios

Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • libbsd.py

    r631fb98 r045ff6e  
    110110            'rtems/rtems-kernel-sysctl.c',
    111111            'rtems/rtems-kernel-sysctlnametomib.c',
     112            'rtems/rtems-kernel-timesupport.c',
     113            'rtems/rtems-kernel-termioskqueuepoll.c',
    112114            'rtems/rtems-kernel-thread.c',
    113             'rtems/rtems-kernel-timesupport.c',
    114115            'rtems/rtems-kernel-vprintf.c',
    115116            'rtems/rtems-legacy-rtrequest.c',
  • libbsd_waf.py

    r631fb98 r045ff6e  
    13101310              'rtemsbsd/rtems/rtems-kernel-sysctlbyname.c',
    13111311              'rtemsbsd/rtems/rtems-kernel-sysctlnametomib.c',
     1312              'rtemsbsd/rtems/rtems-kernel-termioskqueuepoll.c',
    13121313              'rtemsbsd/rtems/rtems-kernel-thread.c',
    13131314              'rtemsbsd/rtems/rtems-kernel-timesupport.c',
  • rtemsbsd/include/machine/rtems-bsd-config.h

    r631fb98 r045ff6e  
    190190
    191191/*
     192 * Termios
     193 */
     194#if defined(RTEMS_BSD_CONFIG_TERMIOS_KQUEUE_AND_POLL)
     195  #define RTEMS_BSD_CFGDECL_TERMIOS_KQUEUE_AND_POLL SYSINIT_REFERENCE(termioskqueuepoll)
     196#else
     197  #define RTEMS_BSD_CFGDECL_TERMIOS_KQUEUE_AND_POLL
     198#endif /* RTEMS_BSD_CONFIG_TERMIOS_KQUEUE_AND_POLL */
     199
     200/*
    192201 * Configure the system.
    193202 */
     
    231240  RTEMS_BSD_CFGDECL_TELNETD_STACK_SIZE;
    232241  RTEMS_BSD_CFGDECL_FTPD;
     242
     243  RTEMS_BSD_CFGDECL_TERMIOS_KQUEUE_AND_POLL;
    233244#endif /* RTEMS_BSD_CONFIG_INIT */
    234245
  • testsuite/netshell01/test_main.c

    r631fb98 r045ff6e  
    3030 */
    3131
     32#include <assert.h>
     33#include <errno.h>
     34#include <stdarg.h>
     35#include <stdbool.h>
    3236#include <stdio.h>
    33 #include <stdarg.h>
    3437#include <stdlib.h>
    3538#include <string.h>
    36 #include <errno.h>
    3739
    3840#include <rtems/shell.h>
    3941
    4042#define TEST_NAME "LIBBSD NETSHELL 1"
     43
     44static void
     45change_serial_settings(int fd, const struct termios *current, bool icanon)
     46{
     47        struct termios term = *current;
     48
     49        term.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR |
     50            ICRNL | IXON);
     51        term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOCTL |
     52            ECHOKE | ICANON | ISIG | IEXTEN);
     53        term.c_cflag &= ~(CSIZE | PARENB);
     54        term.c_cflag |= CS8;
     55        term.c_oflag &= ~(OPOST | ONLRET | ONLCR | OCRNL | ONLRET | TABDLY |
     56            OLCUC);
     57
     58        term.c_cc[VMIN] = 0;
     59        term.c_cc[VTIME] = 10;
     60
     61        if (icanon) {
     62                term.c_iflag |= ICRNL;
     63                term.c_lflag |= ICANON;
     64        }
     65
     66        tcsetattr(fd, TCSANOW, &term);
     67}
     68
     69static void
     70do_read_select(int fd)
     71{
     72        int nfds = fd + 1;
     73        struct fd_set read_set;
     74        struct timeval timeout = {
     75                .tv_sec = 10,
     76                .tv_usec = 0
     77        };
     78        int rv;
     79
     80        FD_ZERO(&read_set);
     81        FD_SET(fd, &read_set);
     82
     83        rv = select(nfds, &read_set, NULL, NULL, &timeout);
     84        if (rv == 0) {
     85                printf("timeout\n");
     86        } else if (rv > 0) {
     87                if (FD_ISSET(fd, &read_set)) {
     88                        char buf[512];
     89                        ssize_t n = read(fd, buf, sizeof(buf));
     90                        printf("read returned %zi\n", n);
     91                }
     92        } else {
     93                perror("select failed");
     94        }
     95}
     96
     97static void
     98do_write_select(int fd)
     99{
     100        int nfds = fd + 1;
     101        struct fd_set write_set;
     102        struct timeval to = {
     103                .tv_sec = 0,
     104                .tv_usec = 1
     105        };
     106        struct timeval *timeout = &to;
     107        char buf[512];
     108        int rv;
     109        size_t i;
     110
     111        memset(buf, 'a', sizeof(buf));
     112
     113        for (i = 0; i < sizeof(buf); i += 24) {
     114                buf[i] = '\r';
     115                buf[i + 1] = '\n';
     116        }
     117
     118        for (i = 0; i < 10; ++i) {
     119                write(fd, buf, sizeof(buf));
     120
     121                FD_ZERO(&write_set);
     122                FD_SET(fd, &write_set);
     123                rv = select(nfds, NULL, &write_set, NULL, timeout);
     124                if (rv == 0) {
     125                        printf("timeout\n");
     126                } else {
     127                        printf("write set: %i\n", FD_ISSET(fd, &write_set));
     128                }
     129
     130                timeout = NULL;
     131        }
     132}
     133
     134static int
     135termiosselect_command(int argc, char *argv[])
     136{
     137        bool icanon = argc > 1 && strcmp(argv[1], "icanon") == 0;
     138        int fd = STDIN_FILENO;
     139        struct termios term;
     140        int rv = tcgetattr(fd, &term);
     141        assert(rv == 0);
     142
     143        change_serial_settings(fd, &term, icanon);
     144        do_read_select(fd);
     145        do_write_select(STDOUT_FILENO);
     146        tcsetattr(fd, TCSANOW, &term);
     147        return (0);
     148}
     149
     150rtems_shell_cmd_t rtems_shell_ARP_Command = {
     151        .name = "termiosselect",
     152        .usage = "termiosselect [icanon]",
     153        .topic = "net",
     154        .command = termiosselect_command
     155};
    41156
    42157static void
     
    51166}
    52167
     168#define RTEMS_BSD_CONFIG_TERMIOS_KQUEUE_AND_POLL
     169
    53170#include <rtems/bsd/test/default-init.h>
Note: See TracChangeset for help on using the changeset viewer.