Changeset edcb982 in rtems for cpukit/telnetd


Ignore:
Timestamp:
Nov 26, 2007, 11:10:25 PM (12 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.9, master
Children:
cf7ebcf
Parents:
fa920f1
Message:

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

  • telnetd/pty.c, telnetd/telnetd.c, telnetd/telnetd.h: Style clean up. Now works on gen5200/icecube.
Location:
cpukit/telnetd
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • cpukit/telnetd/pty.c

    rfa920f1 redcb982  
    113113
    114114  if (telnet_pty_inited) {
     115#if 0
    115116    if ( rtems_telnetd_maximum_ptys < 5 )
    116117      rtems_telnetd_maximum_ptys = 5;
    117118
    118119    telnet_ptys = malloc( rtems_telnetd_maximum_ptys * sizeof (pty_t) );
     120#endif
    119121    if ( !telnet_ptys ) {
    120122      return NULL;
     
    122124     
    123125    for (ndx=0;ndx<rtems_telnetd_maximum_ptys;ndx++) {
     126
    124127      if (telnet_ptys[ndx].socket<0) {
    125128        struct timeval t;
     
    426429)
    427430{
    428 int ndx;
    429 rtems_status_code status ;
     431  int ndx;
     432  rtems_status_code status;
     433
     434  if ( rtems_telnetd_maximum_ptys < 5 )
     435    rtems_telnetd_maximum_ptys = 5;
     436
     437  telnet_ptys = malloc( rtems_telnetd_maximum_ptys * sizeof (pty_t) );
    430438
    431439  /*
     
    434442
    435443  for (ndx=0;ndx<rtems_telnetd_maximum_ptys;ndx++) {
    436     telnet_ptys[ndx].devname=(char*)malloc(strlen("/dev/ptyXX")+1);
     444    telnet_ptys[ndx].devname = (char*)malloc(strlen("/dev/ptyXX")+1);
    437445    sprintf(telnet_ptys[ndx].devname,"/dev/pty%X",ndx);
    438     telnet_ptys[ndx].ttyp=NULL;
    439     telnet_ptys[ndx].c_cflag=CS8|B9600;
    440     telnet_ptys[ndx].socket=-1;
    441     telnet_ptys[ndx].opened=FALSE;
    442     telnet_ptys[ndx].sb_ind=0;
    443     telnet_ptys[ndx].width=0;
    444     telnet_ptys[ndx].height=0;
     446    telnet_ptys[ndx].ttyp    =  NULL;
     447    telnet_ptys[ndx].c_cflag = CS8|B9600;
     448    telnet_ptys[ndx].socket  = -1;
     449    telnet_ptys[ndx].opened  = FALSE;
     450    telnet_ptys[ndx].sb_ind  = 0;
     451    telnet_ptys[ndx].width   = 0;
     452    telnet_ptys[ndx].height  = 0;
    445453
    446454  }
  • cpukit/telnetd/telnetd.c

    rfa920f1 redcb982  
    6262
    6363struct shell_args {
    64   char  *devname;
    65   void  *arg;
    66   char  peername[16];
    67   char  delete_myself;
     64  char *devname;
     65  void *arg;
     66  char  peername[16];
     67  char  delete_myself;
    6868};
    6969
    7070typedef union uni_sa {
    71   struct sockaddr_in    sin;
     71  struct sockaddr_in sin;
    7272  struct sockaddr     sa;
    7373} uni_sa;
     
    7676
    7777static int initialize_telnetd();
    78 
    79 void * telnetd_dflt_spawn(const char *name, unsigned priority, unsigned stackSize, void (*fn)(void*), void *fnarg);
     78static int telnetd_askForPassword;
     79
     80void * telnetd_dflt_spawn(
     81  const char *name,
     82  unsigned priority,
     83  unsigned stackSize,
     84  void (*fn)(void*),
     85  void *fnarg
     86);
    8087
    8188/***********************************************************/
    8289rtems_id            telnetd_task_id      =0;
    83 uint32_t                    telnetd_stack_size   =32000;
     90uint32_t            telnetd_stack_size   =32000;
    8491rtems_task_priority telnetd_task_priority=0;
    85 int                                     telnetd_dont_spawn   =0;
    86 void                            (*telnetd_shell)(char *, void*)=0;
    87 void                            *telnetd_shell_arg       =0;
    88 void *                          (*telnetd_spawn_task)(const char *, unsigned, unsigned, void (*)(void*), void *) = telnetd_dflt_spawn;
     92int                 telnetd_dont_spawn   =0;
     93void                (*telnetd_shell)(char *, void*)=0;
     94void                *telnetd_shell_arg         =0;
     95void *              (*telnetd_spawn_task)(
     96        const char *, unsigned, unsigned, void (*)(void*), void *) = telnetd_dflt_spawn;
    8997
    9098static char *grab_a_Connection(int des_socket, uni_sa *srv, char *peername, int sz)
    9199{
    92 char            *rval = 0;
     100  char *rval = 0;
    93101#if 0
    94 socklen_t       
     102  socklen_t size_adr = sizeof(srv->sin);
    95103#else
    96 /* 4.6 doesn't have socklen_t */
    97 uint32_t
    98 #endif
    99       size_adr = sizeof(srv->sin);
    100 int                     acp_sock;
     104  /* 4.6 doesn't have socklen_t */
     105  uint32_t size_adr = sizeof(srv->sin);
     106#endif
     107  int acp_sock;
    101108
    102109  acp_sock = accept(des_socket,&srv->sa,&size_adr);
     
    146153static int sockpeername(int sock, char *buf, int bufsz)
    147154{
    148 uni_sa  peer;
     155  uni_sa peer;
     156  int    rval = sock < 0;
    149157#if 0
    150 socklen_t       
     158  socklen_t len  = sizeof(peer.sin);
    151159#else
    152 /* 4.6 doesn't have socklen_t */
    153 uint32_t
    154 #endif
    155     len  = sizeof(peer.sin);
    156 
    157 int             rval = sock < 0;
    158 
    159   if ( !rval)
     160  /* 4.6 doesn't have socklen_t */
     161  uint32_t len  = sizeof(peer.sin);
     162#endif
     163
     164  if ( !rval )
    160165    rval = getpeername(sock, &peer.sa, &len);
    161166
     
    181186rtems_task_telnetd(void *task_argument)
    182187{
    183 int                                     des_socket;
    184 uni_sa                          srv;
    185 char                            *devname;
    186 char                            peername[16];
    187 int                                     i=1;
    188 int                                     size_adr;
    189 struct shell_args       *arg;
     188  int                des_socket;
     189  uni_sa             srv;
     190  char              *devname;
     191  char               peername[16];
     192  int                i=1;
     193  int                size_adr;
     194  struct shell_args *arg;
    190195
    191196  if ((des_socket=socket(PF_INET,SOCK_STREAM,0))<0) {
     
    220225
    221226    if ( !devname ) {
    222     /* if something went wrong, sleep for some time */
    223     sleep(10);
    224     continue;
     227      /* if something went wrong, sleep for some time */
     228      sleep(10);
     229      continue;
    225230    }
    226231    if ( telnetd_dont_spawn ) {
    227     if ( 0 == check_passwd(peername) )
    228       telnetd_shell(devname, telnetd_shell_arg);
     232      if ( !telnetd_askForPassword || (0 == check_passwd(peername)) )
     233        telnetd_shell(devname, telnetd_shell_arg);
    229234    } else {
    230     arg = malloc( sizeof(*arg) );
    231 
    232     arg->devname = devname;
    233     arg->arg = telnetd_shell_arg;
    234     strncpy(arg->peername, peername, sizeof(arg->peername));
    235 
    236     if ( !telnetd_spawn_task(&devname[5], telnetd_task_priority, telnetd_stack_size, spawned_shell, arg) ) {
    237 
    238       FILE *dummy;
    239 
    240       if ( telnetd_spawn_task != telnetd_dflt_spawn ) {
    241         fprintf(stderr,"Telnetd: Unable to spawn child task\n");
     235      arg = malloc( sizeof(*arg) );
     236
     237      arg->devname = devname;
     238      arg->arg = telnetd_shell_arg;
     239      strncpy(arg->peername, peername, sizeof(arg->peername));
     240
     241      if ( !telnetd_spawn_task( &devname[5], telnetd_task_priority,
     242               telnetd_stack_size, spawned_shell, arg) ) {
     243        FILE *dummy;
     244
     245        if ( telnetd_spawn_task != telnetd_dflt_spawn ) {
     246          fprintf(stderr,"Telnetd: Unable to spawn child task\n");
     247        }
     248
     249        /* hmm - the pty driver slot can only be
     250         * released by opening and subsequently
     251         * closing the PTY - this also closes
     252         * the underlying socket. So we mock up
     253         * a stream...
     254         */
     255
     256        if ( !(dummy=fopen(devname,"r+")) )
     257          perror("Unable to dummy open the pty, losing a slot :-(");
     258        release_a_Connection(devname, peername, &dummy, 1);
     259        free(arg);
     260        sleep(2); /* don't accept connections too fast */
    242261      }
    243 
    244       /* hmm - the pty driver slot can only be
    245        * released by opening and subsequently
    246        * closing the PTY - this also closes
    247        * the underlying socket. So we mock up
    248        * a stream...
    249        */
    250 
    251       if ( !(dummy=fopen(devname,"r+")) )
    252         perror("Unable to dummy open the pty, losing a slot :-(");
    253       release_a_Connection(devname, peername, &dummy, 1);
    254       free(arg);
    255       sleep(2); /* don't accept connections too fast */
    256                 }
    257262    }
    258263  } while(1);
     264
    259265  /* TODO: how to free the connection semaphore? But then -
    260266   *       stopping the daemon is probably only needed during
     
    266272  telnetd_task_id=0;
    267273}
     274
    268275/***********************************************************/
    269276static int initialize_telnetd(void) {
     
    272279  if (telnetd_stack_size<=0   ) telnetd_stack_size   =32000;
    273280
    274   if ( !telnetd_spawn_task("TNTD", telnetd_task_priority, RTEMS_MINIMUM_STACK_SIZE, rtems_task_telnetd, 0) ) {
    275     return -1; 
     281  if ( !telnetd_spawn_task("TNTD", telnetd_task_priority,
     282          RTEMS_MINIMUM_STACK_SIZE, rtems_task_telnetd, 0) ) {
     283    return -1;
    276284  }
    277285  return 0;
     
    284292  int                  dontSpawn,
    285293  size_t               stack,
    286   rtems_task_priority  priority
     294  rtems_task_priority  priority,
     295  int                  askForPassword
    287296)
    288297{
    289   rtems_status_code     sc;
     298  rtems_status_code sc;
    290299
    291300#if 0
     
    309318    return 1;
    310319  }
     320
     321  telnetd_askForPassword = askForPassword;
    311322
    312323  if (cmd)
     
    318329  }
    319330  if ( priority < 2 )
    320     priority=100;
     331    priority = 100;
    321332  telnetd_task_priority = priority;
    322333  telnetd_dont_spawn    = dontSpawn;
    323334
    324   sc=initialize_telnetd();
    325         if (sc!=RTEMS_SUCCESSFUL) return sc;
     335  sc = initialize_telnetd();
     336  if (sc != RTEMS_SUCCESSFUL) return sc;
     337
    326338  printf("rtems_telnetd() started with stacksize=%u,priority=%d\n",
    327                         (unsigned)telnetd_stack_size,(int)telnetd_task_priority);
     339    (unsigned)telnetd_stack_size,(int)telnetd_task_priority);
    328340  return 0;
    329341}
     
    333345spawned_shell(void *targ)
    334346{
    335 rtems_status_code       sc;
    336 FILE                            *nstd[3]={0};
    337 FILE                            *ostd[3]={ stdin, stdout, stderr };
    338 int                                     i=0;
    339 struct shell_args       *arg = targ;
     347  rtems_status_code    sc;
     348  FILE                *nstd[3]={0};
     349  FILE                *ostd[3]={ stdin, stdout, stderr };
     350  int                  i=0;
     351  struct shell_args  *arg = targ;
    340352
    341353  sc=rtems_libio_set_private_env();
     
    366378  stderr = nstd[2];
    367379
    368 
    369 
    370 #if 0
    371 printk("STDOUT is now %x (%x) (FD %i/%i)\n",stdout,nstd[1],fileno(stdout),fileno(nstd[1]));
    372 printf("hello\n");
    373 write(fileno(stdout),"hellofd\n",8);
    374 #endif
     380  #if 0
     381    printk("STDOUT is now %x (%x) (FD %i/%i)\n",
     382           stdout,nstd[1],fileno(stdout),fileno(nstd[1]));
     383    printf("hello\n");
     384    write(fileno(stdout),"hellofd\n",8);
     385  #endif
    375386
    376387  /* call their routine */
    377   if ( 0 == check_passwd(arg->peername) )
     388  if ( !telnetd_askForPassword || (0 == check_passwd(arg->peername)) )
    378389    telnetd_shell(arg->devname, arg->arg);
    379390
     
    395406wrap_delete(rtems_task_argument arg)
    396407{
    397 struct wrap_delete_args     *pwa = (struct wrap_delete_args *)arg;
    398 register void              (*t)(void *) = pwa->t;
    399 register void               *a   = pwa->a;
     408  struct wrap_delete_args     *pwa = (struct wrap_delete_args *)arg;
     409  register void              (*t)(void *) = pwa->t;
     410  register void               *a   = pwa->a;
    400411
    401412  /* free argument before calling function (which may never return if
     
    410421telnetd_dflt_spawn(const char *name, unsigned int priority, unsigned int stackSize, void (*fn)(void *), void* fnarg)
    411422{
    412 rtems_status_code sc;
    413 rtems_id          task_id;
    414 char              nm[4] = {'X','X','X','X' };
    415 struct wrap_delete_args *pwa = malloc(sizeof(*pwa));
    416 
    417     strncpy(nm, name, 4);
    418 
    419     if ( !pwa ) {
    420       perror("Telnetd: no memory\n");
    421       return 0;
    422     }
    423 
    424     pwa->t = fn;
    425     pwa->a = fnarg;
    426 
    427     if ((sc=rtems_task_create(
    428         rtems_build_name(nm[0], nm[1], nm[2], nm[3]),
    429         (rtems_task_priority)priority,
    430         stackSize,
    431         RTEMS_DEFAULT_MODES,
    432         RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT,
    433         &task_id)) ||
    434       (sc=rtems_task_start(
    435         task_id,
    436         wrap_delete,
    437         (rtems_task_argument)pwa))) {
    438           free(pwa);
    439           rtems_error(sc,"Telnetd: spawning task failed");
    440           return 0;
    441     }
     423  rtems_status_code        sc;
     424  rtems_id                 task_id;
     425  char                     nm[4] = {'X','X','X','X' };
     426  struct wrap_delete_args *pwa = malloc(sizeof(*pwa));
     427
     428  strncpy(nm, name, 4);
     429
     430  if ( !pwa ) {
     431    perror("Telnetd: no memory\n");
     432    return 0;
     433  }
     434
     435  pwa->t = fn;
     436  pwa->a = fnarg;
     437
     438  if ((sc=rtems_task_create(
     439    rtems_build_name(nm[0], nm[1], nm[2], nm[3]),
     440      (rtems_task_priority)priority,
     441      stackSize,
     442      RTEMS_DEFAULT_MODES,
     443      RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT,
     444      &task_id)) ||
     445    (sc=rtems_task_start(
     446      task_id,
     447      wrap_delete,
     448      (rtems_task_argument)pwa))) {
     449        free(pwa);
     450        rtems_error(sc,"Telnetd: spawning task failed");
     451        return 0;
     452  }
    442453  return (void*)task_id;
    443454}
     
    445456/* convenience routines for CEXP (retrieve stdio descriptors
    446457 * from reent structure)
    447  *
    448458 */
    449459#ifdef stdin
  • cpukit/telnetd/telnetd.h

    rfa920f1 redcb982  
    2121 *  Initialize the telnetd subsystem.
    2222 *
    23  *  cmd        - function which is the "shell" telnetd invokes
    24  *  arg        - context pointer to cmd
    25  *  dontSpawn  - TRUE if telnetd takes over this task.
    26  *               FALSE to create another task for the shell.
    27  *  stack      - stack size of spawned task
    28  *  priority   - initial priority of spawned task
     23 *  cmd              - function which is the "shell" telnetd invokes
     24 *  arg              - context pointer to cmd
     25 *  dontSpawn        - TRUE if telnetd takes over this task.
     26 *                     FALSE to create another task for the shell.
     27 *  stack            - stack size of spawned task
     28 *  priority         - initial priority of spawned task
     29 *  askForPassword   - TRUE if telnetd asks for password
     30 *                     FALSE to invoke "cmd" with no password check.
     31 *                        This may be OK if "cmd" includes its own check.
    2932 */
    3033int rtems_telnetd_initialize(
     
    3336  int                  dontSpawn,
    3437  size_t               stack,
    35   rtems_task_priority  priority
     38  rtems_task_priority  priority,
     39  int                  askForPassword
    3640);
    3741
Note: See TracChangeset for help on using the changeset viewer.