File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / readline / shell.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 01:01:01 2021 UTC (3 years, 3 months ago) by misho
Branches: readline, MAIN
CVS tags: v8_2p0, v8_1p0, HEAD
readline 8.1

    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,2017 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 (char *string)
   96: {
   97:   register int c;
   98:   char *result, *r, *s;
   99: 
  100:   result = (char *)xmalloc (3 + (4 * strlen (string)));
  101:   r = result;
  102:   *r++ = '\'';
  103: 
  104:   for (s = string; s && (c = *s); s++)
  105:     {
  106:       *r++ = c;
  107: 
  108:       if (c == '\'')
  109: 	{
  110: 	  *r++ = '\\';	/* insert escaped single quote */
  111: 	  *r++ = '\'';
  112: 	  *r++ = '\'';	/* start new quoted string */
  113: 	}
  114:     }
  115: 
  116:   *r++ = '\'';
  117:   *r = '\0';
  118: 
  119:   return (result);
  120: }
  121: 
  122: /* Set the environment variables LINES and COLUMNS to lines and cols,
  123:    respectively. */
  124: static char setenv_buf[INT_STRLEN_BOUND (int) + 1];
  125: static char putenv_buf1[INT_STRLEN_BOUND (int) + 6 + 1];	/* sizeof("LINES=") == 6 */
  126: static char putenv_buf2[INT_STRLEN_BOUND (int) + 8 + 1];	/* sizeof("COLUMNS=") == 8 */
  127: 
  128: void
  129: sh_set_lines_and_columns (int lines, int cols)
  130: {
  131: #if defined (HAVE_SETENV)
  132:   sprintf (setenv_buf, "%d", lines);
  133:   setenv ("LINES", setenv_buf, 1);
  134: 
  135:   sprintf (setenv_buf, "%d", cols);
  136:   setenv ("COLUMNS", setenv_buf, 1);
  137: #else /* !HAVE_SETENV */
  138: #  if defined (HAVE_PUTENV)
  139:   sprintf (putenv_buf1, "LINES=%d", lines);
  140:   putenv (putenv_buf1);
  141: 
  142:   sprintf (putenv_buf2, "COLUMNS=%d", cols);
  143:   putenv (putenv_buf2);
  144: #  endif /* HAVE_PUTENV */
  145: #endif /* !HAVE_SETENV */
  146: }
  147: 
  148: char *
  149: sh_get_env_value (const char *varname)
  150: {
  151:   return ((char *)getenv (varname));
  152: }
  153: 
  154: char *
  155: sh_get_home_dir (void)
  156: {
  157:   static char *home_dir = (char *)NULL;
  158:   struct passwd *entry;
  159: 
  160:   if (home_dir)
  161:     return (home_dir);
  162: 
  163:   home_dir = (char *)NULL;
  164: #if defined (HAVE_GETPWUID)
  165: #  if defined (__TANDEM)
  166:   entry = getpwnam (getlogin ());
  167: #  else
  168:   entry = getpwuid (getuid ());
  169: #  endif
  170:   if (entry)
  171:     home_dir = savestring (entry->pw_dir);
  172: #endif
  173: 
  174: #if defined (HAVE_GETPWENT)
  175:   endpwent ();		/* some systems need this */
  176: #endif
  177: 
  178:   return (home_dir);
  179: }
  180: 
  181: #if !defined (O_NDELAY)
  182: #  if defined (FNDELAY)
  183: #    define O_NDELAY FNDELAY
  184: #  endif
  185: #endif
  186: 
  187: int
  188: sh_unset_nodelay_mode (int fd)
  189: {
  190: #if defined (HAVE_FCNTL)
  191:   int flags, bflags;
  192: 
  193:   if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
  194:     return -1;
  195: 
  196:   bflags = 0;
  197: 
  198: #ifdef O_NONBLOCK
  199:   bflags |= O_NONBLOCK;
  200: #endif
  201: 
  202: #ifdef O_NDELAY
  203:   bflags |= O_NDELAY;
  204: #endif
  205: 
  206:   if (flags & bflags)
  207:     {
  208:       flags &= ~bflags;
  209:       return (fcntl (fd, F_SETFL, flags));
  210:     }
  211: #endif
  212: 
  213:   return 0;
  214: }

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