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 Free Software Foundation, Inc. 5 6 This file is part of the GNU Readline Library, a library for 7 reading lines of text with interactive input and history editing. 8 9 The GNU Readline Library is free software; you can redistribute it 10 and/or modify it under the terms of the GNU General Public License 11 as published by the Free Software Foundation; either version 2, or 12 (at your option) any later version. 13 14 The GNU Readline Library is distributed in the hope that it will be 15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty 16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 The GNU General Public License is often shipped with GNU software, and 20 is generally kept in a file called COPYING or LICENSE. If you do not 21 have a copy of the license, write to the Free Software Foundation, 22 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ 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 "xmalloc.h" 63 64#if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS) 65extern struct passwd *getpwuid PARAMS((uid_t)); 66#endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */ 67 68#ifndef NULL 69# define NULL 0 70#endif 71 72#ifndef CHAR_BIT 73# define CHAR_BIT 8 74#endif 75 76/* Nonzero if the integer type T is signed. */ 77#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) 78 79/* Bound on length of the string representing an integer value of type T. 80 Subtract one for the sign bit if T is signed; 81 302 / 1000 is log10 (2) rounded up; 82 add one for integer division truncation; 83 add one more for a minus sign if t is signed. */ 84#define INT_STRLEN_BOUND(t) \ 85 ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \ 86 + 1 + TYPE_SIGNED (t)) 87 88/* All of these functions are resolved from bash if we are linking readline 89 as part of bash. */ 90 91/* Does shell-like quoting using single quotes. */ 92char * 93sh_single_quote (string) 94 char *string; 95{ 96 register int c; 97 char *result, *r, *s; 98 99 result = (char *)xmalloc (3 + (4 * strlen (string))); 100 r = result; 101 *r++ = '\''; 102 103 for (s = string; s && (c = *s); s++) 104 { 105 *r++ = c; 106 107 if (c == '\'') 108 { 109 *r++ = '\\'; /* insert escaped single quote */ 110 *r++ = '\''; 111 *r++ = '\''; /* start new quoted string */ 112 } 113 } 114 115 *r++ = '\''; 116 *r = '\0'; 117 118 return (result); 119} 120 121/* Set the environment variables LINES and COLUMNS to lines and cols, 122 respectively. */ 123void 124sh_set_lines_and_columns (lines, cols) 125 int lines, cols; 126{ 127 char *b; 128 129#if defined (HAVE_SETENV) 130 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); 131 sprintf (b, "%d", lines); 132 setenv ("LINES", b, 1); 133 free (b); 134 135 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); 136 sprintf (b, "%d", cols); 137 setenv ("COLUMNS", b, 1); 138 free (b); 139#else /* !HAVE_SETENV */ 140# if defined (HAVE_PUTENV) 141 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1); 142 sprintf (b, "LINES=%d", lines); 143 putenv (b); 144 145 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("COLUMNS=") + 1); 146 sprintf (b, "COLUMNS=%d", cols); 147 putenv (b); 148# endif /* HAVE_PUTENV */ 149#endif /* !HAVE_SETENV */ 150} 151 152char * 153sh_get_env_value (varname) 154 const char *varname; 155{ 156 return ((char *)getenv (varname)); 157} 158 159char * 160sh_get_home_dir () 161{ 162 char *home_dir; 163 struct passwd *entry; 164 165 home_dir = (char *)NULL; 166#if defined (HAVE_GETPWUID) 167 entry = getpwuid (getuid ()); 168 if (entry) 169 home_dir = entry->pw_dir; 170#endif 171 return (home_dir); 172} 173 174#if !defined (O_NDELAY) 175# if defined (FNDELAY) 176# define O_NDELAY FNDELAY 177# endif 178#endif 179 180int 181sh_unset_nodelay_mode (fd) 182 int fd; 183{ 184#if defined (HAVE_FCNTL) 185 int flags, bflags; 186 187 if ((flags = fcntl (fd, F_GETFL, 0)) < 0) 188 return -1; 189 190 bflags = 0; 191 192#ifdef O_NONBLOCK 193 bflags |= O_NONBLOCK; 194#endif 195 196#ifdef O_NDELAY 197 bflags |= O_NDELAY; 198#endif 199 200 if (flags & bflags) 201 { 202 flags &= ~bflags; 203 return (fcntl (fd, F_SETFL, flags)); 204 } 205#endif 206 207 return 0; 208} 209