Added a git ignore file
[bash.git] / input.c
blob2731e290f06435930c14b28afcb7cb8096669f2a
1 /* input.c -- functions to perform buffered input with synchronization. */
3 /* Copyright (C) 1992-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
21 #include "config.h"
23 #include "bashtypes.h"
24 #if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
25 # include <sys/file.h>
26 #endif
27 #include "filecntl.h"
28 #include "posixstat.h"
29 #include <stdio.h>
30 #include <errno.h>
32 #if defined (HAVE_UNISTD_H)
33 # include <unistd.h>
34 #endif
36 #include "bashansi.h"
37 #include "bashintl.h"
39 #include "command.h"
40 #include "general.h"
41 #include "input.h"
42 #include "error.h"
43 #include "externs.h"
44 #include "quit.h"
46 #if !defined (errno)
47 extern int errno;
48 #endif /* !errno */
50 #if defined (EAGAIN)
51 # define X_EAGAIN EAGAIN
52 #else
53 # define X_EAGAIN -99
54 #endif
56 #if defined (EWOULDBLOCK)
57 # define X_EWOULDBLOCK EWOULDBLOCK
58 #else
59 # define X_EWOULDBLOCK -99
60 #endif
62 extern void termsig_handler __P((int));
64 /* Functions to handle reading input on systems that don't restart read(2)
65 if a signal is received. */
67 static char localbuf[128];
68 static int local_index = 0, local_bufused = 0;
70 /* Posix and USG systems do not guarantee to restart read () if it is
71 interrupted by a signal. We do the read ourselves, and restart it
72 if it returns EINTR. */
73 int
74 getc_with_restart (stream)
75 FILE *stream;
77 unsigned char uc;
79 CHECK_TERMSIG;
81 /* Try local buffering to reduce the number of read(2) calls. */
82 if (local_index == local_bufused || local_bufused == 0)
84 while (1)
86 CHECK_TERMSIG;
87 local_bufused = read (fileno (stream), localbuf, sizeof(localbuf));
88 if (local_bufused > 0)
89 break;
90 else if (errno == X_EAGAIN || errno == X_EWOULDBLOCK)
92 if (sh_unset_nodelay_mode (fileno (stream)) < 0)
94 sys_error (_("cannot reset nodelay mode for fd %d"), fileno (stream));
95 return EOF;
97 continue;
99 else if (local_bufused == 0 || errno != EINTR)
101 local_index = 0;
102 return EOF;
105 local_index = 0;
107 uc = localbuf[local_index++];
108 return uc;
112 ungetc_with_restart (c, stream)
113 int c;
114 FILE *stream;
116 if (local_index == 0 || c == EOF)
117 return EOF;
118 localbuf[--local_index] = c;
119 return c;
122 #if defined (BUFFERED_INPUT)
124 /* A facility similar to stdio, but input-only. */
126 #if defined (USING_BASH_MALLOC)
127 # define MAX_INPUT_BUFFER_SIZE 8176
128 #else
129 # define MAX_INPUT_BUFFER_SIZE 8192
130 #endif
132 #if !defined (SEEK_CUR)
133 # define SEEK_CUR 1
134 #endif /* !SEEK_CUR */
136 #ifdef max
137 # undef max
138 #endif
139 #define max(a, b) (((a) > (b)) ? (a) : (b))
140 #ifdef min
141 # undef min
142 #endif
143 #define min(a, b) ((a) > (b) ? (b) : (a))
145 extern int interactive_shell;
147 int bash_input_fd_changed;
149 /* This provides a way to map from a file descriptor to the buffer
150 associated with that file descriptor, rather than just the other
151 way around. This is needed so that buffers are managed properly
152 in constructs like 3<&4. buffers[x]->b_fd == x -- that is how the
153 correspondence is maintained. */
154 static BUFFERED_STREAM **buffers = (BUFFERED_STREAM **)NULL;
155 static int nbuffers;
157 #define ALLOCATE_BUFFERS(n) \
158 do { if ((n) >= nbuffers) allocate_buffers (n); } while (0)
160 /* Make sure `buffers' has at least N elements. */
161 static void
162 allocate_buffers (n)
163 int n;
165 register int i, orig_nbuffers;
167 orig_nbuffers = nbuffers;
168 nbuffers = n + 20;
169 buffers = (BUFFERED_STREAM **)xrealloc
170 (buffers, nbuffers * sizeof (BUFFERED_STREAM *));
172 /* Zero out the new buffers. */
173 for (i = orig_nbuffers; i < nbuffers; i++)
174 buffers[i] = (BUFFERED_STREAM *)NULL;
177 /* Construct and return a BUFFERED_STREAM corresponding to file descriptor
178 FD, using BUFFER. */
179 static BUFFERED_STREAM *
180 make_buffered_stream (fd, buffer, bufsize)
181 int fd;
182 char *buffer;
183 size_t bufsize;
185 BUFFERED_STREAM *bp;
187 bp = (BUFFERED_STREAM *)xmalloc (sizeof (BUFFERED_STREAM));
188 ALLOCATE_BUFFERS (fd);
189 buffers[fd] = bp;
190 bp->b_fd = fd;
191 bp->b_buffer = buffer;
192 bp->b_size = bufsize;
193 bp->b_used = bp->b_inputp = bp->b_flag = 0;
194 if (bufsize == 1)
195 bp->b_flag |= B_UNBUFF;
196 if (O_TEXT && (fcntl (fd, F_GETFL) & O_TEXT) != 0)
197 bp->b_flag |= O_TEXT;
198 return (bp);
201 /* Allocate a new BUFFERED_STREAM, copy BP to it, and return the new copy. */
202 static BUFFERED_STREAM *
203 copy_buffered_stream (bp)
204 BUFFERED_STREAM *bp;
206 BUFFERED_STREAM *nbp;
208 if (!bp)
209 return ((BUFFERED_STREAM *)NULL);
211 nbp = (BUFFERED_STREAM *)xmalloc (sizeof (BUFFERED_STREAM));
212 xbcopy ((char *)bp, (char *)nbp, sizeof (BUFFERED_STREAM));
213 return (nbp);
217 set_bash_input_fd (fd)
218 int fd;
220 if (bash_input.type == st_bstream)
221 bash_input.location.buffered_fd = fd;
222 else if (interactive_shell == 0)
223 default_buffered_input = fd;
224 return 0;
228 fd_is_bash_input (fd)
229 int fd;
231 if (bash_input.type == st_bstream && bash_input.location.buffered_fd == fd)
232 return 1;
233 else if (interactive_shell == 0 && default_buffered_input == fd)
234 return 1;
235 return 0;
238 /* Save the buffered stream corresponding to file descriptor FD (which bash
239 is using to read input) to a buffered stream associated with NEW_FD. If
240 NEW_FD is -1, a new file descriptor is allocated with fcntl. The new
241 file descriptor is returned on success, -1 on error. */
243 save_bash_input (fd, new_fd)
244 int fd, new_fd;
246 int nfd;
248 /* Sync the stream so we can re-read from the new file descriptor. We
249 might be able to avoid this by copying the buffered stream verbatim
250 to the new file descriptor. */
251 if (buffers[fd])
252 sync_buffered_stream (fd);
254 /* Now take care of duplicating the file descriptor that bash is
255 using for input, so we can reinitialize it later. */
256 nfd = (new_fd == -1) ? fcntl (fd, F_DUPFD, 10) : new_fd;
257 if (nfd == -1)
259 if (fcntl (fd, F_GETFD, 0) == 0)
260 sys_error (_("cannot allocate new file descriptor for bash input from fd %d"), fd);
261 return -1;
264 if (buffers[nfd])
266 /* What's this? A stray buffer without an associated open file
267 descriptor? Free up the buffer and report the error. */
268 internal_error (_("save_bash_input: buffer already exists for new fd %d"), nfd);
269 free_buffered_stream (buffers[nfd]);
272 /* Reinitialize bash_input.location. */
273 if (bash_input.type == st_bstream)
275 bash_input.location.buffered_fd = nfd;
276 fd_to_buffered_stream (nfd);
277 close_buffered_fd (fd); /* XXX */
279 else
280 /* If the current input type is not a buffered stream, but the shell
281 is not interactive and therefore using a buffered stream to read
282 input (e.g. with an `eval exec 3>output' inside a script), note
283 that the input fd has been changed. pop_stream() looks at this
284 value and adjusts the input fd to the new value of
285 default_buffered_input accordingly. */
286 bash_input_fd_changed++;
288 if (default_buffered_input == fd)
289 default_buffered_input = nfd;
291 SET_CLOSE_ON_EXEC (nfd);
292 return nfd;
295 /* Check that file descriptor FD is not the one that bash is currently
296 using to read input from a script. FD is about to be duplicated onto,
297 which means that the kernel will close it for us. If FD is the bash
298 input file descriptor, we need to seek backwards in the script (if
299 possible and necessary -- scripts read from stdin are still unbuffered),
300 allocate a new file descriptor to use for bash input, and re-initialize
301 the buffered stream. Make sure the file descriptor used to save bash
302 input is set close-on-exec. Returns 0 on success, -1 on failure. This
303 works only if fd is > 0 -- if fd == 0 and bash is reading input from
304 fd 0, save_bash_input is used instead, to cooperate with input
305 redirection (look at redir.c:add_undo_redirect()). */
307 check_bash_input (fd)
308 int fd;
310 if (fd_is_bash_input (fd))
312 if (fd > 0)
313 return ((save_bash_input (fd, -1) == -1) ? -1 : 0);
314 else if (fd == 0)
315 return ((sync_buffered_stream (fd) == -1) ? -1 : 0);
317 return 0;
320 /* This is the buffered stream analogue of dup2(fd1, fd2). The
321 BUFFERED_STREAM corresponding to fd2 is deallocated, if one exists.
322 BUFFERS[fd1] is copied to BUFFERS[fd2]. This is called by the
323 redirect code for constructs like 4<&0 and 3</etc/rc.local. */
325 duplicate_buffered_stream (fd1, fd2)
326 int fd1, fd2;
328 int is_bash_input, m;
330 if (fd1 == fd2)
331 return 0;
333 m = max (fd1, fd2);
334 ALLOCATE_BUFFERS (m);
336 /* If FD2 is the file descriptor bash is currently using for shell input,
337 we need to do some extra work to make sure that the buffered stream
338 actually exists (it might not if fd1 was not active, and the copy
339 didn't actually do anything). */
340 is_bash_input = (bash_input.type == st_bstream) &&
341 (bash_input.location.buffered_fd == fd2);
343 if (buffers[fd2])
345 /* If the two objects share the same b_buffer, don't free it. */
346 if (buffers[fd1] && buffers[fd1]->b_buffer && buffers[fd1]->b_buffer == buffers[fd2]->b_buffer)
347 buffers[fd2] = (BUFFERED_STREAM *)NULL;
348 else
349 free_buffered_stream (buffers[fd2]);
351 buffers[fd2] = copy_buffered_stream (buffers[fd1]);
352 if (buffers[fd2])
353 buffers[fd2]->b_fd = fd2;
355 if (is_bash_input)
357 if (!buffers[fd2])
358 fd_to_buffered_stream (fd2);
359 buffers[fd2]->b_flag |= B_WASBASHINPUT;
362 return (fd2);
365 /* Return 1 if a seek on FD will succeed. */
366 #define fd_is_seekable(fd) (lseek ((fd), 0L, SEEK_CUR) >= 0)
368 /* Take FD, a file descriptor, and create and return a buffered stream
369 corresponding to it. If something is wrong and the file descriptor
370 is invalid, return a NULL stream. */
371 BUFFERED_STREAM *
372 fd_to_buffered_stream (fd)
373 int fd;
375 char *buffer;
376 size_t size;
377 struct stat sb;
379 if (fstat (fd, &sb) < 0)
381 close (fd);
382 return ((BUFFERED_STREAM *)NULL);
385 size = (fd_is_seekable (fd)) ? min (sb.st_size, MAX_INPUT_BUFFER_SIZE) : 1;
386 if (size == 0)
387 size = 1;
388 buffer = (char *)xmalloc (size);
390 return (make_buffered_stream (fd, buffer, size));
393 /* Return a buffered stream corresponding to FILE, a file name. */
394 BUFFERED_STREAM *
395 open_buffered_stream (file)
396 char *file;
398 int fd;
400 fd = open (file, O_RDONLY);
401 return ((fd >= 0) ? fd_to_buffered_stream (fd) : (BUFFERED_STREAM *)NULL);
404 /* Deallocate a buffered stream and free up its resources. Make sure we
405 zero out the slot in BUFFERS that points to BP. */
406 void
407 free_buffered_stream (bp)
408 BUFFERED_STREAM *bp;
410 int n;
412 if (!bp)
413 return;
415 n = bp->b_fd;
416 if (bp->b_buffer)
417 free (bp->b_buffer);
418 free (bp);
419 buffers[n] = (BUFFERED_STREAM *)NULL;
422 /* Close the file descriptor associated with BP, a buffered stream, and free
423 up the stream. Return the status of closing BP's file descriptor. */
425 close_buffered_stream (bp)
426 BUFFERED_STREAM *bp;
428 int fd;
430 if (!bp)
431 return (0);
432 fd = bp->b_fd;
433 free_buffered_stream (bp);
434 return (close (fd));
437 /* Deallocate the buffered stream associated with file descriptor FD, and
438 close FD. Return the status of the close on FD. */
440 close_buffered_fd (fd)
441 int fd;
443 if (fd < 0)
445 errno = EBADF;
446 return -1;
448 if (fd >= nbuffers || !buffers || !buffers[fd])
449 return (close (fd));
450 return (close_buffered_stream (buffers[fd]));
453 /* Make the BUFFERED_STREAM associcated with buffers[FD] be BP, and return
454 the old BUFFERED_STREAM. */
455 BUFFERED_STREAM *
456 set_buffered_stream (fd, bp)
457 int fd;
458 BUFFERED_STREAM *bp;
460 BUFFERED_STREAM *ret;
462 ret = buffers[fd];
463 buffers[fd] = bp;
464 return ret;
467 /* Read a buffer full of characters from BP, a buffered stream. */
468 static int
469 b_fill_buffer (bp)
470 BUFFERED_STREAM *bp;
472 ssize_t nr;
473 off_t o;
475 CHECK_TERMSIG;
476 /* In an environment where text and binary files are treated differently,
477 compensate for lseek() on text files returning an offset different from
478 the count of characters read() returns. Text-mode streams have to be
479 treated as unbuffered. */
480 if ((bp->b_flag & (B_TEXT | B_UNBUFF)) == B_TEXT)
482 o = lseek (bp->b_fd, 0, SEEK_CUR);
483 nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
484 if (nr > 0 && nr < lseek (bp->b_fd, 0, SEEK_CUR) - o)
486 lseek (bp->b_fd, o, SEEK_SET);
487 bp->b_flag |= B_UNBUFF;
488 bp->b_size = 1;
489 nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
492 else
493 nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
494 if (nr <= 0)
496 bp->b_used = 0;
497 bp->b_buffer[0] = 0;
498 if (nr == 0)
499 bp->b_flag |= B_EOF;
500 else
501 bp->b_flag |= B_ERROR;
502 return (EOF);
505 bp->b_used = nr;
506 bp->b_inputp = 0;
507 return (bp->b_buffer[bp->b_inputp++] & 0xFF);
510 /* Get a character from buffered stream BP. */
511 #define bufstream_getc(bp) \
512 (bp->b_inputp == bp->b_used || !bp->b_used) \
513 ? b_fill_buffer (bp) \
514 : bp->b_buffer[bp->b_inputp++] & 0xFF
516 /* Push C back onto buffered stream BP. */
517 static int
518 bufstream_ungetc(c, bp)
519 int c;
520 BUFFERED_STREAM *bp;
522 if (c == EOF || bp->b_inputp == 0)
523 return (EOF);
525 bp->b_buffer[--bp->b_inputp] = c;
526 return (c);
529 /* Seek backwards on file BFD to synchronize what we've read so far
530 with the underlying file pointer. */
532 sync_buffered_stream (bfd)
533 int bfd;
535 BUFFERED_STREAM *bp;
536 off_t chars_left;
538 if (buffers == 0 || (bp = buffers[bfd]) == 0)
539 return (-1);
541 chars_left = bp->b_used - bp->b_inputp;
542 if (chars_left)
543 lseek (bp->b_fd, -chars_left, SEEK_CUR);
544 bp->b_used = bp->b_inputp = 0;
545 return (0);
549 buffered_getchar ()
551 CHECK_TERMSIG;
553 #if !defined (DJGPP)
554 return (bufstream_getc (buffers[bash_input.location.buffered_fd]));
555 #else
556 /* On DJGPP, ignore \r. */
557 int ch;
558 while ((ch = bufstream_getc (buffers[bash_input.location.buffered_fd])) == '\r')
560 return ch;
561 #endif
565 buffered_ungetchar (c)
566 int c;
568 return (bufstream_ungetc (c, buffers[bash_input.location.buffered_fd]));
571 /* Make input come from file descriptor BFD through a buffered stream. */
572 void
573 with_input_from_buffered_stream (bfd, name)
574 int bfd;
575 char *name;
577 INPUT_STREAM location;
578 BUFFERED_STREAM *bp;
580 location.buffered_fd = bfd;
581 /* Make sure the buffered stream exists. */
582 bp = fd_to_buffered_stream (bfd);
583 init_yy_io (bp == 0 ? return_EOF : buffered_getchar,
584 buffered_ungetchar, st_bstream, name, location);
587 #if defined (TEST)
588 void *
589 xmalloc(s)
590 int s;
592 return (malloc (s));
595 void *
596 xrealloc(s, size)
597 char *s;
598 int size;
600 if (!s)
601 return(malloc (size));
602 else
603 return(realloc (s, size));
606 void
607 init_yy_io ()
611 process(bp)
612 BUFFERED_STREAM *bp;
614 int c;
616 while ((c = bufstream_getc(bp)) != EOF)
617 putchar(c);
620 BASH_INPUT bash_input;
622 struct stat dsb; /* can be used from gdb */
624 /* imitate /bin/cat */
625 main(argc, argv)
626 int argc;
627 char **argv;
629 register int i;
630 BUFFERED_STREAM *bp;
632 if (argc == 1) {
633 bp = fd_to_buffered_stream (0);
634 process(bp);
635 exit(0);
637 for (i = 1; i < argc; i++) {
638 if (argv[i][0] == '-' && argv[i][1] == '\0') {
639 bp = fd_to_buffered_stream (0);
640 if (!bp)
641 continue;
642 process(bp);
643 free_buffered_stream (bp);
644 } else {
645 bp = open_buffered_stream (argv[i]);
646 if (!bp)
647 continue;
648 process(bp);
649 close_buffered_stream (bp);
652 exit(0);
654 #endif /* TEST */
655 #endif /* BUFFERED_INPUT */