Changeset b7fa289 in rtems


Ignore:
Timestamp:
Oct 11, 2007, 12:49:27 PM (12 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.9, master
Children:
dd7f591
Parents:
c57316a
Message:

2007-10-11 Joel Sherrill <joel.sherrill@…>

  • score/include/rtems/score/copyrt.h: Update year.
Location:
cpukit
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • cpukit/ChangeLog

    rc57316a rb7fa289  
     12007-10-11      Joel Sherrill <joel.sherrill@OARcorp.com>
     2
     3        * score/include/rtems/score/copyrt.h: Update year.
     4
     52007-10-11      Joel Sherrill <joel.sherrill@OARcorp.com>
     6
     7        * score/include/rtems/score/copyrt.h: Update year.
     8
     92007-10-11      Daniel Hellstrom <daniel@gaisler.com>
     10
     11        * libi2c/libi2c.c, libi2c/libi2c.h: Add message about needing IMFS.
     12        Fixed check of status when registering driver. Add use of strerror().
     13
    1142007-10-04      Keith Robertson <kjrobert@alumni.uwaterloo.ca>,
    215        Ralf Corsépius <ralf.corsepius@rtems.org>
  • cpukit/score/include/rtems/score/copyrt.h

    rc57316a rb7fa289  
    2929#ifdef SCORE_INIT
    3030const char _Copyright_Notice[] =
    31 "COPYRIGHT (c) 1989-2004.\n\
     31"COPYRIGHT (c) 1989-2007.\n\
    3232On-Line Applications Research Corporation (OAR).\n";
    3333#else
  • cpukit/telnetd/pty.c

    rc57316a rb7fa289  
    11/*
    2  * /dev/ptyXX  (A first version for pseudo-terminals)
     2 * /dev/ptyXX  (Support for pseudo-terminals)
    33 *
    4  *  Author: Fernando RUIZ CASAS (fernando.ruiz@ctv.es)
     4 *  Original Author: Fernando RUIZ CASAS (fernando.ruiz@ctv.es)
    55 *  May 2001
    66 *
     
    5050#endif
    5151
    52 #define DEBUG_WH                (1<<0)
    53 #define DEBUG_DETAIL    (1<<1)
     52#define DEBUG_WH    (1<<0)
     53#define DEBUG_DETAIL  (1<<1)
    5454
    5555/* #define DEBUG DEBUG_WH */
     
    6464#include <rtems.h>
    6565#include <rtems/libio.h>
    66 #include <bsp.h>
    6766#include <rtems/bspIo.h>
    68 #if 0
    69 #include <rtems/pty.h>
    70 #else
    71 #define MAX_PTYS 8
    72 #endif
    7367#include <errno.h>
    7468#include <sys/socket.h>
     
    10094#define IAC_EOR    239
    10195
    102 #define SB_MAX          16
     96#define SB_MAX    16
     97
     98extern int rtems_telnetd_maximum_ptys;
    10399
    104100struct pty_tt;
     
    113109 int                       last_cr;
    114110 unsigned                  iac_mode;   
    115  unsigned char             sb_buf[SB_MAX];     
     111 unsigned char             sb_buf[SB_MAX]; 
    116112 int                       sb_ind;
    117113 int                       width;
     
    121117
    122118#ifdef __cplusplus
    123 
    124119extern "C" {
    125 int             printk(char*,...);
    126 
    127 #endif
    128 
    129 #if     MAX_PTYS > 5
    130 #undef  MAX_PTYS
    131 #define MAX_PTYS 5
    132 #endif
    133 
    134 
    135 static int   telnet_pty_inited=FALSE;
    136 static pty_t telnet_ptys[MAX_PTYS];
     120#endif
     121
     122
     123static int    telnet_pty_inited=FALSE;
     124static pty_t *telnet_ptys;
    137125
    138126static rtems_device_major_number pty_major;
     
    144132 */
    145133
    146 char *  telnet_get_pty(int socket) {
     134char *  telnet_get_pty(int socket)
     135{
    147136  int ndx;
     137
    148138  if (telnet_pty_inited) {
    149     for (ndx=0;ndx<MAX_PTYS;ndx++) {
     139    if ( rtems_telnetd_maximum_ptys < 5 )
     140      rtems_telnetd_maximum_ptys = 5;
     141
     142    telnet_ptys = malloc( rtems_telnetd_maximum_ptys * sizeof (pty_t) );
     143    if ( !telnet_ptys ) {
     144      return NULL;
     145    }
     146     
     147    for (ndx=0;ndx<rtems_telnetd_maximum_ptys;ndx++) {
    150148      if (telnet_ptys[ndx].socket<0) {
    151149        struct timeval t;
     
    175173static const char IAC_IP_RSP []="<*Interrupt*>";
    176174
    177 
    178175static
    179 int send_iac(int minor,unsigned char mode,unsigned char option) {
     176int send_iac(int minor,unsigned char mode,unsigned char option)
     177{
    180178  unsigned char buf[3];
     179
    181180  buf[0]=IAC_ESC;
    182181  buf[1]=mode;
     
    189188{
    190189  switch (pty->sb_buf[0]) {
    191     case 31:    /* NAWS */
     190    case 31:  /* NAWS */
    192191      pty->width  = (pty->sb_buf[1]<<8) + pty->sb_buf[2];
    193192      pty->height = (pty->sb_buf[3]<<8) + pty->sb_buf[4];
     
    205204}
    206205
    207 static int read_pty(int minor) { /* Characters written to the client side*/
    208    unsigned char        value;
    209    unsigned int omod;
    210    int                  count;
    211    int                  result;
    212    pty_t                        *pty=telnet_ptys+minor;
     206static int read_pty(int minor)
     207{ /* Characters written to the client side*/
     208   unsigned char  value;
     209   unsigned int  omod;
     210   int      count;
     211   int      result;
     212   pty_t      *pty=telnet_ptys+minor;
    213213
    214214   count=read(pty->socket,&value,sizeof(value));
     
    293293           pty->iac_mode=omod;
    294294           if (IAC_ESC==value) {
    295             pty->iac_mode=(omod<<8)|value;
     295             pty->iac_mode=(omod<<8)|value;
    296296           } else {
    297             if (pty->sb_ind < SB_MAX)
    298               pty->sb_buf[pty->sb_ind++]=value;
     297             if (pty->sb_ind < SB_MAX)
     298               pty->sb_buf[pty->sb_ind++]=value;
    299299           }
    300300           return -1;
     
    302302       case IAC_WILL:
    303303           if (value==34){
    304               send_iac(minor,IAC_DONT,   34);   /*LINEMODE*/
    305               send_iac(minor,IAC_DO  ,    1);   /*ECHO    */
     304              send_iac(minor,IAC_DONT,   34);  /*LINEMODE*/
     305              send_iac(minor,IAC_DO  ,    1);  /*ECHO    */
    306306           } else if (value==31) {
    307               send_iac(minor,IAC_DO  ,   31);   /*NAWS    */
     307              send_iac(minor,IAC_DO  ,   31);  /*NAWS    */
    308308#if DEBUG & DEBUG_DETAIL
    309309              printk("replied DO NAWS\n");
     
    317317       case IAC_DO  :
    318318           if (value==3) {
    319               send_iac(minor,IAC_WILL,    3);   /* GO AHEAD*/
    320            } else       if (value==1) {                         
     319              send_iac(minor,IAC_WILL,    3);  /* GO AHEAD*/
     320           } else  if (value==1) {                         
    321321              /* ECHO */
    322322           } else {
     
    325325           return -1;
    326326       case IAC_WONT:
    327            if (value==1) {send_iac(minor,IAC_WILL,    1);} else /* ECHO */
    328            {send_iac(minor,IAC_WONT,value);};
     327           if (value==1) {
     328             send_iac(minor,IAC_WILL,    1);
     329           } else { /* ECHO */
     330             send_iac(minor,IAC_WONT,value);
     331           }
    329332           return -1;
    330333       default:
     
    335338              result=value; 
    336339              if ( 0
    337 #if 0                                                    /* pass CRLF through - they should use termios to handle it */
    338                  ||     ((value=='\n') && (pty->last_cr))
     340#if 0              /* pass CRLF through - they should use termios to handle it */
     341                 ||  ((value=='\n') && (pty->last_cr))
    339342#endif
    340343                /* but map telnet CRNUL to CR down here */
     
    361364static int
    362365ptySetAttributes(int minor,const struct termios *t) {
    363   if (minor<MAX_PTYS) {
    364    telnet_ptys[minor].c_cflag=t->c_cflag;       
     366  if (minor<rtems_telnetd_maximum_ptys) {
     367   telnet_ptys[minor].c_cflag=t->c_cflag;
    365368  } else {
    366369   return -1;
     
    373376  rtems_libio_open_close_args_t * args = (rtems_libio_open_close_args_t*)arg;
    374377  struct termios t;
    375         if (minor<MAX_PTYS) {   
    376          if (telnet_ptys[minor].socket<0) return -1;           
     378        if (minor<rtems_telnetd_maximum_ptys) {
     379         if (telnet_ptys[minor].socket<0) return -1;
    377380   telnet_ptys[minor].opened=TRUE;
    378381   telnet_ptys[minor].ttyp= (struct rtems_termios_tty *) args->iop->data1;
     
    385388  } else {
    386389   return -1;
    387   };
     390  }
    388391}
    389392/*-----------------------------------------------------------*/
    390393static int
    391394ptyShutdown(int major,int minor,void * arg) {
    392         if (minor<MAX_PTYS) {   
    393    telnet_ptys[minor].opened=FALSE;
    394          if (telnet_ptys[minor].socket>=0) close(telnet_ptys[minor].socket);
    395    telnet_ptys[minor].socket=-1;
    396    chown(telnet_ptys[minor].devname,2,0);
     395  if (minor<rtems_telnetd_maximum_ptys) {
     396    telnet_ptys[minor].opened=FALSE;
     397    if (telnet_ptys[minor].socket>=0) close(telnet_ptys[minor].socket);
     398      telnet_ptys[minor].socket=-1;
     399    chown(telnet_ptys[minor].devname,2,0);
    397400  } else {
    398    return -1;
    399   };
     401    return -1;
     402  }
    400403  return 0;
    401404}
     
    406409ptyPollWrite(int minor, const char * buf,int len) {
    407410  int count;
    408         if (minor<MAX_PTYS) {   
    409          if (telnet_ptys[minor].socket<0) return -1;           
    410    count=write(telnet_ptys[minor].socket,buf,len);
     411  if (minor<rtems_telnetd_maximum_ptys) {
     412    if (telnet_ptys[minor].socket<0)
     413      return -1;
     414    count=write(telnet_ptys[minor].socket,buf,len);
    411415  } else {
    412416   count=-1;
    413   };
     417  }
    414418  return count;
    415419}
     
    418422ptyPollRead(int minor) {
    419423  int result;
    420         if (minor<MAX_PTYS) {   
    421          if (telnet_ptys[minor].socket<0) return -1;           
    422    result=read_pty(minor);
    423    return result;
    424   };
     424
     425  if (minor<rtems_telnetd_maximum_ptys) {
     426    if (telnet_ptys[minor].socket<0)
     427      return -1;
     428    result=read_pty(minor);
     429    return result;
     430  }
    425431  return -1;
    426432}
     
    444450)
    445451{
    446 int ndx;       
     452int ndx;
    447453rtems_status_code status ;
    448454
     
    451457   */
    452458
    453   for (ndx=0;ndx<MAX_PTYS;ndx++) {
     459  for (ndx=0;ndx<rtems_telnetd_maximum_ptys;ndx++) {
    454460    telnet_ptys[ndx].devname=(char*)malloc(strlen("/dev/ptyXX")+1);
    455461    sprintf(telnet_ptys[ndx].devname,"/dev/pty%X",ndx);
     
    462468    telnet_ptys[ndx].height=0;
    463469
    464   };
     470  }
    465471
    466472  /*
    467473   * Register the devices
    468474   */
    469   for (ndx=0;ndx<MAX_PTYS;ndx++) {
     475  for (ndx=0;ndx<rtems_telnetd_maximum_ptys;ndx++) {
    470476    status = rtems_io_register_name(telnet_ptys[ndx].devname, major, ndx);
    471477    if (status != RTEMS_SUCCESSFUL)
     
    474480    chown(telnet_ptys[ndx].devname,2,0); /* tty,root*/
    475481  };
    476   printk("Device: /dev/pty%X../dev/pty%X (%d)pseudo-terminals registered.\n",0,MAX_PTYS-1,MAX_PTYS);
     482  printk("Device: /dev/pty%X../dev/pty%X (%d)pseudo-terminals registered.\n",
     483          0,rtems_telnetd_maximum_ptys-1,rtems_telnetd_maximum_ptys);
    477484
    478485  return RTEMS_SUCCESSFUL;
     
    487494      return 0;
    488495
    489     for (ndx=0;ndx<MAX_PTYS;ndx++) {
     496    for (ndx=0;ndx<rtems_telnetd_maximum_ptys;ndx++) {
    490497      if (telnet_ptys[ndx].opened) {
    491           fprintf(stderr,"There are still opened PTY devices, unable to proceed\n");
     498          fprintf(stderr,
     499            "There are still opened PTY devices, unable to proceed\n");
    492500          return -1;
    493501      }
     
    497505        return -1;
    498506    }
    499     for (ndx=0;ndx<MAX_PTYS;ndx++) {
     507    for (ndx=0;ndx<rtems_telnetd_maximum_ptys;ndx++) {
    500508        /* rtems_io_register_name() actually creates a node in the filesystem
    501509         * (mknod())
     
    507515          free(telnet_ptys[ndx].devname);
    508516    };
     517
     518    free ( telnet_ptys );
     519
    509520    fprintf(stderr,"PTY driver unloaded successfully\n");
    510521    telnet_pty_inited=FALSE;
     
    523534)
    524535{
    525   rtems_status_code sc ;
     536  rtems_status_code sc;
    526537  sc = rtems_termios_open(major,minor,arg,pty_get_termios_handlers(FALSE));
    527538  return sc;
     
    581592)
    582593{
    583 rtems_libio_ioctl_args_t *args = (rtems_libio_ioctl_args_t*)arg;
    584 struct winsize                  *wp = (struct winsize*)args->buffer;
    585 pty_t                                    *p=&telnet_ptys[minor];
     594  rtems_libio_ioctl_args_t *args = (rtems_libio_ioctl_args_t*)arg;
     595  struct winsize          *wp = (struct winsize*)args->buffer;
     596  pty_t                    *p = &telnet_ptys[minor];
    586597
    587598  switch (args->command) {
     
    617628    default:
    618629
    619         break;
     630     break;
    620631  }
    621632
     
    634645/*-----------------------------------------------------------*/
    635646static const rtems_termios_callbacks pty_poll_callbacks = {
    636   ptyPollInitialize,    /* FirstOpen*/
    637   ptyShutdown,          /* LastClose*/
    638   ptyPollRead,          /* PollRead  */
    639   ptyPollWrite,         /* Write */
    640   ptySetAttributes,     /* setAttributes */
    641   NULL,                 /* stopRemoteTX */
    642   NULL,                 /* StartRemoteTX */
    643   0                     /* outputUsesInterrupts */
     647  ptyPollInitialize,  /* FirstOpen */
     648  ptyShutdown,        /* LastClose */
     649  ptyPollRead,        /* PollRead  */
     650  ptyPollWrite,       /* Write */
     651  ptySetAttributes,   /* setAttributes */
     652  NULL,               /* stopRemoteTX */
     653  NULL,               /* StartRemoteTX */
     654  0                   /* outputUsesInterrupts */
    644655};
    645656/*-----------------------------------------------------------*/
     
    664675class TelnetPtyIni {
    665676public:
    666   TelnetPtyIni() { if (!nest++) {
    667             pty_do_initialize();
    668         }
    669        };
    670   ~TelnetPtyIni(){ if (!--nest) {
    671             pty_do_finalize();
    672         }
    673        };
     677  TelnetPtyIni() {
     678    if (!nest++) {
     679      pty_do_initialize();
     680    }
     681  }
     682
     683  ~TelnetPtyIni() {
     684    if (!--nest) {
     685      pty_do_finalize();
     686    }
     687  }
    674688private:
    675 static int nest;
     689  static int nest;
    676690};
    677691
    678692static TelnetPtyIni onlyInst;
    679 int TelnetPtyIni::nest=0;
     693int    TelnetPtyIni::nest=0;
    680694
    681695int telnet_pty_initialize()
Note: See TracChangeset for help on using the changeset viewer.