summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/gen/popen.c34
-rw-r--r--lib/libc/stdio/fopen.312
-rw-r--r--lib/libc/tests/net/Makefile2
-rw-r--r--lib/libc/yp/yplib.c33
4 files changed, 62 insertions, 19 deletions
diff --git a/lib/libc/gen/popen.c b/lib/libc/gen/popen.c
index a7a9708..e469ab6 100644
--- a/lib/libc/gen/popen.c
+++ b/lib/libc/gen/popen.c
@@ -72,6 +72,7 @@ popen(const char *command, const char *type)
struct pid *cur;
FILE *iop;
int pdes[2], pid, twoway, cloexec;
+ int pdes_unused_in_parent;
char *argv[4];
struct pid *p;
@@ -98,6 +99,20 @@ popen(const char *command, const char *type)
return (NULL);
}
+ if (*type == 'r') {
+ iop = fdopen(pdes[0], type);
+ pdes_unused_in_parent = pdes[1];
+ } else {
+ iop = fdopen(pdes[1], type);
+ pdes_unused_in_parent = pdes[0];
+ }
+ if (iop == NULL) {
+ (void)_close(pdes[0]);
+ (void)_close(pdes[1]);
+ free(cur);
+ return (NULL);
+ }
+
argv[0] = "sh";
argv[1] = "-c";
argv[2] = (char *)command;
@@ -107,9 +122,14 @@ popen(const char *command, const char *type)
switch (pid = vfork()) {
case -1: /* Error. */
THREAD_UNLOCK();
- (void)_close(pdes[0]);
- (void)_close(pdes[1]);
+ /*
+ * The _close() closes the unused end of pdes[], while
+ * the fclose() closes the used end of pdes[], *and* cleans
+ * up iop.
+ */
+ (void)_close(pdes_unused_in_parent);
free(cur);
+ (void)fclose(iop);
return (NULL);
/* NOTREACHED */
case 0: /* Child. */
@@ -145,14 +165,8 @@ popen(const char *command, const char *type)
}
THREAD_UNLOCK();
- /* Parent; assume fdopen can't fail. */
- if (*type == 'r') {
- iop = fdopen(pdes[0], type);
- (void)_close(pdes[1]);
- } else {
- iop = fdopen(pdes[1], type);
- (void)_close(pdes[0]);
- }
+ /* Parent. */
+ (void)_close(pdes_unused_in_parent);
/* Link into list of file descriptors. */
cur->fp = iop;
diff --git a/lib/libc/stdio/fopen.3 b/lib/libc/stdio/fopen.3
index b39cb5a..f25e6df 100644
--- a/lib/libc/stdio/fopen.3
+++ b/lib/libc/stdio/fopen.3
@@ -120,7 +120,9 @@ This is strictly for compatibility with
.St -isoC
and has effect only for
.Fn fmemopen
-; otherwise the ``b'' is ignored.
+; otherwise
+.Dq Li b
+is ignored.
.Pp
Any created files will have mode
.Do Dv S_IRUSR
@@ -230,7 +232,9 @@ allocates
.Fa size
bytes of memory. This buffer is automatically freed when the
stream is closed. Buffers can be opened in text-mode (default) or binary-mode
-(if ``b'' is present in the second or third position of the
+(if
+.Dq Li b
+is present in the second or third position of the
.Fa mode
argument). Buffers opened in text-mode make sure that writes are terminated with
a NULL byte, if the last write hasn't filled up the whole buffer. Buffers
@@ -343,5 +347,7 @@ The
function
conforms to
.St -p1003.1-2008 .
-The ``b'' mode does not conform to any standard
+The
+.Dq Li b
+mode does not conform to any standard
but is also supported by glibc.
diff --git a/lib/libc/tests/net/Makefile b/lib/libc/tests/net/Makefile
index 8a4e932..3e437a0 100644
--- a/lib/libc/tests/net/Makefile
+++ b/lib/libc/tests/net/Makefile
@@ -28,7 +28,7 @@ LDADD.h_nsd_recurse+= -lpthread
CLEANFILES+= aton_ether_subr.c
aton_ether_subr.c: gen_ether_subr ${SRCTOP}/sys/net/if_ethersubr.c
- ${HOST_SH} ${.ALLSRC} ${.TARGET}
+ ${__MAKE_SHELL} ${.ALLSRC} ${.TARGET}
.include "../Makefile.netbsd-tests"
diff --git a/lib/libc/yp/yplib.c b/lib/libc/yp/yplib.c
index 1778c6a..1a6df69 100644
--- a/lib/libc/yp/yplib.c
+++ b/lib/libc/yp/yplib.c
@@ -655,7 +655,7 @@ yp_match(char *indomain, char *inmap, const char *inkey, int inkeylen,
struct timeval tv;
struct ypreq_key yprk;
int r;
-
+ int retries = 0;
*outval = NULL;
*outvallen = 0;
@@ -700,6 +700,11 @@ yp_match(char *indomain, char *inmap, const char *inkey, int inkeylen,
#endif
again:
+ if (retries > MAX_RETRIES) {
+ YPUNLOCK();
+ return (YPERR_RPC);
+ }
+
if (_yp_dobind(indomain, &ysd) != 0) {
YPUNLOCK();
return (YPERR_DOMAIN);
@@ -716,6 +721,7 @@ again:
if (r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_match: clnt_call");
_yp_unbind(ysd);
+ retries++;
goto again;
}
@@ -772,7 +778,7 @@ yp_first(char *indomain, char *inmap, char **outkey, int *outkeylen,
struct dom_binding *ysd;
struct timeval tv;
int r;
-
+ int retries = 0;
/* Sanity check */
if (indomain == NULL || !strlen(indomain) ||
@@ -784,6 +790,11 @@ yp_first(char *indomain, char *inmap, char **outkey, int *outkeylen,
YPLOCK();
again:
+ if (retries > MAX_RETRIES) {
+ YPUNLOCK();
+ return (YPERR_RPC);
+ }
+
if (_yp_dobind(indomain, &ysd) != 0) {
YPUNLOCK();
return (YPERR_DOMAIN);
@@ -802,6 +813,7 @@ again:
if (r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_first: clnt_call");
_yp_unbind(ysd);
+ retries++;
goto again;
}
if (!(r = ypprot_err(yprkv.stat))) {
@@ -844,7 +856,7 @@ yp_next(char *indomain, char *inmap, char *inkey, int inkeylen,
struct dom_binding *ysd;
struct timeval tv;
int r;
-
+ int retries = 0;
/* Sanity check */
if (inkey == NULL || !strlen(inkey) || inkeylen <= 0 ||
@@ -857,6 +869,11 @@ yp_next(char *indomain, char *inmap, char *inkey, int inkeylen,
YPLOCK();
again:
+ if (retries > MAX_RETRIES) {
+ YPUNLOCK();
+ return (YPERR_RPC);
+ }
+
if (_yp_dobind(indomain, &ysd) != 0) {
YPUNLOCK();
return (YPERR_DOMAIN);
@@ -877,6 +894,7 @@ again:
if (r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_next: clnt_call");
_yp_unbind(ysd);
+ retries++;
goto again;
}
if (!(r = ypprot_err(yprkv.stat))) {
@@ -920,7 +938,7 @@ yp_all(char *indomain, char *inmap, struct ypall_callback *incallback)
CLIENT *clnt;
u_long status, savstat;
int clnt_sock;
-
+ int retries = 0;
/* Sanity check */
if (indomain == NULL || !strlen(indomain) ||
@@ -929,6 +947,10 @@ yp_all(char *indomain, char *inmap, struct ypall_callback *incallback)
YPLOCK();
again:
+ if (retries > MAX_RETRIES) {
+ YPUNLOCK();
+ return (YPERR_RPC);
+ }
if (_yp_dobind(indomain, &ysd) != 0) {
YPUNLOCK();
@@ -958,9 +980,10 @@ again:
if (clnt_call(clnt, YPPROC_ALL,
(xdrproc_t)xdr_ypreq_nokey, &yprnk,
(xdrproc_t)xdr_ypresp_all_seq, &status, tv) != RPC_SUCCESS) {
- clnt_perror(ysd->dom_client, "yp_all: clnt_call");
+ clnt_perror(clnt, "yp_all: clnt_call");
clnt_destroy(clnt);
_yp_unbind(ysd);
+ retries++;
goto again;
}
OpenPOWER on IntegriCloud