Merge all the patches together so there is one patch / souce file.
(there were more patch files than souce files here :) ) Now merged are the fixes: ports/1966: Team doesn't support... ports/2204: Team can hang when stderr is a file I've seen team hang when stderr is a file. 'top' reports that it is stuck in lockf. ports/2203: Team's exit status doesn't indicate if there ... Team's exit status will be 0 even if there is an I/O error. The reason is that the exit status of the "guys" isn't checked. Submitted by: dawes@physics.usyd.edu.au (David Dawes)
This commit is contained in:
parent
3052f3e806
commit
9f76c1d34b
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=10162
@ -1,6 +1,5 @@
|
||||
diff -u team-3.1/Makefile ./Makefile
|
||||
--- team-3.1/Makefile Sat Jul 1 17:33:24 1995
|
||||
+++ ./Makefile Sat Jul 1 17:53:20 1995
|
||||
--- Makefile.dist Sat Jul 1 08:33:24 1995
|
||||
+++ Makefile Sun Mar 15 12:37:16 1998
|
||||
@@ -1,25 +1,8 @@
|
||||
-CFLAGS =-O
|
||||
-LDFLAGS =-s
|
||||
@ -12,7 +11,7 @@ diff -u team-3.1/Makefile ./Makefile
|
||||
+MANDIR= ${PREFIX}/man/man
|
||||
|
||||
-DEST=
|
||||
+CFLAGS+= -DHAVE_PARAM_H
|
||||
+CFLAGS+= -DHAVE_PARAM_H -DHAVE_WAIT_H
|
||||
|
||||
-MI =$(DEST)/usr/
|
||||
-MD =$(DEST)/usr/
|
||||
|
@ -1,19 +1,83 @@
|
||||
diff -u team-3.1/team.c ./team.c
|
||||
--- team-3.1/team.c Sat Jul 1 17:33:24 1995
|
||||
+++ ./team.c Sat Jul 1 17:54:05 1995
|
||||
@@ -85,6 +85,11 @@
|
||||
--- team.c.dist Sat Jul 1 08:33:24 1995
|
||||
+++ team.c Sun Mar 15 12:37:16 1998
|
||||
@@ -58,8 +58,8 @@
|
||||
upstream to it, which has much the same effect.
|
||||
*/
|
||||
|
||||
-#define TeamLVOLSZ (1L<<10)
|
||||
-#define TeamHVOLSZ ((long unsigned) 3 * ((long unsigned) 1 << 30))
|
||||
+#define TeamLVOLSZ (off_t unsigned)(1L<<10)
|
||||
+#define TeamHVOLSZ ((off_t unsigned) 3 * ((off_t unsigned) 1 << 62))
|
||||
|
||||
#define TeamLBUFSZ (64) /* Low buffer size */
|
||||
#define TeamDBUFSZ (60*512) /* Default buffer size */
|
||||
@@ -84,11 +84,23 @@
|
||||
#include <sys/file.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
+#ifdef HAVE_WAIT_H
|
||||
+#include <sys/wait.h>
|
||||
+#endif
|
||||
+
|
||||
+#ifdef HAVE_PARAM_H
|
||||
+#include <sys/param.h>
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
|
||||
#ifdef sun
|
||||
# undef F_SETLKW
|
||||
#endif
|
||||
@@ -286,7 +291,12 @@
|
||||
|
||||
+#ifdef __FreeBSD__
|
||||
+# undef F_SETLKW
|
||||
+#endif
|
||||
+
|
||||
#if (PCG)
|
||||
# include "Extend.h"
|
||||
# include "Here.h"
|
||||
@@ -160,6 +172,7 @@
|
||||
|
||||
local bool verbose = false;
|
||||
local bool report = true;
|
||||
+local bool guyhaderror = false;
|
||||
|
||||
extern int errno;
|
||||
local time_t origin;
|
||||
@@ -190,7 +203,7 @@
|
||||
{
|
||||
int fd;
|
||||
short status;
|
||||
- long unsigned size;
|
||||
+ off_t unsigned size;
|
||||
};
|
||||
|
||||
local Fd FdIn,FdOut;
|
||||
@@ -199,7 +212,7 @@
|
||||
(
|
||||
fast Fd *fd
|
||||
_ int ffd
|
||||
-_ long unsigned size
|
||||
+_ off_t unsigned size
|
||||
)
|
||||
{
|
||||
fd->status = (ffd >= 0) ? FdOPEN : FdCLOSED;
|
||||
@@ -252,12 +265,12 @@
|
||||
to->fd = from->fd;
|
||||
}
|
||||
|
||||
-local long unsigned FdRetry on((fd,which,done,space)) is
|
||||
+local off_t unsigned FdRetry on((fd,which,done,space)) is
|
||||
(
|
||||
fast Fd *fd
|
||||
_ char *which
|
||||
-_ long unsigned done
|
||||
-_ long unsigned space
|
||||
+_ off_t unsigned done
|
||||
+_ off_t unsigned space
|
||||
)
|
||||
{
|
||||
int tty;
|
||||
@@ -286,16 +299,21 @@
|
||||
do
|
||||
{
|
||||
#if (defined i386 || defined sun)
|
||||
@ -26,3 +90,281 @@ diff -u team-3.1/team.c ./team.c
|
||||
char *errmsg = sys_errlist[errno];
|
||||
#else
|
||||
char errmsg[32];
|
||||
(void) sprintf(errmsg,"Error %d",errno);
|
||||
#endif
|
||||
if (errno)
|
||||
- mesg("'%s' on %s after %luk. Continue [cyn] ? ",errmsg,which,done>>10);
|
||||
+ mesg("'%s' on %s after %quk. Continue [cyn] ? ",errmsg,which,done>>10);
|
||||
else
|
||||
- mesg("EOF on %s after %luk. Continue [cyn] ? ",which,done>>10);
|
||||
+ mesg("EOF on %s after %quk. Continue [cyn] ? ",which,done>>10);
|
||||
|
||||
read(tty,reply,sizeof reply);
|
||||
}
|
||||
@@ -320,7 +338,7 @@
|
||||
local unsigned FdCanDo on((remaining,available)) is
|
||||
(
|
||||
fast address remaining
|
||||
-_ fast long unsigned available
|
||||
+_ fast off_t unsigned available
|
||||
)
|
||||
{
|
||||
return (remaining < available)
|
||||
@@ -332,10 +350,10 @@
|
||||
fast Fd *fd
|
||||
_ pointer buffer
|
||||
_ fast address todo
|
||||
-_ long unsigned done
|
||||
+_ off_t unsigned done
|
||||
)
|
||||
{
|
||||
- fast long unsigned space;
|
||||
+ fast off_t unsigned space;
|
||||
fast int bytesRead;
|
||||
fast address justDone;
|
||||
|
||||
@@ -373,10 +391,10 @@
|
||||
fast Fd *fd
|
||||
_ pointer buffer
|
||||
_ fast address todo
|
||||
-_ long unsigned done
|
||||
+_ off_t unsigned done
|
||||
)
|
||||
{
|
||||
- fast long unsigned space;
|
||||
+ fast off_t unsigned space;
|
||||
fast int bytesWritten;
|
||||
fast address justDone;
|
||||
|
||||
@@ -453,7 +471,7 @@
|
||||
{
|
||||
Token token;
|
||||
short status;
|
||||
- long unsigned done;
|
||||
+ off_t unsigned done;
|
||||
};
|
||||
|
||||
local bool StreamSend on((fd,token,status,done)) is
|
||||
@@ -461,7 +479,7 @@
|
||||
fast Fd *fd
|
||||
_ Token token
|
||||
_ short status
|
||||
-_ long unsigned done
|
||||
+_ off_t unsigned done
|
||||
)
|
||||
{
|
||||
fast int n;
|
||||
@@ -483,7 +501,7 @@
|
||||
fast Fd *fd
|
||||
_ Token *tokenp
|
||||
_ short *statusp
|
||||
-_ long unsigned *donep
|
||||
+_ off_t unsigned *donep
|
||||
)
|
||||
{
|
||||
fast int n;
|
||||
@@ -536,7 +554,7 @@
|
||||
#define GuyRECEIVE(guy,tokenp,statusp,donep) \
|
||||
StreamReceive(&guy->upStream,tokenp,statusp,donep)
|
||||
|
||||
-local bool GuyStop of((Guy *,char *,long unsigned));
|
||||
+local bool GuyStop of((Guy *,char *,off_t unsigned));
|
||||
|
||||
local bool GuyStart on((guy,bufsize)) is
|
||||
(
|
||||
@@ -547,7 +565,7 @@
|
||||
fast char *buffer;
|
||||
Token token;
|
||||
short status;
|
||||
- long unsigned done;
|
||||
+ off_t unsigned done;
|
||||
bool received;
|
||||
static int bytesRead,bytesWritten;
|
||||
|
||||
@@ -577,7 +595,7 @@
|
||||
done += bytesRead;
|
||||
|
||||
if (verbose)
|
||||
- mesg("%luk read \r",done>>10);
|
||||
+ mesg("%quk read \r",done>>10);
|
||||
|
||||
if (!GuySEND(guy,TokenREAD,FdIn.status,done))
|
||||
GuyStop(guy,"guy cannot send READ",done);
|
||||
@@ -595,7 +613,7 @@
|
||||
done += bytesWritten;
|
||||
|
||||
if (verbose)
|
||||
- mesg("%luk written\r",done>>10);
|
||||
+ mesg("%quk written\r",done>>10);
|
||||
|
||||
if (!GuySEND(guy,TokenWRITE,FdOut.status,done))
|
||||
GuyStop(guy,"guy cannot send WRITE",done);
|
||||
@@ -619,7 +637,7 @@
|
||||
(
|
||||
fast Guy *guy
|
||||
_ char *errormsg
|
||||
-_ long unsigned done
|
||||
+_ off_t unsigned done
|
||||
)
|
||||
{
|
||||
Mesg(("GuyStop guy %#o\n",guy));
|
||||
@@ -627,8 +645,8 @@
|
||||
if (done)
|
||||
{
|
||||
if (report)
|
||||
- mesg("%lu kilobytes, %lu seconds\r\n",
|
||||
- done>>10,(long unsigned) (time((time_t *) 0)-origin));
|
||||
+ mesg("%qu kilobytes, %lu seconds\r\n",
|
||||
+ done>>10,(off_t unsigned) (time((time_t *) 0)-origin));
|
||||
else if (verbose)
|
||||
mesg("\n");
|
||||
}
|
||||
@@ -637,7 +655,7 @@
|
||||
{
|
||||
mesg("team: guy pid %u: %s\n",guy->pid,errormsg);
|
||||
call GuySEND(guy,TokenABORT,FdERROR,0L);
|
||||
- exit(1);
|
||||
+ exit(2);
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
@@ -697,8 +715,8 @@
|
||||
(
|
||||
fast Team *team
|
||||
_ address bufsize
|
||||
-_ long unsigned isize
|
||||
-_ long unsigned osize
|
||||
+_ off_t unsigned isize
|
||||
+_ off_t unsigned osize
|
||||
)
|
||||
{
|
||||
/*
|
||||
@@ -797,6 +815,9 @@
|
||||
{
|
||||
pid = getpid();
|
||||
|
||||
+ /* Set SIGPIPE handling back to the default in the guys */
|
||||
+ signal(SIGPIPE, SIG_DFL);
|
||||
+
|
||||
if (!FdClose(&last_downstream))
|
||||
perror("cannot close inherited first link");
|
||||
|
||||
@@ -816,13 +837,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (!StreamSend(&last_downstream,TokenREAD,FdOPEN,0L))
|
||||
+ if (!StreamSend(&last_downstream,TokenREAD,FdOPEN,0L) && errno != EPIPE)
|
||||
{
|
||||
perror("cannot send first READ token");
|
||||
return false;
|
||||
}
|
||||
|
||||
- if (!StreamSend(&last_downstream,TokenWRITE,FdOPEN,0L))
|
||||
+ if (!StreamSend(&last_downstream,TokenWRITE,FdOPEN,0L) && errno != EPIPE)
|
||||
{
|
||||
perror("cannot send first WRITE token");
|
||||
return false;
|
||||
@@ -864,6 +885,14 @@
|
||||
|
||||
--team->active;
|
||||
|
||||
+#ifdef WIFEXITED
|
||||
+ /* If a guy had an error, its exit status is 2. Also catch a killed guy */
|
||||
+ if ((WIFEXITED(status) && WEXITSTATUS(status) == 2) ||
|
||||
+ (WIFSIGNALED(status) && WTERMSIG(status) != SIGPIPE)) {
|
||||
+ guyhaderror = true;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
if (status != 0 && team->active != 0)
|
||||
return false;
|
||||
}
|
||||
@@ -914,8 +943,8 @@
|
||||
syntax: team [-[vr]] [-iI[bkm] [-oO[bkm] [N[bkm] [P]]\n\
|
||||
copies standard input to output\n\
|
||||
-v gives ongoing report, -r final report\n\
|
||||
- I is input volume size (default %lum)\n\
|
||||
- O is output volume size (default %lum)\n\
|
||||
+ I is input volume size (default %qum)\n\
|
||||
+ O is output volume size (default %qum)\n\
|
||||
N is buffer size (default %luk)\n\
|
||||
P is number of processes (default %u)\n\
|
||||
(postfix b means *512, k means *1KB, m means *1MB)\n\
|
||||
@@ -927,19 +956,19 @@
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
-local long unsigned atos on((s)) is
|
||||
+local off_t unsigned atos on((s)) is
|
||||
(
|
||||
fast char *s
|
||||
)
|
||||
{
|
||||
- fast unsigned long l;
|
||||
+ fast off_t unsigned l;
|
||||
|
||||
for (
|
||||
s, l = 0L;
|
||||
*s >= '0' && *s <= '9';
|
||||
s++
|
||||
)
|
||||
- l = l*10L + (long unsigned) (*s-'0');
|
||||
+ l = l*10L + (off_t unsigned) (*s-'0');
|
||||
|
||||
if (*s == 'b') l *= (1L<<9);
|
||||
if (*s == 'k') l *= (1L<<10);
|
||||
@@ -958,8 +987,8 @@
|
||||
short unsigned teamsize;
|
||||
|
||||
address bufsize;
|
||||
- long unsigned isize;
|
||||
- long unsigned osize;
|
||||
+ off_t unsigned isize;
|
||||
+ off_t unsigned osize;
|
||||
int opt;
|
||||
|
||||
teamsize = TeamDTEAMSZ;
|
||||
@@ -975,7 +1004,7 @@
|
||||
isize = atos(optarg);
|
||||
if (isize < TeamLVOLSZ || isize > TeamHVOLSZ)
|
||||
{
|
||||
- fprintf(stderr,"team: invalid input volume size %lu\n",isize);
|
||||
+ fprintf(stderr,"team: invalid input volume size %qu\n",isize);
|
||||
usage();
|
||||
}
|
||||
|
||||
@@ -983,7 +1012,7 @@
|
||||
osize = atos(optarg);
|
||||
if (osize < TeamLVOLSZ || osize > TeamHVOLSZ)
|
||||
{
|
||||
- fprintf(stderr,"team: invalid output volume size %lu\n",osize);
|
||||
+ fprintf(stderr,"team: invalid output volume size %qu\n",osize);
|
||||
usage();
|
||||
}
|
||||
|
||||
@@ -1032,6 +1061,11 @@
|
||||
|
||||
origin = time((time_t *) 0);
|
||||
|
||||
+ /*
|
||||
+ * Ignore SIGPIPE in the parent as it affects the exit status reporting.
|
||||
+ */
|
||||
+ signal(SIGPIPE, SIG_IGN);
|
||||
+
|
||||
if (!TeamStart(&team,bufsize,isize,osize))
|
||||
{
|
||||
mesg("team: cannot start the team\n");
|
||||
@@ -1052,6 +1086,12 @@
|
||||
if (!TeamClose(&team))
|
||||
{
|
||||
mesg("team: cannot close the team\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ if (guyhaderror)
|
||||
+ {
|
||||
+ mesg("team: guy had error\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user