remShellLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* remShellLib.c - remote access to target shell */
  2. /* Copyright 1984 - 2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,30apr02,elr  Login stdin / stdout isolated from shell until login completed
  8.                  to correct security holes SPR 30687, 5059
  9.            +fmk  added notification to shell of remote session
  10. 01a,14feb01,spm  inherited from version 01a of tor2_0_x branch 
  11. */
  12. /*
  13. DESCRIPTION
  14. This library contains the support routines for remote access to the VxWorks
  15. target shell for clients using the telnet or rlogin protocols. It supplies
  16. file descriptors to connection telnet or rlogin sessions to the shell's
  17. command interpreter.
  18. INCLUDE FILES: remShellLib.h, shellLib.h
  19. */
  20. #include "vxWorks.h"
  21. #include "ioLib.h"
  22. #include "logLib.h"
  23. #include "ptyDrv.h"
  24. #include "shellLib.h"
  25. #include "taskLib.h"
  26. #include "telnetLib.h"
  27. #include "stdio.h"
  28. #include "fioLib.h"
  29. #include "sysLib.h"
  30. IMPORT  int logFdFromRlogin;    /* fd of pty for remote sessions */
  31. /* local variables */
  32. LOCAL int shellInFd;            /* original console input */
  33. LOCAL int shellOutFd;           /* original console output */
  34. LOCAL int shellErrFd;           /* original console error output */
  35. LOCAL UINT32 remoteId = 0;  /* Identifies current remote session */
  36. /*******************************************************************************
  37. *
  38. * shellParserControl - handle connecting and disconnecting remote users
  39. *
  40. * This routine configures the shell to connect new telnet or rlogin sessions
  41. * to the command interpreter by redirecting standard input and standard
  42. * output and restores the original settings when those sessions exit. This
  43. * routine is the default parser control installed when both INCLUDE_TELNET
  44. * and INCLUDE_SHELL are defined. It only supports a single remote session
  45. * at a time.
  46. *
  47. * RETURNS: OK or ERROR.
  48. * INTERNAL: In the future should be two functions  setupIoForTelnet() called 
  49. *            from telnetd and resumeLocalIo() called from logout()
  50. *
  51. *
  52. * NOMANUAL
  53. */
  54. STATUS shellParserControl
  55.     (
  56.     UINT32 remoteEvent, /* Starting or stopping a connection? */
  57.     UINT32 sessionId,  /* Unique identifier for each session */
  58.     UINT32 slaveFd      /* File descriptor for character i/o  */
  59.     )
  60.     {
  61.     if ((taskNameToId ("tShell")) == ERROR)   /* Shell not started yet. */
  62.         return (ERROR);
  63.     if (remoteEvent == REMOTE_START)
  64.         {
  65.         /* Handle a new telnet or rlogin session. */
  66.         if (remoteId != 0)    /* Failed request - only one session allowed. */
  67.             return (ERROR); 
  68.         if (!shellLock (TRUE))  /* Shell is not available. */
  69.             {
  70.     fdprintf (slaveFd, "The shell is currently in use.n");
  71.             return (ERROR);
  72.             }
  73.         /* Let the user try to login */
  74. if (shellLogin (slaveFd) != OK)
  75.     { 
  76.       shellLock (FALSE);
  77.             return (ERROR);
  78.             }
  79.         /* setup the slave device to act like a terminal */
  80.         (void) ioctl (slaveFd, FIOOPTIONS, OPT_TERMINAL);
  81.         shellLogoutInstall ((FUNCPTR) telnetdExit, sessionId);
  82.         /* get the shell's standard I/O fd's so we can restore them later */
  83.         shellInFd  = ioGlobalStdGet (STD_IN);
  84.         shellOutFd = ioGlobalStdGet (STD_OUT);
  85.         shellErrFd = ioGlobalStdGet (STD_ERR);
  86.         /* set shell's standard I/O to new device; add extra logging device */
  87.         shellOrigStdSet (STD_IN, slaveFd);
  88.         shellOrigStdSet (STD_OUT, slaveFd);
  89.         shellOrigStdSet (STD_ERR, slaveFd);
  90.         logFdAdd (slaveFd);
  91.         logFdFromRlogin = slaveFd;      /* store new fd for logFdSet() */
  92.         /* Store the session identifier. */
  93.         remoteId = sessionId;
  94.         /* notify the shell we have started a remote session */
  95.         
  96.         shellIsRemoteConnectedSet (TRUE);
  97.         printErr ("ntelnetd: This system *IN USE* via telnet.n");
  98.         /* Prevent network denial of service attacks by waiting a second */
  99.         taskDelay (sysClkRateGet() / 2); 
  100.        
  101.         /* Restart the shell to access the redirected file descriptors. */
  102.         excJobAdd (shellRestart, TRUE, 0, 0, 0, 0, 0);
  103.         return (OK);
  104.         }
  105.     else if (remoteEvent == REMOTE_STOP)
  106.         {
  107.         /*
  108.          * End an active telnet or rlogin session. This event occurs
  109.          * after the server closes the socket.
  110.          */
  111.         if (remoteId != sessionId)    /* Unknown remote session. */
  112.             return (ERROR);
  113.         shellLogoutInstall ((FUNCPTR) NULL, 0);  /* remove logout function */
  114.         if (logFdFromRlogin != NONE)
  115.             {
  116.             logFdDelete (logFdFromRlogin);       /* cancel extra log device */
  117.             logFdFromRlogin = NONE;              /* reset fd */
  118.             }
  119.         shellOrigStdSet (STD_IN,  shellInFd);    /* restore shell's stnd I/O */
  120.         shellOrigStdSet (STD_OUT, shellOutFd);
  121.         shellOrigStdSet (STD_ERR, shellErrFd);
  122.         shellLock (FALSE);                       /* unlock shell */
  123.         /*
  124.          * For typical remote sessions, restoring the standard I/O
  125.          * descriptors is enough to reconnect the shell to the console
  126.          * because closing the pty device will cause the shell to unblock
  127.          * from its read() and use the restored descriptors. However,
  128.          * problems can occur upon logout if the remote user has disabled
  129.          * the line editor and/or put the pty device in raw mode, so the
  130.          * shell is restarted in all cases.
  131.          */
  132.         remoteId = 0;    /* Allow a new session. */
  133.        /* notify the shell we have ended a remote session */
  134.         
  135.         shellIsRemoteConnectedSet (FALSE);
  136.         excJobAdd (shellRestart, FALSE, 0, 0, 0, 0, 0);
  137.         return (OK);
  138.         }
  139.     return (ERROR);    /* Ignore unknown control operations. */
  140.     }