OpenCoverage

zread.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/lib/sh/zread.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* zread - read data from file descriptor into buffer with retries */-
2-
3/* Copyright (C) 1999-2017 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
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.-
11-
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.-
16-
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/>.-
19*/-
20-
21#include <config.h>-
22-
23#include <sys/types.h>-
24-
25#if defined (HAVE_UNISTD_H)-
26# include <unistd.h>-
27#endif-
28-
29#include <signal.h>-
30#include <errno.h>-
31-
32#if !defined (errno)-
33extern int errno;-
34#endif-
35-
36#ifndef SEEK_CUR-
37# define SEEK_CUR 1-
38#endif-
39-
40extern int executing_builtin;-
41-
42extern void check_signals_and_traps (void);-
43extern void check_signals (void);-
44extern int signal_is_trapped (int);-
45-
46/* Read LEN bytes from FD into BUF. Retry the read on EINTR. Any other-
47 error causes the loop to break. */-
48ssize_t-
49zread (fd, buf, len)-
50 int fd;-
51 char *buf;-
52 size_t len;-
53{-
54 ssize_t r;-
55-
56 check_signals (); /* check for signals before a blocking read */-
57 while ((r = read (fd, buf, len)) < 0 && errno == EINTR)
(r = read (fd, buf, len)) < 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8538293 times by 1 test
Evaluated by:
  • Self test
(*__errno_location ()) == 4Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1-8538293
58 /* XXX - bash-5.0 */-
59 /* We check executing_builtin and run traps here for backwards compatibility */-
60 if (executing_builtin)
executing_builtinDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-1
61 check_signals_and_traps (); /* XXX - should it be check_signals()? */
executed 1 time by 1 test: check_signals_and_traps ();
Executed by:
  • Self test
1
62 else-
63 check_signals ();
never executed: check_signals ();
0
64-
65 return r;
executed 8538294 times by 1 test: return r;
Executed by:
  • Self test
8538294
66}-
67-
68/* Read LEN bytes from FD into BUF. Retry the read on EINTR, up to three-
69 interrupts. Any other error causes the loop to break. */-
70-
71#ifdef NUM_INTR-
72# undef NUM_INTR-
73#endif-
74#define NUM_INTR 3-
75-
76ssize_t-
77zreadretry (fd, buf, len)-
78 int fd;-
79 char *buf;-
80 size_t len;-
81{-
82 ssize_t r;-
83 int nintr;-
84-
85 for (nintr = 0; ; )-
86 {-
87 r = read (fd, buf, len);-
88 if (r >= 0)
r >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
89 return r;
never executed: return r;
0
90 if (r == -1 && errno == EINTR)
r == -1Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
0
91 {-
92 if (++nintr >= NUM_INTR)
++nintr >= 3Description
TRUEnever evaluated
FALSEnever evaluated
0
93 return -1;
never executed: return -1;
0
94 continue;
never executed: continue;
0
95 }-
96 return r;
never executed: return r;
0
97 }-
98}
never executed: end of block
0
99-
100/* Call read(2) and allow it to be interrupted. Just a stub for now. */-
101ssize_t-
102zreadintr (fd, buf, len)-
103 int fd;-
104 char *buf;-
105 size_t len;-
106{-
107 check_signals ();-
108 return (read (fd, buf, len));
never executed: return (read (fd, buf, len));
0
109}-
110-
111/* Read one character from FD and return it in CP. Return values are as-
112 in read(2). This does some local buffering to avoid many one-character-
113 calls to read(2), like those the `read' builtin performs. */-
114-
115static char lbuf[128];-
116static size_t lind, lused;-
117-
118ssize_t-
119zreadc (fd, cp)-
120 int fd;-
121 char *cp;-
122{-
123 ssize_t nr;-
124-
125 if (lind == lused || lused == 0)
lind == lusedDescription
TRUEevaluated 546 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6514 times by 1 test
Evaluated by:
  • Self test
lused == 0Description
TRUEnever evaluated
FALSEevaluated 6514 times by 1 test
Evaluated by:
  • Self test
0-6514
126 {-
127 nr = zread (fd, lbuf, sizeof (lbuf));-
128 lind = 0;-
129 if (nr <= 0)
nr <= 0Description
TRUEevaluated 39 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 507 times by 1 test
Evaluated by:
  • Self test
39-507
130 {-
131 lused = 0;-
132 return nr;
executed 39 times by 1 test: return nr;
Executed by:
  • Self test
39
133 }-
134 lused = nr;-
135 }
executed 507 times by 1 test: end of block
Executed by:
  • Self test
507
136 if (cp)
cpDescription
TRUEevaluated 7021 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-7021
137 *cp = lbuf[lind++];
executed 7021 times by 1 test: *cp = lbuf[lind++];
Executed by:
  • Self test
7021
138 return 1;
executed 7021 times by 1 test: return 1;
Executed by:
  • Self test
7021
139}-
140-
141/* Don't mix calls to zreadc and zreadcintr in the same function, since they-
142 use the same local buffer. */-
143ssize_t-
144zreadcintr (fd, cp)-
145 int fd;-
146 char *cp;-
147{-
148 ssize_t nr;-
149-
150 if (lind == lused || lused == 0)
lind == lusedDescription
TRUEnever evaluated
FALSEnever evaluated
lused == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
151 {-
152 nr = zreadintr (fd, lbuf, sizeof (lbuf));-
153 lind = 0;-
154 if (nr <= 0)
nr <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
155 {-
156 lused = 0;-
157 return nr;
never executed: return nr;
0
158 }-
159 lused = nr;-
160 }
never executed: end of block
0
161 if (cp)
cpDescription
TRUEnever evaluated
FALSEnever evaluated
0
162 *cp = lbuf[lind++];
never executed: *cp = lbuf[lind++];
0
163 return 1;
never executed: return 1;
0
164}-
165-
166/* Like zreadc, but read a specified number of characters at a time. Used-
167 for `read -N'. */-
168ssize_t-
169zreadn (fd, cp, len)-
170 int fd;-
171 char *cp;-
172 size_t len;-
173{-
174 ssize_t nr;-
175-
176 if (lind == lused || lused == 0)
lind == lusedDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
lused == 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test
0-3
177 {-
178 if (len > sizeof (lbuf))
len > sizeof (lbuf)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
179 len = sizeof (lbuf);
never executed: len = sizeof (lbuf);
0
180 nr = zread (fd, lbuf, len);-
181 lind = 0;-
182 if (nr <= 0)
nr <= 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
183 {-
184 lused = 0;-
185 return nr;
never executed: return nr;
0
186 }-
187 lused = nr;-
188 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
189 if (cp)
cpDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
190 *cp = lbuf[lind++];
executed 4 times by 1 test: *cp = lbuf[lind++];
Executed by:
  • Self test
4
191 return 1;
executed 4 times by 1 test: return 1;
Executed by:
  • Self test
4
192}-
193-
194void-
195zreset ()-
196{-
197 lind = lused = 0;-
198}
executed 23 times by 1 test: end of block
Executed by:
  • Self test
23
199-
200/* Sync the seek pointer for FD so that the kernel's idea of the last char-
201 read is the last char returned by zreadc. */-
202void-
203zsyncfd (fd)-
204 int fd;-
205{-
206 off_t off, r;-
207-
208 off = lused - lind;-
209 r = 0;-
210 if (off > 0)
off > 0Description
TRUEevaluated 352 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 171 times by 1 test
Evaluated by:
  • Self test
171-352
211 r = lseek (fd, -off, SEEK_CUR);
executed 352 times by 1 test: r = lseek (fd, -off, 1 );
Executed by:
  • Self test
352
212-
213 if (r != -1)
r != -1Description
TRUEevaluated 523 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-523
214 lused = lind = 0;
executed 523 times by 1 test: lused = lind = 0;
Executed by:
  • Self test
523
215}
executed 523 times by 1 test: end of block
Executed by:
  • Self test
523
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2