File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / readline / shell.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Wed Jul 30 08:16:45 2014 UTC (9 years, 11 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    1: /* shell.c -- readline utility functions that are normally provided by
    2: 	      bash when readline is linked as part of the shell. */
    3: 
    4: /* Copyright (C) 1997-2009 Free Software Foundation, Inc.
    5: 
    6:    This file is part of the GNU Readline Library (Readline), a library
    7:    for reading lines of text with interactive input and history editing.      
    8: 
    9:    Readline is free software: you can redistribute it and/or modify
   10:    it under the terms of the GNU General Public License as published by
   11:    the Free Software Foundation, either version 3 of the License, or
   12:    (at your option) any later version.
   13: 
   14:    Readline is distributed in the hope that it will be useful,
   15:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   16:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   17:    GNU General Public License for more details.
   18: 
   19:    You should have received a copy of the GNU General Public License
   20:    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
   21: */
   22: 
   23: #define READLINE_LIBRARY
   24: 
   25: #if defined (HAVE_CONFIG_H)
   26: #  include <config.h>
   27: #endif
   28: 
   29: #include <sys/types.h>
   30: 
   31: #if defined (HAVE_UNISTD_H)
   32: #  include <unistd.h>
   33: #endif /* HAVE_UNISTD_H */
   34: 
   35: #if defined (HAVE_STDLIB_H)
   36: #  include <stdlib.h>
   37: #else
   38: #  include "ansi_stdlib.h"
   39: #endif /* HAVE_STDLIB_H */
   40: 
   41: #if defined (HAVE_STRING_H)
   42: #  include <string.h>
   43: #else
   44: #  include <strings.h>
   45: #endif /* !HAVE_STRING_H */
   46: 
   47: #if defined (HAVE_LIMITS_H)
   48: #  include <limits.h>
   49: #endif
   50: 
   51: #if defined (HAVE_FCNTL_H)
   52: #include <fcntl.h>
   53: #endif
   54: #if defined (HAVE_PWD_H)
   55: #include <pwd.h>
   56: #endif
   57: 
   58: #include <stdio.h>
   59: 
   60: #include "rlstdc.h"
   61: #include "rlshell.h"
   62: #include "rldefs.h"
   63: 
   64: #include "xmalloc.h"
   65: 
   66: #if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS)
   67: extern struct passwd *getpwuid PARAMS((uid_t));
   68: #endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */
   69: 
   70: #ifndef NULL
   71: #  define NULL 0
   72: #endif
   73: 
   74: #ifndef CHAR_BIT
   75: #  define CHAR_BIT 8
   76: #endif
   77: 
   78: /* Nonzero if the integer type T is signed.  */
   79: #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
   80: 
   81: /* Bound on length of the string representing an integer value of type T.
   82:    Subtract one for the sign bit if T is signed;
   83:    302 / 1000 is log10 (2) rounded up;
   84:    add one for integer division truncation;
   85:    add one more for a minus sign if t is signed.  */
   86: #define INT_STRLEN_BOUND(t) \
   87:   ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \
   88:    + 1 + TYPE_SIGNED (t))
   89: 
   90: /* All of these functions are resolved from bash if we are linking readline
   91:    as part of bash. */
   92: 
   93: /* Does shell-like quoting using single quotes. */
   94: char *
   95: sh_single_quote (string)
   96:      char *string;
   97: {
   98:   register int c;
   99:   char *result, *r, *s;
  100: 
  101:   result = (char *)xmalloc (3 + (4 * strlen (string)));
  102:   r = result;
  103:   *r++ = '\'';
  104: 
  105:   for (s = string; s && (c = *s); s++)
  106:     {
  107:       *r++ = c;
  108: 
  109:       if (c == '\'')
  110: 	{
  111: 	  *r++ = '\\';	/* insert escaped single quote */
  112: 	  *r++ = '\'';
  113: 	  *r++ = '\'';	/* start new quoted string */
  114: 	}
  115:     }
  116: 
  117:   *r++ = '\'';
  118:   *r = '\0';
  119: 
  120:   return (result);
  121: }
  122: 
  123: /* Set the environment variables LINES and COLUMNS to lines and cols,
  124:    respectively. */
  125: static char setenv_buf[INT_STRLEN_BOUND (int) + 1];
  126: static char putenv_buf1[INT_STRLEN_BOUND (int) + 6 + 1];	/* sizeof("LINES=") == 6 */
  127: static char putenv_buf2[INT_STRLEN_BOUND (int) + 8 + 1];	/* sizeof("COLUMNS=") == 8 */
  128: 
  129: void
  130: sh_set_lines_and_columns (lines, cols)
  131:      int lines, cols;
  132: {
  133: #if defined (HAVE_SETENV)
  134:   sprintf (setenv_buf, "%d", lines);
  135:   setenv ("LINES", setenv_buf, 1);
  136: 
  137:   sprintf (setenv_buf, "%d", cols);
  138:   setenv ("COLUMNS", setenv_buf, 1);
  139: #else /* !HAVE_SETENV */
  140: #  if defined (HAVE_PUTENV)
  141:   sprintf (putenv_buf1, "LINES=%d", lines);
  142:   putenv (putenv_buf1);
  143: 
  144:   sprintf (putenv_buf2, "COLUMNS=%d", cols);
  145:   putenv (putenv_buf2);
  146: #  endif /* HAVE_PUTENV */
  147: #endif /* !HAVE_SETENV */
  148: }
  149: 
  150: char *
  151: sh_get_env_value (varname)
  152:      const char *varname;
  153: {
  154:   return ((char *)getenv (varname));
  155: }
  156: 
  157: char *
  158: sh_get_home_dir ()
  159: {
  160:   static char *home_dir = (char *)NULL;
  161:   struct passwd *entry;
  162: 
  163:   if (home_dir)
  164:     return (home_dir);
  165: 
  166:   home_dir = (char *)NULL;
  167: #if defined (HAVE_GETPWUID)
  168: #  if defined (__TANDEM)
  169:   entry = getpwnam (getlogin ());
  170: #  else
  171:   entry = getpwuid (getuid ());
  172: #  endif
  173:   if (entry)
  174:     home_dir = savestring (entry->pw_dir);
  175: #endif
  176: 
  177: #if defined (HAVE_GETPWENT)
  178:   endpwent ();		/* some systems need this */
  179: #endif
  180: 
  181:   return (home_dir);
  182: }
  183: 
  184: #if !defined (O_NDELAY)
  185: #  if defined (FNDELAY)
  186: #    define O_NDELAY FNDELAY
  187: #  endif
  188: #endif
  189: 
  190: int
  191: sh_unset_nodelay_mode (fd)
  192:      int fd;
  193: {
  194: #if defined (HAVE_FCNTL)
  195:   int flags, bflags;
  196: 
  197:   if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
  198:     return -1;
  199: 
  200:   bflags = 0;
  201: 
  202: #ifdef O_NONBLOCK
  203:   bflags |= O_NONBLOCK;
  204: #endif
  205: 
  206: #ifdef O_NDELAY
  207:   bflags |= O_NDELAY;
  208: #endif
  209: 
  210:   if (flags & bflags)
  211:     {
  212:       flags &= ~bflags;
  213:       return (fcntl (fd, F_SETFL, flags));
  214:     }
  215: #endif
  216: 
  217:   return 0;
  218: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>