Update commands bc, egrep, expr, iostat, mail, ps, su, vmstat, wall, write.
This commit is contained in:
@@ -156,6 +156,7 @@ int symlink(const char *target, const char *linkpath);
|
||||
int vhangup(void);
|
||||
int mknod(const char *, mode_t, dev_t);
|
||||
int reboot(int howto);
|
||||
int ttyslot(void);
|
||||
|
||||
#ifndef _VA_LIST_
|
||||
# ifdef __GNUC__
|
||||
|
||||
111
src/cmd/bc.y
111
src/cmd/bc.y
@@ -1,5 +1,8 @@
|
||||
%{
|
||||
int *getout();
|
||||
int *getout(void);
|
||||
int getch(void);
|
||||
int cpeek(int c, int yes, int no);
|
||||
void yyerror(char *s);
|
||||
%}
|
||||
%right '='
|
||||
%left '+' '-'
|
||||
@@ -39,12 +42,12 @@ int *pre, *post;
|
||||
%%
|
||||
start :
|
||||
| start stat tail
|
||||
= output( $2 );
|
||||
= output( (int*) $2 );
|
||||
| start def dargs ')' '{' dlist slist '}'
|
||||
={ bundle( 6,pre, $7, post ,"0",numb[lev],"Q");
|
||||
conout( $$, $2 );
|
||||
={ bundle(6, pre, $7, post, "0", numb[lev], "Q");
|
||||
conout( (int*) $$, (char*) $2 );
|
||||
rcrs = crs;
|
||||
output( "" );
|
||||
output( (int*) "" );
|
||||
lev = bindx = 0;
|
||||
}
|
||||
;
|
||||
@@ -62,11 +65,11 @@ stat : e
|
||||
| LETTER '=' e
|
||||
={ bundle(3, $3, "s", $1 ); }
|
||||
| LETTER '[' e ']' '=' e
|
||||
={ bundle(4, $6, $3, ":", geta($1)); }
|
||||
={ bundle(4, $6, $3, ":", geta((char*) $1)); }
|
||||
| LETTER EQOP e
|
||||
={ bundle(6, "l", $1, $3, $2, "s", $1 ); }
|
||||
| LETTER '[' e ']' EQOP e
|
||||
={ bundle(8,$3, ";", geta($1), $6, $5, $3, ":", geta($1));}
|
||||
={ bundle(8,$3, ";", geta((char*) $1), $6, $5, $3, ":", geta((char*) $1));}
|
||||
| _BREAK
|
||||
={ bundle(2, numb[lev-bstack[bindx-1]], "Q" ); }
|
||||
| _RETURN '(' e ')'
|
||||
@@ -94,17 +97,17 @@ stat : e
|
||||
| error
|
||||
={ bundle(1,"c"); }
|
||||
| _IF CRS BLEV '(' re ')' stat
|
||||
={ conout( $7, $2 );
|
||||
={ conout( (int*) $7, (char*) $2 );
|
||||
bundle(3, $5, $2, " " );
|
||||
}
|
||||
| _WHILE CRS '(' re ')' stat BLEV
|
||||
={ bundle(3, $6, $4, $2 );
|
||||
conout( $$, $2 );
|
||||
conout( (int*) $$, (char*) $2 );
|
||||
bundle(3, $4, $2, " " );
|
||||
}
|
||||
| fprefix CRS re ';' e ')' stat BLEV
|
||||
={ bundle(5, $7, $5, "s.", $3, $2 );
|
||||
conout( $$, $2 );
|
||||
conout( (int*) $$, (char*) $2 );
|
||||
bundle(5, $1, "s.", $3, $2, " " );
|
||||
}
|
||||
| '~' LETTER '=' e
|
||||
@@ -174,7 +177,7 @@ e : e '+' e
|
||||
| e '^' e
|
||||
= bundle(3, $1, $3, "^" );
|
||||
| LETTER '[' e ']'
|
||||
={ bundle(3,$3, ";", geta($1)); }
|
||||
={ bundle(3,$3, ";", geta((char*) $1)); }
|
||||
| LETTER INCR
|
||||
= bundle(4, "l", $1, "d1+s", $1 );
|
||||
| INCR LETTER
|
||||
@@ -184,13 +187,13 @@ e : e '+' e
|
||||
| LETTER DECR
|
||||
= bundle(4, "l", $1, "d1-s", $1 );
|
||||
| LETTER '[' e ']' INCR
|
||||
= bundle(7,$3,";",geta($1),"d1+",$3,":",geta($1));
|
||||
= bundle(7,$3,";",geta((char*) $1),"d1+",$3,":",geta((char*) $1));
|
||||
| INCR LETTER '[' e ']'
|
||||
= bundle(7,$4,";",geta($2),"1+d",$4,":",geta($2));
|
||||
= bundle(7,$4,";",geta((char*) $2),"1+d",$4,":",geta((char*) $2));
|
||||
| LETTER '[' e ']' DECR
|
||||
= bundle(7,$3,";",geta($1),"d1-",$3,":",geta($1));
|
||||
= bundle(7,$3,";",geta((char*) $1),"d1-",$3,":",geta((char*) $1));
|
||||
| DECR LETTER '[' e ']'
|
||||
= bundle(7,$4,";",geta($2),"1-d",$4,":",geta($2));
|
||||
= bundle(7,$4,";",geta((char*) $2),"1-d",$4,":",geta((char*) $2));
|
||||
| SCALE INCR
|
||||
= bundle(1,"Kd1+k");
|
||||
| INCR SCALE
|
||||
@@ -216,9 +219,9 @@ e : e '+' e
|
||||
| DECR OBASE
|
||||
= bundle(1,"O1-do");
|
||||
| LETTER '(' cargs ')'
|
||||
= bundle(4, $3, "l", getf($1), "x" );
|
||||
= bundle(4, $3, "l", getf((char*) $1), "x" );
|
||||
| LETTER '(' ')'
|
||||
= bundle(3, "l", getf($1), "x" );
|
||||
= bundle(3, "l", getf((char*) $1), "x" );
|
||||
| cons
|
||||
={ bundle(2, " ", $1 ); }
|
||||
| DOT cons
|
||||
@@ -236,9 +239,9 @@ e : e '+' e
|
||||
| LETTER EQOP e %prec '='
|
||||
={ bundle(6, "l", $1, $3, $2, "ds", $1 ); }
|
||||
| LETTER '[' e ']' '=' e
|
||||
= { bundle(5,$6,"d",$3,":",geta($1)); }
|
||||
= { bundle(5,$6,"d",$3,":",geta((char*) $1)); }
|
||||
| LETTER '[' e ']' EQOP e
|
||||
= { bundle(9,$3,";",geta($1),$6,$5,"d",$3,":",geta($1)); }
|
||||
= { bundle(9,$3,";",geta((char*) $1),$6,$5,"d",$3,":",geta((char*) $1)); }
|
||||
| LENGTH '(' e ')'
|
||||
= bundle(2,$3,"Z");
|
||||
| SCALE '(' e ')'
|
||||
@@ -277,7 +280,7 @@ cargs : eora
|
||||
;
|
||||
eora: e
|
||||
| LETTER '[' ']'
|
||||
=bundle(2,"l",geta($1));
|
||||
=bundle(2,"l",geta((char*) $1));
|
||||
;
|
||||
|
||||
cons : constant
|
||||
@@ -303,7 +306,7 @@ CRS :
|
||||
;
|
||||
|
||||
def : _DEFINE LETTER '('
|
||||
={ $$ = (int) getf($2);
|
||||
={ $$ = (int) getf((char*) $2);
|
||||
pre = (int*) "";
|
||||
post = (int*) "";
|
||||
lev = 1;
|
||||
@@ -313,19 +316,19 @@ def : _DEFINE LETTER '('
|
||||
|
||||
dargs :
|
||||
| lora
|
||||
={ pp( $1 ); }
|
||||
={ pp((char*) $1); }
|
||||
| dargs ',' lora
|
||||
={ pp( $3 ); }
|
||||
={ pp((char*) $3); }
|
||||
;
|
||||
|
||||
dlets : lora
|
||||
={ tp($1); }
|
||||
={ tp((char*) $1); }
|
||||
| dlets ',' lora
|
||||
={ tp($3); }
|
||||
={ tp((char*) $3); }
|
||||
;
|
||||
lora : LETTER
|
||||
| LETTER '[' ']'
|
||||
={ $$ = (int) geta($1); }
|
||||
={ $$ = (int) geta((char*) $1); }
|
||||
;
|
||||
|
||||
%%
|
||||
@@ -348,7 +351,9 @@ char *letr[26] = {
|
||||
"k","l","m","n","o","p","q","r","s","t",
|
||||
"u","v","w","x","y","z" } ;
|
||||
char *dot = { "." };
|
||||
yylex(){
|
||||
|
||||
int yylex()
|
||||
{
|
||||
int c, ch;
|
||||
restart:
|
||||
c = getch();
|
||||
@@ -445,7 +450,8 @@ restart:
|
||||
}
|
||||
}
|
||||
|
||||
cpeek( c, yes, no ){
|
||||
int cpeek(int c, int yes, int no)
|
||||
{
|
||||
if( (peekc=getch()) != c ) return( no );
|
||||
else {
|
||||
peekc = -1;
|
||||
@@ -453,7 +459,8 @@ cpeek( c, yes, no ){
|
||||
}
|
||||
}
|
||||
|
||||
getch(){
|
||||
int getch()
|
||||
{
|
||||
int ch;
|
||||
loop:
|
||||
ch = (peekc < 0) ? getc(in) : peekc;
|
||||
@@ -472,13 +479,18 @@ loop:
|
||||
goto loop;
|
||||
}
|
||||
yyerror("cannot open input file");
|
||||
return EOF;
|
||||
}
|
||||
|
||||
# define b_sp_max 3000
|
||||
|
||||
int b_space [ b_sp_max ];
|
||||
int * b_sp_nxt = { b_space };
|
||||
|
||||
int bdebug = 0;
|
||||
bundle(a){
|
||||
|
||||
int bundle(int a, ...)
|
||||
{
|
||||
int i, *p, *q;
|
||||
|
||||
p = &a;
|
||||
@@ -494,16 +506,18 @@ bundle(a){
|
||||
return( (int) q );
|
||||
}
|
||||
|
||||
routput(p) int *p; {
|
||||
void routput(int *p)
|
||||
{
|
||||
if( bdebug ) printf("routput(%p)\n", p );
|
||||
if( p >= &b_space[0] && p < &b_space[b_sp_max]){
|
||||
/* part of a bundle */
|
||||
while( *p != 0 ) routput( *p++ );
|
||||
while( *p != 0 ) routput( (int*) *p++ );
|
||||
}
|
||||
else printf( "%s", (char*) p ); /* character string */
|
||||
}
|
||||
|
||||
output( p ) int *p; {
|
||||
void output(int *p)
|
||||
{
|
||||
routput( p );
|
||||
b_sp_nxt = & b_space[0];
|
||||
printf( "\n" );
|
||||
@@ -512,7 +526,8 @@ output( p ) int *p; {
|
||||
crs = rcrs;
|
||||
}
|
||||
|
||||
conout( p, s ) int *p; char *s; {
|
||||
void conout(int *p, char *s)
|
||||
{
|
||||
printf("[");
|
||||
routput( p );
|
||||
printf("]s%s\n", s );
|
||||
@@ -520,7 +535,8 @@ conout( p, s ) int *p; char *s; {
|
||||
lev--;
|
||||
}
|
||||
|
||||
yyerror( s ) char *s; {
|
||||
void yyerror(char *s)
|
||||
{
|
||||
if(ifile > sargc)ss="teletype";
|
||||
printf("c[%s on line %d, %s]pc\n", s ,ln+1,ss);
|
||||
fflush(stdout);
|
||||
@@ -531,7 +547,8 @@ yyerror( s ) char *s; {
|
||||
b_sp_nxt = &b_space[0];
|
||||
}
|
||||
|
||||
pp( s ) char *s; {
|
||||
void pp(char *s)
|
||||
{
|
||||
/* puts the relevant stuff on pre and post for the letter s */
|
||||
|
||||
bundle(3, "S", s, pre );
|
||||
@@ -540,14 +557,17 @@ pp( s ) char *s; {
|
||||
post = (int*) yyval;
|
||||
}
|
||||
|
||||
tp( s ) char *s; { /* same as pp, but for temps */
|
||||
/* same as pp, but for temps */
|
||||
void tp(char *s)
|
||||
{
|
||||
bundle(3, "0S", s, pre );
|
||||
pre = (int*) yyval;
|
||||
bundle(4, post, "L", s, "s." );
|
||||
post = (int*) yyval;
|
||||
}
|
||||
|
||||
yyinit(argc,argv) int argc; char *argv[];{
|
||||
void yyinit(int argc, char *argv[])
|
||||
{
|
||||
signal( 2, SIG_IGN ); /* ignore all interrupts */
|
||||
sargv=argv;
|
||||
sargc= -- argc;
|
||||
@@ -560,24 +580,25 @@ yyinit(argc,argv) int argc; char *argv[];{
|
||||
ln = 0;
|
||||
ss = sargv[1];
|
||||
}
|
||||
int *getout(){
|
||||
|
||||
int *getout()
|
||||
{
|
||||
printf("q");
|
||||
fflush(stdout);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int *
|
||||
getf(p) char *p;{
|
||||
int *getf(char *p)
|
||||
{
|
||||
return (int*) &funtab[2 * (*p - 0141)];
|
||||
}
|
||||
|
||||
int *
|
||||
geta(p) char *p;{
|
||||
int *geta(char *p)
|
||||
{
|
||||
return (int*) &atab[2 * (*p - 0141)];
|
||||
}
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int p[2];
|
||||
|
||||
|
||||
136
src/cmd/egrep.y
136
src/cmd/egrep.y
@@ -15,6 +15,8 @@
|
||||
%{
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
@@ -24,6 +26,7 @@
|
||||
#define NCHARS 128
|
||||
#define NSTATES 128
|
||||
#define FINAL -1
|
||||
|
||||
char gotofn[NSTATES][NCHARS];
|
||||
int state[NSTATES];
|
||||
char out[NSTATES];
|
||||
@@ -62,6 +65,16 @@ int nsucc;
|
||||
|
||||
int f;
|
||||
char *fname;
|
||||
|
||||
int nextch(void);
|
||||
void synerror(void);
|
||||
void overflo(void);
|
||||
void follow(int v);
|
||||
void add(int *array, int n);
|
||||
int cstate(int v);
|
||||
int member(int symb, int set, int torf);
|
||||
int notin(int n);
|
||||
void execute(char *file);
|
||||
%}
|
||||
|
||||
%%
|
||||
@@ -109,15 +122,18 @@ r: r OR r
|
||||
;
|
||||
|
||||
%%
|
||||
yyerror(s) {
|
||||
void yyerror(char *s)
|
||||
{
|
||||
fprintf(stderr, "egrep: %s\n", s);
|
||||
exit(2);
|
||||
}
|
||||
|
||||
yylex() {
|
||||
int yylex()
|
||||
{
|
||||
extern int yylval;
|
||||
int cclcnt, x;
|
||||
register char c, d;
|
||||
char c, d;
|
||||
|
||||
switch(c = nextch()) {
|
||||
case '$':
|
||||
case '^': c = '\n';
|
||||
@@ -140,32 +156,39 @@ yylex() {
|
||||
c = nextch();
|
||||
}
|
||||
do {
|
||||
if (c == '\0') synerror();
|
||||
if (c == '\0')
|
||||
synerror();
|
||||
if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
|
||||
if ((d = nextch()) != 0) {
|
||||
c = chars[nxtchar-1];
|
||||
while (c < d) {
|
||||
if (nxtchar >= MAXLIN) overflo();
|
||||
if (nxtchar >= MAXLIN)
|
||||
overflo();
|
||||
chars[nxtchar++] = ++c;
|
||||
cclcnt++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (nxtchar >= MAXLIN) overflo();
|
||||
if (nxtchar >= MAXLIN)
|
||||
overflo();
|
||||
chars[nxtchar++] = c;
|
||||
cclcnt++;
|
||||
} while ((c = nextch()) != ']');
|
||||
chars[count] = cclcnt;
|
||||
return (x);
|
||||
case '\\':
|
||||
if ((c = nextch()) == '\0') synerror();
|
||||
if ((c = nextch()) == '\0')
|
||||
synerror();
|
||||
defchar:
|
||||
default: yylval = c; return (CHAR);
|
||||
}
|
||||
}
|
||||
nextch() {
|
||||
register char c;
|
||||
|
||||
int nextch()
|
||||
{
|
||||
char c;
|
||||
|
||||
if (fflag) {
|
||||
if ((c = getc(exprfile)) == EOF) {
|
||||
fclose(exprfile);
|
||||
@@ -176,28 +199,35 @@ nextch() {
|
||||
return(c);
|
||||
}
|
||||
|
||||
synerror() {
|
||||
void synerror()
|
||||
{
|
||||
fprintf(stderr, "egrep: syntax error\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
enter(x) int x; {
|
||||
if(line >= MAXLIN) overflo();
|
||||
int enter(int x)
|
||||
{
|
||||
if(line >= MAXLIN)
|
||||
overflo();
|
||||
name[line] = x;
|
||||
left[line] = 0;
|
||||
right[line] = 0;
|
||||
return(line++);
|
||||
}
|
||||
|
||||
cclenter(x) int x; {
|
||||
register linno;
|
||||
int cclenter(int x)
|
||||
{
|
||||
int linno;
|
||||
|
||||
linno = enter(x);
|
||||
right[linno] = count;
|
||||
return (linno);
|
||||
}
|
||||
|
||||
node(x, l, r) {
|
||||
if(line >= MAXLIN) overflo();
|
||||
int node(int x, int l, int r)
|
||||
{
|
||||
if(line >= MAXLIN)
|
||||
overflo();
|
||||
name[line] = x;
|
||||
left[line] = l;
|
||||
right[line] = r;
|
||||
@@ -206,21 +236,27 @@ node(x, l, r) {
|
||||
return(line++);
|
||||
}
|
||||
|
||||
unary(x, d) {
|
||||
if(line >= MAXLIN) overflo();
|
||||
int unary(int x, int d)
|
||||
{
|
||||
if(line >= MAXLIN)
|
||||
overflo();
|
||||
name[line] = x;
|
||||
left[line] = d;
|
||||
right[line] = 0;
|
||||
parent[d] = line;
|
||||
return(line++);
|
||||
}
|
||||
overflo() {
|
||||
|
||||
void overflo()
|
||||
{
|
||||
fprintf(stderr, "egrep: regular expression too long\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
cfoll(v) {
|
||||
register i;
|
||||
void cfoll(int v)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (left[v] == 0) {
|
||||
count = 0;
|
||||
for (i=1; i<=line; i++) tmpstat[i] = 0;
|
||||
@@ -233,8 +269,10 @@ cfoll(v) {
|
||||
cfoll(right[v]);
|
||||
}
|
||||
}
|
||||
cgotofn() {
|
||||
register c, i, k;
|
||||
|
||||
void cgotofn()
|
||||
{
|
||||
int c, i, k;
|
||||
int n, s;
|
||||
char symbol[NCHARS];
|
||||
int j, nc, pc, pos;
|
||||
@@ -242,7 +280,7 @@ cgotofn() {
|
||||
int number, newpos;
|
||||
count = 0;
|
||||
for (n=3; n<=line; n++) tmpstat[n] = 0;
|
||||
if (cstate(line-1)==0) {
|
||||
if (cstate(line-1) == 0) {
|
||||
tmpstat[line] = 1;
|
||||
count++;
|
||||
out[0] = 1;
|
||||
@@ -327,8 +365,10 @@ cgotofn() {
|
||||
}
|
||||
}
|
||||
|
||||
cstate(v) {
|
||||
register b;
|
||||
int cstate(int v)
|
||||
{
|
||||
int b;
|
||||
|
||||
if (left[v] == 0) {
|
||||
if (tmpstat[v] != 1) {
|
||||
tmpstat[v] = 1;
|
||||
@@ -352,9 +392,10 @@ cstate(v) {
|
||||
}
|
||||
}
|
||||
|
||||
int member(int symb, int set, int torf)
|
||||
{
|
||||
int i, num, pos;
|
||||
|
||||
member(symb, set, torf) {
|
||||
register i, num, pos;
|
||||
num = chars[set];
|
||||
pos = set + 1;
|
||||
for (i=0; i<num; i++)
|
||||
@@ -362,8 +403,10 @@ member(symb, set, torf) {
|
||||
return (!torf);
|
||||
}
|
||||
|
||||
notin(n) {
|
||||
register i, j, pos;
|
||||
int notin(int n)
|
||||
{
|
||||
int i, j, pos;
|
||||
|
||||
for (i=0; i<=n; i++) {
|
||||
if (positions[state[i]] == count) {
|
||||
pos = state[i] + 1;
|
||||
@@ -377,9 +420,12 @@ notin(n) {
|
||||
return (1);
|
||||
}
|
||||
|
||||
add(array, n) int *array; {
|
||||
register i;
|
||||
if (nxtpos + count > MAXPOS) overflo();
|
||||
void add(int *array, int n)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (nxtpos + count > MAXPOS)
|
||||
overflo();
|
||||
array[n] = nxtpos;
|
||||
positions[nxtpos++] = count;
|
||||
for (i=3; i <= line; i++) {
|
||||
@@ -389,7 +435,8 @@ add(array, n) int *array; {
|
||||
}
|
||||
}
|
||||
|
||||
follow(v) int v; {
|
||||
void follow(int v)
|
||||
{
|
||||
int p;
|
||||
if (v == line) return;
|
||||
p = parent[v];
|
||||
@@ -419,9 +466,7 @@ follow(v) int v; {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
while (--argc > 0 && (++argv)[0][0]=='-')
|
||||
switch (argv[0][1]) {
|
||||
@@ -498,12 +543,11 @@ out:
|
||||
exit(retcode != 0 ? retcode : nsucc == 0);
|
||||
}
|
||||
|
||||
execute(file)
|
||||
char *file;
|
||||
void execute(char *file)
|
||||
{
|
||||
register char *p;
|
||||
register cstat;
|
||||
register ccount;
|
||||
char *p;
|
||||
int cstat;
|
||||
int ccount;
|
||||
static char *buf;
|
||||
static int blksize;
|
||||
struct stat stb;
|
||||
@@ -541,7 +585,8 @@ char *file;
|
||||
for (;;) {
|
||||
cstat = gotofn[cstat][*p&0377]; /* all input chars made positive */
|
||||
if (out[cstat]) {
|
||||
found: for(;;) {
|
||||
found:
|
||||
for(;;) {
|
||||
if (*p++ == '\n') {
|
||||
if (vflag == 0) {
|
||||
succeed: nsucc = 1;
|
||||
@@ -592,7 +637,7 @@ char *file;
|
||||
if (out[(cstat=istat)]) goto cfound;
|
||||
}
|
||||
}
|
||||
brk2:
|
||||
brk2:
|
||||
if (--ccount <= 0) {
|
||||
if (p <= &buf[blksize]) {
|
||||
if ((ccount = read(f, p, blksize)) <= 0) break;
|
||||
@@ -607,7 +652,8 @@ char *file;
|
||||
blkno += ccount / 512;
|
||||
}
|
||||
}
|
||||
done: close(f);
|
||||
done:
|
||||
close(f);
|
||||
if (cflag) {
|
||||
if (nfile > 1)
|
||||
printf("%s:", file);
|
||||
|
||||
353
src/cmd/expr.y
353
src/cmd/expr.y
@@ -1,3 +1,12 @@
|
||||
%{
|
||||
int ematch(char *s, char *p);
|
||||
void yyerror(char *s);
|
||||
int advance(char *lp, char *ep);
|
||||
char *compile(char *instring, char *ep, char *endbuf, int seof);
|
||||
void getrnge(char *str);
|
||||
int ecmp(char *a, char *b, int count);
|
||||
%}
|
||||
|
||||
/* Yacc productions for "expr" command: */
|
||||
|
||||
%token OR AND ADD SUBT MULT DIV REM EQ GT GEQ LT LEQ NEQ
|
||||
@@ -18,7 +27,7 @@
|
||||
/* a single `expression' is evaluated and printed: */
|
||||
|
||||
expression: expr NOARG = {
|
||||
printf("%s\n", $1);
|
||||
printf("%s\n", (char*) $1);
|
||||
exit((! strcmp((char*) $1, "0") ||
|
||||
! strcmp((char*) $1, "\0")) ? 1 : 0);
|
||||
}
|
||||
@@ -26,24 +35,24 @@ expression: expr NOARG = {
|
||||
|
||||
|
||||
expr: '(' expr ')' = { $$ = (int) $2; }
|
||||
| expr OR expr = { $$ = (int) conju(OR, $1, $3); }
|
||||
| expr AND expr = { $$ = (int) conju(AND, $1, $3); }
|
||||
| expr EQ expr = { $$ = (int) rel(EQ, $1, $3); }
|
||||
| expr GT expr = { $$ = (int) rel(GT, $1, $3); }
|
||||
| expr GEQ expr = { $$ = (int) rel(GEQ, $1, $3); }
|
||||
| expr LT expr = { $$ = (int) rel(LT, $1, $3); }
|
||||
| expr LEQ expr = { $$ = (int) rel(LEQ, $1, $3); }
|
||||
| expr NEQ expr = { $$ = (int) rel(NEQ, $1, $3); }
|
||||
| expr ADD expr = { $$ = (int) arith(ADD, $1, $3); }
|
||||
| expr SUBT expr = { $$ = (int) arith(SUBT, $1, $3); }
|
||||
| expr MULT expr = { $$ = (int) arith(MULT, $1, $3); }
|
||||
| expr DIV expr = { $$ = (int) arith(DIV, $1, $3); }
|
||||
| expr REM expr = { $$ = (int) arith(REM, $1, $3); }
|
||||
| expr MCH expr = { $$ = (int) match($1, $3); }
|
||||
| MATCH expr expr = { $$ = (int) match($2, $3); }
|
||||
| SUBSTR expr expr expr = { $$ = (int) substr($2, $3, $4); }
|
||||
| LENGTH expr = { $$ = (int) length($2); }
|
||||
| INDEX expr expr = { $$ = (int) cindex($2, $3); }
|
||||
| expr OR expr = { $$ = (int) conju(OR, (char*) $1, (char*) $3); }
|
||||
| expr AND expr = { $$ = (int) conju(AND, (char*) $1, (char*) $3); }
|
||||
| expr EQ expr = { $$ = (int) rel(EQ, (char*) $1, (char*) $3); }
|
||||
| expr GT expr = { $$ = (int) rel(GT, (char*) $1, (char*) $3); }
|
||||
| expr GEQ expr = { $$ = (int) rel(GEQ, (char*) $1, (char*) $3); }
|
||||
| expr LT expr = { $$ = (int) rel(LT, (char*) $1, (char*) $3); }
|
||||
| expr LEQ expr = { $$ = (int) rel(LEQ, (char*) $1, (char*) $3); }
|
||||
| expr NEQ expr = { $$ = (int) rel(NEQ, (char*) $1, (char*) $3); }
|
||||
| expr ADD expr = { $$ = (int) arith(ADD, (char*) $1, (char*) $3); }
|
||||
| expr SUBT expr = { $$ = (int) arith(SUBT, (char*) $1, (char*) $3); }
|
||||
| expr MULT expr = { $$ = (int) arith(MULT, (char*) $1, (char*) $3); }
|
||||
| expr DIV expr = { $$ = (int) arith(DIV, (char*) $1, (char*) $3); }
|
||||
| expr REM expr = { $$ = (int) arith(REM, (char*) $1, (char*) $3); }
|
||||
| expr MCH expr = { $$ = (int) match((char*) $1, (char*) $3); }
|
||||
| MATCH expr expr = { $$ = (int) match((char*) $2, (char*) $3); }
|
||||
| SUBSTR expr expr expr = { $$ = (int) substr((char*) $2, (char*) $3, (char*) $4); }
|
||||
| LENGTH expr = { $$ = (int) length((char*) $2); }
|
||||
| INDEX expr expr = { $$ = (int) cindex((char*) $2, (char*) $3); }
|
||||
| A_STRING
|
||||
;
|
||||
%%
|
||||
@@ -55,7 +64,7 @@ expr: '(' expr ')' = { $$ = (int) $2; }
|
||||
#define ESIZE 256
|
||||
#define error(c) errxx(c)
|
||||
#define EQL(x,y) !strcmp(x,y)
|
||||
long atol();
|
||||
|
||||
char **Av;
|
||||
int Ac;
|
||||
int Argi;
|
||||
@@ -63,47 +72,53 @@ int Argi;
|
||||
char Mstring[1][128];
|
||||
extern int nbra;
|
||||
|
||||
main(argc, argv) char **argv; {
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Ac = argc;
|
||||
Argi = 1;
|
||||
Av = argv;
|
||||
yyparse();
|
||||
}
|
||||
|
||||
char *operators[] = { "|", "&", "+", "-", "*", "/", "%", ":",
|
||||
char *operators[] = {
|
||||
"|", "&", "+", "-", "*", "/", "%", ":",
|
||||
"=", "==", "<", "<=", ">", ">=", "!=",
|
||||
"match", "substr", "length", "index", "\0" };
|
||||
int op[] = { OR, AND, ADD, SUBT, MULT, DIV, REM, MCH,
|
||||
"match", "substr", "length", "index", "\0"
|
||||
};
|
||||
|
||||
int op[] = {
|
||||
OR, AND, ADD, SUBT, MULT, DIV, REM, MCH,
|
||||
EQ, EQ, LT, LEQ, GT, GEQ, NEQ,
|
||||
MATCH, SUBSTR, LENGTH, INDEX };
|
||||
MATCH, SUBSTR, LENGTH, INDEX
|
||||
};
|
||||
|
||||
yylex()
|
||||
int yylex()
|
||||
{
|
||||
register char *p;
|
||||
register i;
|
||||
char *p;
|
||||
int i;
|
||||
|
||||
if(Argi >= Ac) return NOARG;
|
||||
if (Argi >= Ac) return NOARG;
|
||||
|
||||
p = Av[Argi++];
|
||||
|
||||
if(*p == '(' || *p == ')')
|
||||
if (*p == '(' || *p == ')')
|
||||
return (int)*p;
|
||||
for(i = 0; *operators[i]; ++i)
|
||||
if(EQL(operators[i], p))
|
||||
for (i = 0; *operators[i]; ++i)
|
||||
if (EQL(operators[i], p))
|
||||
return op[i];
|
||||
yylval = (int) p;
|
||||
return A_STRING;
|
||||
}
|
||||
|
||||
char *rel(op, r1, r2) register char *r1, *r2;
|
||||
char *rel(int op, char *r1, char *r2)
|
||||
{
|
||||
register long i;
|
||||
long i;
|
||||
|
||||
if(ematch(r1, "-*[0-9]*$") && ematch(r2, "[0-9]*$"))
|
||||
if (ematch(r1, "-*[0-9]*$") && ematch(r2, "[0-9]*$"))
|
||||
i = atol(r1) - atol(r2);
|
||||
else
|
||||
i = strcmp(r1, r2);
|
||||
switch(op) {
|
||||
switch (op) {
|
||||
case EQ: i = i==0; break;
|
||||
case GT: i = i>0; break;
|
||||
case GEQ: i = i>=0; break;
|
||||
@@ -114,17 +129,17 @@ char *rel(op, r1, r2) register char *r1, *r2;
|
||||
return i? "1": "0";
|
||||
}
|
||||
|
||||
char *arith(op, r1, r2) char *r1, *r2;
|
||||
char *arith(int op, char *r1, char *r2)
|
||||
{
|
||||
long i1, i2;
|
||||
register char *rv;
|
||||
char *rv;
|
||||
|
||||
if(!(ematch(r1, "[0-9]*$") && ematch(r2, "[0-9]*$")))
|
||||
if (!(ematch(r1, "[0-9]*$") && ematch(r2, "[0-9]*$")))
|
||||
yyerror("non-numeric argument");
|
||||
i1 = atol(r1);
|
||||
i2 = atol(r2);
|
||||
|
||||
switch(op) {
|
||||
switch (op) {
|
||||
case ADD: i1 = i1 + i2; break;
|
||||
case SUBT: i1 = i1 - i2; break;
|
||||
case MULT: i1 = i1 * i2; break;
|
||||
@@ -132,20 +147,20 @@ char *arith(op, r1, r2) char *r1, *r2;
|
||||
case REM: i1 = i1 % i2; break;
|
||||
}
|
||||
rv = malloc(16);
|
||||
sprintf(rv, "%D", i1);
|
||||
sprintf(rv, "%ld", i1);
|
||||
return rv;
|
||||
}
|
||||
|
||||
char *conju(op, r1, r2) char *r1, *r2;
|
||||
char *conju(int op, char *r1, char *r2)
|
||||
{
|
||||
register char *rv;
|
||||
char *rv;
|
||||
|
||||
switch(op) {
|
||||
switch (op) {
|
||||
|
||||
case OR:
|
||||
if(EQL(r1, "0")
|
||||
if (EQL(r1, "0")
|
||||
|| EQL(r1, ""))
|
||||
if(EQL(r2, "0")
|
||||
if (EQL(r2, "0")
|
||||
|| EQL(r2, ""))
|
||||
rv = "0";
|
||||
else
|
||||
@@ -154,10 +169,10 @@ char *conju(op, r1, r2) char *r1, *r2;
|
||||
rv = r1;
|
||||
break;
|
||||
case AND:
|
||||
if(EQL(r1, "0")
|
||||
if (EQL(r1, "0")
|
||||
|| EQL(r1, ""))
|
||||
rv = "0";
|
||||
else if(EQL(r2, "0")
|
||||
else if (EQL(r2, "0")
|
||||
|| EQL(r2, ""))
|
||||
rv = "0";
|
||||
else
|
||||
@@ -167,94 +182,89 @@ char *conju(op, r1, r2) char *r1, *r2;
|
||||
return rv;
|
||||
}
|
||||
|
||||
char *substr(v, s, w) char *v, *s, *w;
|
||||
char *substr(char *v, char *s, char *w)
|
||||
{
|
||||
register si, wi;
|
||||
register char *res;
|
||||
int si, wi;
|
||||
char *res;
|
||||
|
||||
si = atol(s);
|
||||
wi = atol(w);
|
||||
while(--si) if(*v) ++v;
|
||||
while (--si) if (*v) ++v;
|
||||
|
||||
res = v;
|
||||
|
||||
while(wi--) if(*v) ++v;
|
||||
while (wi--) if (*v) ++v;
|
||||
|
||||
*v = '\0';
|
||||
return res;
|
||||
}
|
||||
|
||||
char *length(s) register char *s;
|
||||
char *length(char *s)
|
||||
{
|
||||
register i = 0;
|
||||
register char *rv;
|
||||
int i = 0;
|
||||
char *rv;
|
||||
|
||||
while(*s++) ++i;
|
||||
while (*s++) ++i;
|
||||
|
||||
rv = malloc(8);
|
||||
sprintf(rv, "%d", i);
|
||||
return rv;
|
||||
}
|
||||
|
||||
char *cindex(s, t) char *s, *t;
|
||||
char *cindex(char *s, char *t)
|
||||
{
|
||||
register i, j;
|
||||
register char *rv;
|
||||
int i, j;
|
||||
char *rv;
|
||||
|
||||
for(i = 0; s[i] ; ++i)
|
||||
for(j = 0; t[j] ; ++j)
|
||||
if(s[i]==t[j]) {
|
||||
for (i = 0; s[i] ; ++i)
|
||||
for (j = 0; t[j] ; ++j)
|
||||
if (s[i]==t[j]) {
|
||||
sprintf(rv = malloc(8), "%d", ++i);
|
||||
return rv;
|
||||
}
|
||||
return "0";
|
||||
}
|
||||
|
||||
char *match(s, p)
|
||||
char *match(char *s, char *p)
|
||||
{
|
||||
register char *rv;
|
||||
char *rv = malloc(8);
|
||||
|
||||
sprintf(rv = malloc(8), "%d", ematch(s, p));
|
||||
if(nbra) {
|
||||
sprintf(rv, "%d", ematch(s, p));
|
||||
if (nbra) {
|
||||
rv = malloc(strlen(Mstring[0])+1);
|
||||
strcpy(rv, Mstring[0]);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
#define INIT register char *sp = instring;
|
||||
#define INIT char *sp = instring;
|
||||
#define GETC() (*sp++)
|
||||
#define PEEKC() (*sp)
|
||||
#define UNGETC(c) (--sp)
|
||||
#define RETURN(c) return
|
||||
#define ERROR(c) errxx(c)
|
||||
|
||||
|
||||
ematch(s, p)
|
||||
char *s;
|
||||
register char *p;
|
||||
int ematch(char *s, char *p)
|
||||
{
|
||||
static char expbuf[ESIZE];
|
||||
char *compile();
|
||||
register num;
|
||||
int num;
|
||||
extern char *braslist[], *braelist[], *loc2;
|
||||
|
||||
compile(p, expbuf, &expbuf[ESIZE], 0);
|
||||
if(nbra > 1)
|
||||
if (nbra > 1)
|
||||
yyerror("Too many '\\('s");
|
||||
if(advance(s, expbuf)) {
|
||||
if(nbra == 1) {
|
||||
if (advance(s, expbuf)) {
|
||||
if (nbra == 1) {
|
||||
p = braslist[0];
|
||||
num = braelist[0] - p;
|
||||
strncpy(Mstring[0], p, num);
|
||||
Mstring[0][num] = '\0';
|
||||
}
|
||||
return(loc2-s);
|
||||
return loc2-s;
|
||||
}
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
errxx(c)
|
||||
void errxx(c)
|
||||
{
|
||||
yyerror("RE error");
|
||||
}
|
||||
@@ -276,8 +286,8 @@ errxx(c)
|
||||
#define PLACE(c) ep[c >> 3] |= bittab[c & 07]
|
||||
#define ISTHERE(c) (ep[c >> 3] & bittab[c & 07])
|
||||
|
||||
char *braslist[NBRA];
|
||||
char *braelist[NBRA];
|
||||
char *braslist[NBRA];
|
||||
char *braelist[NBRA];
|
||||
int nbra;
|
||||
char *loc1, *loc2, *locs;
|
||||
int sed;
|
||||
@@ -286,7 +296,7 @@ int circf;
|
||||
int low;
|
||||
int size;
|
||||
|
||||
char bittab[] = {
|
||||
char bittab[] = {
|
||||
1,
|
||||
2,
|
||||
4,
|
||||
@@ -297,14 +307,11 @@ char bittab[] = {
|
||||
128
|
||||
};
|
||||
|
||||
char *
|
||||
compile(instring, ep, endbuf, seof)
|
||||
register char *ep;
|
||||
char *instring, *endbuf;
|
||||
char *compile(char *instring, char *ep, char *endbuf, int seof)
|
||||
{
|
||||
INIT /* Dependent declarations and initializations */
|
||||
register c;
|
||||
register eof = seof;
|
||||
int c;
|
||||
int eof = seof;
|
||||
char *lastep = instring;
|
||||
int cclcnt;
|
||||
char bracket[NBRA], *bracketp;
|
||||
@@ -314,10 +321,10 @@ char *instring, *endbuf;
|
||||
int i, cflg;
|
||||
|
||||
lastep = 0;
|
||||
if((c = GETC()) == eof) {
|
||||
if(*ep == 0 && !sed)
|
||||
if ((c = GETC()) == eof) {
|
||||
if (*ep == 0 && !sed)
|
||||
ERROR(41);
|
||||
RETURN(ep);
|
||||
return ep;
|
||||
}
|
||||
bracketp = bracket;
|
||||
circf = closed = nbra = 0;
|
||||
@@ -328,11 +335,11 @@ char *instring, *endbuf;
|
||||
for (;;) {
|
||||
if (ep >= endbuf)
|
||||
ERROR(50);
|
||||
if((c = GETC()) != '*' && ((c != '\\') || (PEEKC() != '{')))
|
||||
if ((c = GETC()) != '*' && ((c != '\\') || (PEEKC() != '{')))
|
||||
lastep = ep;
|
||||
if (c == eof) {
|
||||
*ep++ = CEOF;
|
||||
RETURN(ep);
|
||||
return ep;
|
||||
}
|
||||
switch (c) {
|
||||
|
||||
@@ -349,44 +356,44 @@ char *instring, *endbuf;
|
||||
continue;
|
||||
|
||||
case '$':
|
||||
if(PEEKC() != eof)
|
||||
if (PEEKC() != eof)
|
||||
goto defchar;
|
||||
*ep++ = CDOL;
|
||||
continue;
|
||||
|
||||
case '[':
|
||||
if(&ep[17] >= endbuf)
|
||||
if (&ep[17] >= endbuf)
|
||||
ERROR(50);
|
||||
|
||||
*ep++ = CCL;
|
||||
lc = 0;
|
||||
for(i = 0; i < 16; i++)
|
||||
for (i = 0; i < 16; i++)
|
||||
ep[i] = 0;
|
||||
|
||||
neg = 0;
|
||||
if((c = GETC()) == '^') {
|
||||
if ((c = GETC()) == '^') {
|
||||
neg = 1;
|
||||
c = GETC();
|
||||
}
|
||||
|
||||
do {
|
||||
if(c == '\0' || c == '\n')
|
||||
if (c == '\0' || c == '\n')
|
||||
ERROR(49);
|
||||
if(c == '-' && lc != 0) {
|
||||
if (c == '-' && lc != 0) {
|
||||
if ((c = GETC()) == ']') {
|
||||
PLACE('-');
|
||||
break;
|
||||
}
|
||||
while(lc < c) {
|
||||
while (lc < c) {
|
||||
PLACE(lc);
|
||||
lc++;
|
||||
}
|
||||
}
|
||||
lc = c;
|
||||
PLACE(c);
|
||||
} while((c = GETC()) != ']');
|
||||
if(neg) {
|
||||
for(cclcnt = 0; cclcnt < 16; cclcnt++)
|
||||
} while ((c = GETC()) != ']');
|
||||
if (neg) {
|
||||
for (cclcnt = 0; cclcnt < 16; cclcnt++)
|
||||
ep[cclcnt] ^= -1;
|
||||
ep[0] &= 0376;
|
||||
}
|
||||
@@ -396,10 +403,10 @@ char *instring, *endbuf;
|
||||
continue;
|
||||
|
||||
case '\\':
|
||||
switch(c = GETC()) {
|
||||
switch (c = GETC()) {
|
||||
|
||||
case '(':
|
||||
if(nbra >= NBRA)
|
||||
if (nbra >= NBRA)
|
||||
ERROR(43);
|
||||
*bracketp++ = nbra;
|
||||
*ep++ = CBRA;
|
||||
@@ -407,7 +414,7 @@ char *instring, *endbuf;
|
||||
continue;
|
||||
|
||||
case ')':
|
||||
if(bracketp <= bracket)
|
||||
if (bracketp <= bracket)
|
||||
ERROR(42);
|
||||
*ep++ = CKET;
|
||||
*ep++ = *--bracketp;
|
||||
@@ -415,7 +422,7 @@ char *instring, *endbuf;
|
||||
continue;
|
||||
|
||||
case '{':
|
||||
if(lastep == (char *) (0))
|
||||
if (lastep == (char *) (0))
|
||||
goto defchar;
|
||||
*lastep |= RNGE;
|
||||
cflg = 0;
|
||||
@@ -427,25 +434,25 @@ char *instring, *endbuf;
|
||||
i = 10 * i + c - '0';
|
||||
else
|
||||
ERROR(16);
|
||||
} while(((c = GETC()) != '\\') && (c != ','));
|
||||
} while (((c = GETC()) != '\\') && (c != ','));
|
||||
if (i > 255)
|
||||
ERROR(11);
|
||||
*ep++ = i;
|
||||
if (c == ',') {
|
||||
if(cflg++)
|
||||
if (cflg++)
|
||||
ERROR(44);
|
||||
if((c = GETC()) == '\\')
|
||||
*ep++ = 255;
|
||||
if ((c = GETC()) == '\\')
|
||||
*ep++ = '\377';
|
||||
else {
|
||||
UNGETC(c);
|
||||
goto nlim; /* get 2'nd number */
|
||||
}
|
||||
}
|
||||
if(GETC() != '}')
|
||||
if (GETC() != '}')
|
||||
ERROR(45);
|
||||
if(!cflg) /* one number */
|
||||
if (!cflg) /* one number */
|
||||
*ep++ = i;
|
||||
else if((ep[-1] & 0377) < (ep[-2] & 0377))
|
||||
else if ((ep[-1] & 0377) < (ep[-2] & 0377))
|
||||
ERROR(46);
|
||||
continue;
|
||||
|
||||
@@ -457,8 +464,8 @@ char *instring, *endbuf;
|
||||
goto defchar;
|
||||
|
||||
default:
|
||||
if(c >= '1' && c <= '9') {
|
||||
if((c -= '1') >= closed)
|
||||
if (c >= '1' && c <= '9') {
|
||||
if ((c -= '1') >= closed)
|
||||
ERROR(25);
|
||||
*ep++ = CBACK;
|
||||
*ep++ = c;
|
||||
@@ -476,14 +483,13 @@ char *instring, *endbuf;
|
||||
}
|
||||
}
|
||||
|
||||
step(p1, p2)
|
||||
register char *p1, *p2;
|
||||
int step(char *p1, char *p2)
|
||||
{
|
||||
register c;
|
||||
int c;
|
||||
|
||||
if (circf) {
|
||||
loc1 = p1;
|
||||
return(advance(p1, p2));
|
||||
return advance(p1, p2);
|
||||
}
|
||||
/* fast check for first character */
|
||||
if (*p2==CCHR) {
|
||||
@@ -493,25 +499,24 @@ register char *p1, *p2;
|
||||
continue;
|
||||
if (advance(p1, p2)) {
|
||||
loc1 = p1;
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
} while (*p1++);
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
/* regular algorithm */
|
||||
do {
|
||||
if (advance(p1, p2)) {
|
||||
loc1 = p1;
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
} while (*p1++);
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
advance(lp, ep)
|
||||
register char *lp, *ep;
|
||||
int advance(char *lp, char *ep)
|
||||
{
|
||||
register char *curlp;
|
||||
char *curlp;
|
||||
char c;
|
||||
char *bbeg;
|
||||
int ct;
|
||||
@@ -521,29 +526,29 @@ register char *lp, *ep;
|
||||
case CCHR:
|
||||
if (*ep++ == *lp++)
|
||||
continue;
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
case CDOT:
|
||||
if (*lp++)
|
||||
continue;
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
case CDOL:
|
||||
if (*lp==0)
|
||||
continue;
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
case CEOF:
|
||||
loc2 = lp;
|
||||
return(1);
|
||||
return 1;
|
||||
|
||||
case CCL:
|
||||
c = *lp++ & 0177;
|
||||
if(ISTHERE(c)) {
|
||||
if (ISTHERE(c)) {
|
||||
ep += 16;
|
||||
continue;
|
||||
}
|
||||
return(0);
|
||||
return 0;
|
||||
case CBRA:
|
||||
braslist[*ep++] = lp;
|
||||
continue;
|
||||
@@ -555,46 +560,46 @@ register char *lp, *ep;
|
||||
case CCHR|RNGE:
|
||||
c = *ep++;
|
||||
getrnge(ep);
|
||||
while(low--)
|
||||
if(*lp++ != c)
|
||||
return(0);
|
||||
while (low--)
|
||||
if (*lp++ != c)
|
||||
return 0;
|
||||
curlp = lp;
|
||||
while(size--)
|
||||
if(*lp++ != c)
|
||||
while (size--)
|
||||
if (*lp++ != c)
|
||||
break;
|
||||
if(size < 0)
|
||||
if (size < 0)
|
||||
lp++;
|
||||
ep += 2;
|
||||
goto star;
|
||||
|
||||
case CDOT|RNGE:
|
||||
getrnge(ep);
|
||||
while(low--)
|
||||
if(*lp++ == '\0')
|
||||
return(0);
|
||||
while (low--)
|
||||
if (*lp++ == '\0')
|
||||
return 0;
|
||||
curlp = lp;
|
||||
while(size--)
|
||||
if(*lp++ == '\0')
|
||||
while (size--)
|
||||
if (*lp++ == '\0')
|
||||
break;
|
||||
if(size < 0)
|
||||
if (size < 0)
|
||||
lp++;
|
||||
ep += 2;
|
||||
goto star;
|
||||
|
||||
case CCL|RNGE:
|
||||
getrnge(ep + 16);
|
||||
while(low--) {
|
||||
while (low--) {
|
||||
c = *lp++ & 0177;
|
||||
if(!ISTHERE(c))
|
||||
return(0);
|
||||
if (!ISTHERE(c))
|
||||
return 0;
|
||||
}
|
||||
curlp = lp;
|
||||
while(size--) {
|
||||
while (size--) {
|
||||
c = *lp++ & 0177;
|
||||
if(!ISTHERE(c))
|
||||
if (!ISTHERE(c))
|
||||
break;
|
||||
}
|
||||
if(size < 0)
|
||||
if (size < 0)
|
||||
lp++;
|
||||
ep += 18; /* 16 + 2 */
|
||||
goto star;
|
||||
@@ -603,24 +608,24 @@ register char *lp, *ep;
|
||||
bbeg = braslist[*ep];
|
||||
ct = braelist[*ep++] - bbeg;
|
||||
|
||||
if(ecmp(bbeg, lp, ct)) {
|
||||
if (ecmp(bbeg, lp, ct)) {
|
||||
lp += ct;
|
||||
continue;
|
||||
}
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
case CBACK|STAR:
|
||||
bbeg = braslist[*ep];
|
||||
ct = braelist[*ep++] - bbeg;
|
||||
curlp = lp;
|
||||
while(ecmp(bbeg, lp, ct))
|
||||
while (ecmp(bbeg, lp, ct))
|
||||
lp += ct;
|
||||
|
||||
while(lp >= curlp) {
|
||||
if(advance(lp, ep)) return(1);
|
||||
while (lp >= curlp) {
|
||||
if (advance(lp, ep)) return 1;
|
||||
lp -= ct;
|
||||
}
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
|
||||
case CDOT|STAR:
|
||||
@@ -638,43 +643,39 @@ register char *lp, *ep;
|
||||
curlp = lp;
|
||||
do {
|
||||
c = *lp++ & 0177;
|
||||
} while(ISTHERE(c));
|
||||
} while (ISTHERE(c));
|
||||
ep += 16;
|
||||
goto star;
|
||||
|
||||
star:
|
||||
do {
|
||||
if(--lp == locs)
|
||||
if (--lp == locs)
|
||||
break;
|
||||
if (advance(lp, ep))
|
||||
return(1);
|
||||
return 1;
|
||||
} while (lp > curlp);
|
||||
return(0);
|
||||
return 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
getrnge(str)
|
||||
register char *str;
|
||||
void getrnge(char *str)
|
||||
{
|
||||
low = *str++ & 0377;
|
||||
size = *str == 255 ? 20000 : (*str &0377) - low;
|
||||
size = *str == '\377' ? 20000 : (*str & 0377) - low;
|
||||
}
|
||||
|
||||
ecmp(a, b, count)
|
||||
register char *a, *b;
|
||||
register count;
|
||||
int ecmp(char *a, char *b, int count)
|
||||
{
|
||||
if(a == b) /* should have been caught in compile() */
|
||||
if (a == b) /* should have been caught in compile() */
|
||||
error(51);
|
||||
while(count--)
|
||||
if(*a++ != *b++)
|
||||
return(0);
|
||||
return(1);
|
||||
while (count--)
|
||||
if (*a++ != *b++)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
yyerror(s)
|
||||
char *s;
|
||||
void yyerror(char *s)
|
||||
{
|
||||
fprintf(stderr, "%s\n", s);
|
||||
exit(2);
|
||||
|
||||
143
src/cmd/iostat.c
143
src/cmd/iostat.c
@@ -1,44 +1,43 @@
|
||||
/*
|
||||
* iostat
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <nlist.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/buf.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/dk.h>
|
||||
#include <sys/file.h>
|
||||
|
||||
struct nlist nl[] = {
|
||||
{ "_dk_busy" },
|
||||
#define X_DK_BUSY 0
|
||||
#define X_DK_BUSY 0
|
||||
{ "_dk_xfer" },
|
||||
#define X_DK_XFER 1
|
||||
#define X_DK_XFER 1
|
||||
{ "_dk_bytes" },
|
||||
#define X_DK_BYTES 2
|
||||
#define X_DK_BYTES 2
|
||||
{ "_tk_nin" },
|
||||
#define X_TK_NIN 3
|
||||
#define X_TK_NIN 3
|
||||
{ "_tk_nout" },
|
||||
#define X_TK_NOUT 4
|
||||
#define X_TK_NOUT 4
|
||||
{ "_cp_time" },
|
||||
#define X_CP_TIME 5
|
||||
#define X_CP_TIME 5
|
||||
{ "_hz" },
|
||||
#define X_HZ 6
|
||||
#define X_HZ 6
|
||||
{ "_dk_ndrive" },
|
||||
#define X_DK_NDRIVE 7
|
||||
{ "_dk_name" },
|
||||
#define X_DK_NAME 8
|
||||
#define X_DK_NAME 8
|
||||
{ "_dk_unit" },
|
||||
#define X_DK_UNIT 9
|
||||
#define X_DK_UNIT 9
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
char **dr_name;
|
||||
char **dk_name;
|
||||
char **dr_name;
|
||||
char **dk_name;
|
||||
int *dr_select;
|
||||
int *dk_unit;
|
||||
int dk_ndrive;
|
||||
@@ -46,22 +45,25 @@ int ndrives = 0;
|
||||
|
||||
struct {
|
||||
int dk_busy;
|
||||
long cp_time[CPUSTATES];
|
||||
long *dk_bytes;
|
||||
long *dk_xfer;
|
||||
long tk_nin;
|
||||
long tk_nout;
|
||||
long cp_time[CPUSTATES];
|
||||
long *dk_bytes;
|
||||
long *dk_xfer;
|
||||
long tk_nin;
|
||||
long tk_nout;
|
||||
} s, s1;
|
||||
|
||||
int mf;
|
||||
int hz;
|
||||
double etime;
|
||||
double etime;
|
||||
int tohdr = 1;
|
||||
|
||||
void printhdr(sig)
|
||||
int sig;
|
||||
static void read_names(void);
|
||||
static void stats(int dn);
|
||||
static void stat1(int o);
|
||||
|
||||
void printhdr(int sig)
|
||||
{
|
||||
register int i;
|
||||
int i;
|
||||
|
||||
printf("---tty---");
|
||||
for (i = 0; i < dk_ndrive; i++)
|
||||
@@ -77,23 +79,21 @@ void printhdr(sig)
|
||||
tohdr = 19;
|
||||
}
|
||||
|
||||
main(argc, argv)
|
||||
char *argv[];
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
extern char *ctime();
|
||||
register i;
|
||||
int i;
|
||||
int iter;
|
||||
double f1, f2;
|
||||
long t;
|
||||
char *arg, **cp, name[6], buf[BUFSIZ];
|
||||
|
||||
knlist(nl);
|
||||
if(nl[X_DK_BUSY].n_value == 0) {
|
||||
if (nl[X_DK_BUSY].n_value == 0) {
|
||||
printf("dk_busy not found in /vmunix namelist\n");
|
||||
exit(1);
|
||||
}
|
||||
mf = open("/dev/kmem", 0);
|
||||
if(mf < 0) {
|
||||
if (mf < 0) {
|
||||
printf("cannot open /dev/kmem\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -105,19 +105,19 @@ main(argc, argv)
|
||||
exit(1);
|
||||
}
|
||||
lseek(mf, (long)nl[X_DK_NDRIVE].n_value, L_SET);
|
||||
read(mf, &dk_ndrive, sizeof (dk_ndrive));
|
||||
read(mf, &dk_ndrive, sizeof(dk_ndrive));
|
||||
if (dk_ndrive <= 0) {
|
||||
printf("dk_ndrive %d\n", dk_ndrive);
|
||||
exit(1);
|
||||
}
|
||||
dr_select = (int *)calloc(dk_ndrive, sizeof (int));
|
||||
dr_name = (char **)calloc(dk_ndrive, sizeof (char *));
|
||||
dk_name = (char **)calloc(dk_ndrive, sizeof (char *));
|
||||
dk_unit = (int *)calloc(dk_ndrive, sizeof (int));
|
||||
s.dk_bytes = (long *)calloc(dk_ndrive, sizeof (long));
|
||||
s1.dk_bytes = (long *)calloc(dk_ndrive, sizeof (long));
|
||||
s.dk_xfer = (long *)calloc(dk_ndrive, sizeof (long));
|
||||
s1.dk_xfer = (long *)calloc(dk_ndrive, sizeof (long));
|
||||
dr_select = (int *)calloc(dk_ndrive, sizeof(int));
|
||||
dr_name = (char **)calloc(dk_ndrive, sizeof(char *));
|
||||
dk_name = (char **)calloc(dk_ndrive, sizeof(char *));
|
||||
dk_unit = (int *)calloc(dk_ndrive, sizeof(int));
|
||||
s.dk_bytes = (long *)calloc(dk_ndrive, sizeof(long));
|
||||
s1.dk_bytes = (long *)calloc(dk_ndrive, sizeof(long));
|
||||
s.dk_xfer = (long *)calloc(dk_ndrive, sizeof(long));
|
||||
s1.dk_xfer = (long *)calloc(dk_ndrive, sizeof(long));
|
||||
for (arg = buf, i = 0; i < dk_ndrive; i++) {
|
||||
dr_name[i] = arg;
|
||||
sprintf(dr_name[i], "dk%d", i);
|
||||
@@ -155,15 +155,15 @@ main(argc, argv)
|
||||
signal(SIGCONT, printhdr);
|
||||
loop:
|
||||
if (--tohdr == 0)
|
||||
printhdr();
|
||||
printhdr(0);
|
||||
lseek(mf, (long)nl[X_DK_BUSY].n_value, L_SET);
|
||||
read(mf, &s.dk_busy, sizeof s.dk_busy);
|
||||
|
||||
lseek(mf, (long)nl[X_DK_XFER].n_value, L_SET);
|
||||
read(mf, s.dk_xfer, dk_ndrive*sizeof (long));
|
||||
read(mf, s.dk_xfer, dk_ndrive * sizeof(long));
|
||||
|
||||
lseek(mf, (long)nl[X_DK_BYTES].n_value, L_SET);
|
||||
read(mf, s.dk_bytes, dk_ndrive*sizeof (long));
|
||||
read(mf, s.dk_bytes, dk_ndrive * sizeof(long));
|
||||
|
||||
lseek(mf, (long)nl[X_TK_NIN].n_value, L_SET);
|
||||
read(mf, &s.tk_nin, sizeof s.tk_nin);
|
||||
@@ -175,26 +175,34 @@ loop:
|
||||
read(mf, s.cp_time, sizeof s.cp_time);
|
||||
|
||||
for (i = 0; i < dk_ndrive; i++) {
|
||||
if (! dr_select[i])
|
||||
if (!dr_select[i])
|
||||
continue;
|
||||
#define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
|
||||
X(dk_xfer); X(dk_bytes);
|
||||
#define X(fld) \
|
||||
t = s.fld[i]; \
|
||||
s.fld[i] -= s1.fld[i]; \
|
||||
s1.fld[i] = t
|
||||
X(dk_xfer);
|
||||
X(dk_bytes);
|
||||
}
|
||||
t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
|
||||
t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
|
||||
t = s.tk_nin;
|
||||
s.tk_nin -= s1.tk_nin;
|
||||
s1.tk_nin = t;
|
||||
t = s.tk_nout;
|
||||
s.tk_nout -= s1.tk_nout;
|
||||
s1.tk_nout = t;
|
||||
etime = 0;
|
||||
for(i=0; i<CPUSTATES; i++) {
|
||||
for (i = 0; i < CPUSTATES; i++) {
|
||||
X(cp_time);
|
||||
etime += s.cp_time[i];
|
||||
}
|
||||
if (etime == 0.0)
|
||||
etime = 1.0;
|
||||
etime /= (float) hz;
|
||||
printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime);
|
||||
for (i=0; i<dk_ndrive; i++)
|
||||
etime /= (float)hz;
|
||||
printf("%4.0f%5.0f", s.tk_nin / etime, s.tk_nout / etime);
|
||||
for (i = 0; i < dk_ndrive; i++)
|
||||
if (dr_select[i])
|
||||
stats(i);
|
||||
for (i=0; i<CPUSTATES; i++)
|
||||
for (i = 0; i < CPUSTATES; i++)
|
||||
stat1(i);
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
@@ -205,42 +213,41 @@ contin:
|
||||
}
|
||||
}
|
||||
|
||||
stats(dn)
|
||||
void stats(int dn)
|
||||
{
|
||||
/* number of bytes transferred */
|
||||
printf("%5.0f", (double) s.dk_bytes[dn] / 1024 / etime);
|
||||
printf("%5.0f", (double)s.dk_bytes[dn] / 1024 / etime);
|
||||
|
||||
/* number of transfers */
|
||||
printf("%4.0f", (double) s.dk_xfer[dn] / etime);
|
||||
printf("%4.0f", (double)s.dk_xfer[dn] / etime);
|
||||
}
|
||||
|
||||
stat1(o)
|
||||
void stat1(int o)
|
||||
{
|
||||
register i;
|
||||
int i;
|
||||
double time;
|
||||
|
||||
time = 0;
|
||||
for(i=0; i<CPUSTATES; i++)
|
||||
for (i = 0; i < CPUSTATES; i++)
|
||||
time += s.cp_time[i];
|
||||
if (time == 0.0)
|
||||
time = 1.0;
|
||||
printf(" %3.0f", 100.0 * s.cp_time[o] / time);
|
||||
}
|
||||
|
||||
read_names()
|
||||
void read_names()
|
||||
{
|
||||
char name[2];
|
||||
register int i;
|
||||
int i;
|
||||
|
||||
lseek(mf, (long)nl[X_DK_NAME].n_value, L_SET);
|
||||
read(mf, dk_name, dk_ndrive * sizeof (char *));
|
||||
read(mf, dk_name, dk_ndrive * sizeof(char *));
|
||||
lseek(mf, (long)nl[X_DK_UNIT].n_value, L_SET);
|
||||
read(mf, dk_unit, dk_ndrive * sizeof (int));
|
||||
read(mf, dk_unit, dk_ndrive * sizeof(int));
|
||||
|
||||
for(i = 0; dk_name[i]; i++) {
|
||||
for (i = 0; dk_name[i]; i++) {
|
||||
lseek(mf, (long)dk_name[i], L_SET);
|
||||
read(mf, name, sizeof name);
|
||||
sprintf(dr_name[i], "%c%c%d", name[0], name[1],
|
||||
dk_unit[i]);
|
||||
sprintf(dr_name[i], "%c%c%d", name[0], name[1], dk_unit[i]);
|
||||
}
|
||||
}
|
||||
|
||||
281
src/cmd/mail.c
281
src/cmd/mail.c
@@ -1,52 +1,55 @@
|
||||
#include <ctype.h>
|
||||
#include <paths.h>
|
||||
#include <pwd.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/file.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <pwd.h>
|
||||
#include <utmp.h>
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
#include <string.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sysexits.h>
|
||||
#include <paths.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <utmp.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
/* copylet flags */
|
||||
#define REMOTE 1 /* remote mail, add rmtmsg */
|
||||
#define ORDINARY 2
|
||||
#define ZAP 3 /* zap header and trailing empty line */
|
||||
#define FORWARD 4
|
||||
/* copylet flags */
|
||||
#define REMOTE 1 /* remote mail, add rmtmsg */
|
||||
#define ORDINARY 2
|
||||
#define ZAP 3 /* zap header and trailing empty line */
|
||||
#define FORWARD 4
|
||||
|
||||
#define LSIZE 256
|
||||
#define MAXLET 300 /* maximum number of letters */
|
||||
#define MAILMODE 0600 /* mode of created mail */
|
||||
#define LSIZE 256
|
||||
#define MAXLET 300 /* maximum number of letters */
|
||||
#define MAILMODE 0600 /* mode of created mail */
|
||||
|
||||
char line[LSIZE];
|
||||
char resp[LSIZE];
|
||||
|
||||
char line[LSIZE];
|
||||
char resp[LSIZE];
|
||||
struct let {
|
||||
long adr;
|
||||
char change;
|
||||
long adr;
|
||||
char change;
|
||||
} let[MAXLET];
|
||||
int nlet = 0;
|
||||
char lfil[50];
|
||||
long iop;
|
||||
char lettmp[] = "/tmp/maXXXXX";
|
||||
char maildir[] = _PATH_MAIL;
|
||||
char mailfile[] = _PATH_MAIL "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||
char dead[] = "dead.letter";
|
||||
char forwmsg[] = " forwarded\n";
|
||||
FILE *tmpf;
|
||||
FILE *malf;
|
||||
char my_name[60];
|
||||
|
||||
int nlet = 0;
|
||||
char lfil[50];
|
||||
long iop;
|
||||
char lettmp[] = "/tmp/maXXXXX";
|
||||
char maildir[] = _PATH_MAIL;
|
||||
char mailfile[] = _PATH_MAIL "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||
char dead[] = "dead.letter";
|
||||
char forwmsg[] = " forwarded\n";
|
||||
FILE *tmpf;
|
||||
FILE *malf;
|
||||
char my_name[60];
|
||||
int error;
|
||||
int changed;
|
||||
int forward;
|
||||
char from[] = "From ";
|
||||
int delex();
|
||||
char from[] = "From ";
|
||||
int flgf;
|
||||
int flgp;
|
||||
int delflg = 1;
|
||||
@@ -54,20 +57,35 @@ int hseqno;
|
||||
jmp_buf sjbuf;
|
||||
int rmail;
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
static void done(void);
|
||||
static void setsig(int i, sig_t f);
|
||||
static void delex(int i);
|
||||
static void panic(char *msg, ...);
|
||||
static int any(int c, char *str);
|
||||
static void printmail(int argc, char **argv);
|
||||
static void bulkmail(int argc, char **argv);
|
||||
static void cat(char *to, char *from1, char *from2);
|
||||
static void copymt(FILE *f1, FILE *f2);
|
||||
static void copylet(int n, FILE *f, int type);
|
||||
static char *getarg(char *s, char *p);
|
||||
static int sendmail(int n, char *name, char *fromaddr);
|
||||
static void copyback(void);
|
||||
static int isfrom(char *lp);
|
||||
static void usage(void);
|
||||
static int safefile(char *f);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
register int i;
|
||||
int i;
|
||||
char *name;
|
||||
struct passwd *pwent;
|
||||
|
||||
if (!(name = getlogin()) || !*name || !(pwent = getpwnam(name)) ||
|
||||
getuid() != pwent->pw_uid)
|
||||
if (!(name = getlogin()) || !*name || !(pwent = getpwnam(name)) || getuid() != pwent->pw_uid)
|
||||
pwent = getpwuid(getuid());
|
||||
strncpy(my_name, pwent ? pwent->pw_name : "???", sizeof(my_name)-1);
|
||||
strncpy(my_name, pwent ? pwent->pw_name : "???", sizeof(my_name) - 1);
|
||||
if (setjmp(sjbuf))
|
||||
done();
|
||||
for (i=SIGHUP; i<=SIGTERM; i++)
|
||||
for (i = SIGHUP; i <= SIGTERM; i++)
|
||||
setsig(i, delex);
|
||||
i = mkstemp(lettmp);
|
||||
tmpf = fdopen(i, "r+w");
|
||||
@@ -80,38 +98,32 @@ char **argv;
|
||||
unlink(lettmp);
|
||||
if (argv[0][0] == 'r')
|
||||
rmail++;
|
||||
if (argv[0][0] != 'r' && /* no favors for rmail*/
|
||||
(argc == 1 || argv[1][0] == '-' && !any(argv[1][1], "rhd")))
|
||||
if (argv[0][0] != 'r' && /* no favors for rmail*/
|
||||
(argc == 1 || argv[1][0] == '-' && !any(argv[1][1], "rhd")))
|
||||
printmail(argc, argv);
|
||||
else
|
||||
bulkmail(argc, argv);
|
||||
done();
|
||||
}
|
||||
|
||||
setsig(i, f)
|
||||
int i;
|
||||
sig_t f;
|
||||
void setsig(int i, sig_t f)
|
||||
{
|
||||
if (signal(i, SIG_IGN) != SIG_IGN)
|
||||
signal(i, f);
|
||||
}
|
||||
|
||||
any(c, str)
|
||||
register int c;
|
||||
register char *str;
|
||||
int any(int c, char *str)
|
||||
{
|
||||
|
||||
while (*str)
|
||||
if (c == *str++)
|
||||
return(1);
|
||||
return(0);
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
|
||||
printmail(argc, argv)
|
||||
char **argv;
|
||||
void printmail(int argc, char **argv)
|
||||
{
|
||||
int flg, i, j, print;
|
||||
char *p, *getarg();
|
||||
char *p;
|
||||
struct stat statb;
|
||||
|
||||
setuid(getuid());
|
||||
@@ -120,7 +132,6 @@ printmail(argc, argv)
|
||||
if (argv[1][0] != '-')
|
||||
break;
|
||||
switch (argv[1][1]) {
|
||||
|
||||
case 'p':
|
||||
flgp++;
|
||||
/* fall thru... */
|
||||
@@ -151,12 +162,12 @@ printmail(argc, argv)
|
||||
}
|
||||
flock(fileno(malf), LOCK_SH);
|
||||
copymt(malf, tmpf);
|
||||
fclose(malf); /* implicit unlock */
|
||||
fclose(malf); /* implicit unlock */
|
||||
fseek(tmpf, 0L, L_SET);
|
||||
|
||||
changed = 0;
|
||||
print = 1;
|
||||
for (i = 0; i < nlet; ) {
|
||||
for (i = 0; i < nlet;) {
|
||||
j = forward ? i : nlet - i - 1;
|
||||
if (setjmp(sjbuf)) {
|
||||
print = 0;
|
||||
@@ -175,7 +186,6 @@ printmail(argc, argv)
|
||||
if (fgets(resp, LSIZE, stdin) == NULL)
|
||||
break;
|
||||
switch (resp[0]) {
|
||||
|
||||
default:
|
||||
printf("usage\n");
|
||||
case '?':
|
||||
@@ -221,19 +231,18 @@ printmail(argc, argv)
|
||||
if (resp[1] == '\n' || resp[1] == '\0') {
|
||||
p = getenv("HOME");
|
||||
if (p != 0)
|
||||
cat(resp+1, p, "/mbox");
|
||||
cat(resp + 1, p, "/mbox");
|
||||
else
|
||||
cat(resp+1, "", "mbox");
|
||||
cat(resp + 1, "", "mbox");
|
||||
}
|
||||
for (p = resp+1; (p = getarg(lfil, p)) != NULL; ) {
|
||||
for (p = resp + 1; (p = getarg(lfil, p)) != NULL;) {
|
||||
malf = fopen(lfil, "a");
|
||||
if (malf == NULL) {
|
||||
printf("mail: %s: cannot append\n",
|
||||
lfil);
|
||||
printf("mail: %s: cannot append\n", lfil);
|
||||
flg++;
|
||||
continue;
|
||||
}
|
||||
copylet(j, malf, resp[0]=='w'? ZAP: ORDINARY);
|
||||
copylet(j, malf, resp[0] == 'w' ? ZAP : ORDINARY);
|
||||
fclose(malf);
|
||||
}
|
||||
if (flg)
|
||||
@@ -256,7 +265,7 @@ printmail(argc, argv)
|
||||
print = 0;
|
||||
continue;
|
||||
}
|
||||
for (p = resp+1; (p = getarg(lfil, p)) != NULL; )
|
||||
for (p = resp + 1; (p = getarg(lfil, p)) != NULL;)
|
||||
if (!sendmail(j, lfil, my_name))
|
||||
flg++;
|
||||
if (flg)
|
||||
@@ -268,7 +277,7 @@ printmail(argc, argv)
|
||||
}
|
||||
break;
|
||||
case '!':
|
||||
system(resp+1);
|
||||
system(resp + 1);
|
||||
printf("!\n");
|
||||
print = 0;
|
||||
break;
|
||||
@@ -281,15 +290,15 @@ printmail(argc, argv)
|
||||
break;
|
||||
}
|
||||
}
|
||||
donep:
|
||||
donep:
|
||||
if (changed)
|
||||
copyback();
|
||||
}
|
||||
|
||||
/* copy temp or whatever back to /var/mail */
|
||||
copyback()
|
||||
void copyback()
|
||||
{
|
||||
register int i, c;
|
||||
int i, c;
|
||||
sigset_t set;
|
||||
int fd, new = 0;
|
||||
struct stat stbuf;
|
||||
@@ -307,7 +316,7 @@ copyback()
|
||||
if (fd < 0 || malf == NULL)
|
||||
panic("can't rewrite %s", lfil);
|
||||
fstat(fd, &stbuf);
|
||||
if (stbuf.st_size != let[nlet].adr) { /* new mail has arrived */
|
||||
if (stbuf.st_size != let[nlet].adr) { /* new mail has arrived */
|
||||
fseek(malf, let[nlet].adr, L_SET);
|
||||
fseek(tmpf, let[nlet].adr, L_SET);
|
||||
while ((c = getc(malf)) != EOF)
|
||||
@@ -320,15 +329,14 @@ copyback()
|
||||
for (i = 0; i < nlet; i++)
|
||||
if (let[i].change != 'd')
|
||||
copylet(i, malf, ORDINARY);
|
||||
fclose(malf); /* implict unlock */
|
||||
fclose(malf); /* implict unlock */
|
||||
if (new)
|
||||
printf("New mail has arrived.\n");
|
||||
(void)sigprocmask(SIG_UNBLOCK, &set, NULL);
|
||||
}
|
||||
|
||||
/* copy mail (f1) to temp (f2) */
|
||||
copymt(f1, f2)
|
||||
FILE *f1, *f2;
|
||||
void copymt(FILE *f1, FILE *f2)
|
||||
{
|
||||
long nextadr;
|
||||
|
||||
@@ -340,25 +348,23 @@ copymt(f1, f2)
|
||||
nextadr += strlen(line);
|
||||
fputs(line, f2);
|
||||
}
|
||||
let[nlet].adr = nextadr; /* last plus 1 */
|
||||
let[nlet].adr = nextadr; /* last plus 1 */
|
||||
}
|
||||
|
||||
copylet(n, f, type)
|
||||
FILE *f;
|
||||
void copylet(int n, FILE *f, int type)
|
||||
{
|
||||
int ch;
|
||||
long k;
|
||||
char hostname[MAXHOSTNAMELEN];
|
||||
|
||||
fseek(tmpf, let[n].adr, L_SET);
|
||||
k = let[n+1].adr - let[n].adr;
|
||||
k = let[n + 1].adr - let[n].adr;
|
||||
while (k-- > 1 && (ch = getc(tmpf)) != '\n')
|
||||
if (type != ZAP)
|
||||
putc(ch, f);
|
||||
switch (type) {
|
||||
|
||||
case REMOTE:
|
||||
gethostname(hostname, sizeof (hostname));
|
||||
gethostname(hostname, sizeof(hostname));
|
||||
fprintf(f, " remote from %s\n", hostname);
|
||||
break;
|
||||
|
||||
@@ -384,26 +390,24 @@ copylet(n, f, type)
|
||||
putc(getc(tmpf), f);
|
||||
}
|
||||
|
||||
isfrom(lp)
|
||||
register char *lp;
|
||||
int isfrom(char *lp)
|
||||
{
|
||||
register char *p;
|
||||
char *p;
|
||||
|
||||
for (p = from; *p; )
|
||||
for (p = from; *p;)
|
||||
if (*lp++ != *p++)
|
||||
return(0);
|
||||
return(1);
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
|
||||
bulkmail(argc, argv)
|
||||
char **argv;
|
||||
void bulkmail(int argc, char **argv)
|
||||
{
|
||||
char *truename;
|
||||
int first;
|
||||
register char *cp;
|
||||
char *cp;
|
||||
char *newargv[1000];
|
||||
register char **ap;
|
||||
register char **vp;
|
||||
char **ap;
|
||||
char **vp;
|
||||
int dflag;
|
||||
|
||||
dflag = 0;
|
||||
@@ -418,7 +422,7 @@ char **argv;
|
||||
if (!dflag) {
|
||||
/* give it to sendmail, rah rah! */
|
||||
unlink(lettmp);
|
||||
ap = newargv+1;
|
||||
ap = newargv + 1;
|
||||
if (rmail)
|
||||
*ap-- = "-s";
|
||||
*ap = "-sendmail";
|
||||
@@ -514,56 +518,53 @@ char **argv;
|
||||
fclose(tmpf);
|
||||
}
|
||||
|
||||
sendrmt(n, name)
|
||||
char *name;
|
||||
int sendrmt(int n, char *name)
|
||||
{
|
||||
FILE *rmf, *popen();
|
||||
register char *p;
|
||||
char *p;
|
||||
char rsys[64], cmd[64];
|
||||
register pid;
|
||||
int pid;
|
||||
int sts;
|
||||
|
||||
for (p=rsys; *name!='!'; *p++ = *name++)
|
||||
if (*name=='\0')
|
||||
return(0); /* local address, no '!' */
|
||||
for (p = rsys; *name != '!'; *p++ = *name++)
|
||||
if (*name == '\0')
|
||||
return (0); /* local address, no '!' */
|
||||
*p = '\0';
|
||||
if (name[1]=='\0') {
|
||||
if (name[1] == '\0') {
|
||||
printf("null name\n");
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
skip:
|
||||
if ((pid = fork()) == -1) {
|
||||
fprintf(stderr, "mail: can't create proc for remote\n");
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
if (pid) {
|
||||
while (wait(&sts) != pid) {
|
||||
if (wait(&sts)==-1)
|
||||
return(0);
|
||||
if (wait(&sts) == -1)
|
||||
return (0);
|
||||
}
|
||||
return(!sts);
|
||||
return (!sts);
|
||||
}
|
||||
setuid(getuid());
|
||||
if (any('!', name+1))
|
||||
(void)sprintf(cmd, "uux - %s!rmail \\(%s\\)", rsys, name+1);
|
||||
if (any('!', name + 1))
|
||||
(void)sprintf(cmd, "uux - %s!rmail \\(%s\\)", rsys, name + 1);
|
||||
else
|
||||
(void)sprintf(cmd, "uux - %s!rmail %s", rsys, name+1);
|
||||
if ((rmf=popen(cmd, "w")) == NULL)
|
||||
(void)sprintf(cmd, "uux - %s!rmail %s", rsys, name + 1);
|
||||
if ((rmf = popen(cmd, "w")) == NULL)
|
||||
exit(1);
|
||||
copylet(n, rmf, REMOTE);
|
||||
exit(pclose(rmf) != 0);
|
||||
}
|
||||
|
||||
usage()
|
||||
void usage()
|
||||
{
|
||||
fprintf(stderr, "Usage: mail [ -f ] people . . .\n");
|
||||
error = EX_USAGE;
|
||||
done();
|
||||
}
|
||||
|
||||
sendmail(n, name, fromaddr)
|
||||
int n;
|
||||
char *name, *fromaddr;
|
||||
int sendmail(int n, char *name, char *fromaddr)
|
||||
{
|
||||
char file[256];
|
||||
int fd;
|
||||
@@ -571,30 +572,30 @@ sendmail(n, name, fromaddr)
|
||||
char buf[128];
|
||||
off_t oldsize;
|
||||
|
||||
if (*name=='!')
|
||||
if (*name == '!')
|
||||
name++;
|
||||
if (any('!', name))
|
||||
return (sendrmt(n, name));
|
||||
if ((pw = getpwnam(name)) == NULL) {
|
||||
printf("mail: can't send to %s\n", name);
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
cat(file, maildir, name);
|
||||
if (!safefile(file))
|
||||
return(0);
|
||||
return (0);
|
||||
fd = open(file, O_WRONLY | O_CREAT | O_EXLOCK, MAILMODE);
|
||||
if (fd >= 0)
|
||||
malf = fdopen(fd, "a");
|
||||
if (fd < 0 || malf == NULL) {
|
||||
close(fd);
|
||||
printf("mail: %s: cannot append\n", file);
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
fchown(fd, pw->pw_uid, pw->pw_gid);
|
||||
oldsize = ftell(malf);
|
||||
(void)sprintf(buf, "%s@%ld\n", name, oldsize);
|
||||
|
||||
copylet(n, malf, ORDINARY); /* Try to deliver the message */
|
||||
copylet(n, malf, ORDINARY); /* Try to deliver the message */
|
||||
|
||||
/* If there is any error during the delivery of the message,
|
||||
* the mail file may be corrupted (incomplete last line) and
|
||||
@@ -610,13 +611,13 @@ sendmail(n, name, fromaddr)
|
||||
printf("mail: %s: cannot append\n", file);
|
||||
ftruncate(fd, oldsize);
|
||||
fclose(malf);
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
fclose(malf);
|
||||
return(1);
|
||||
return (1);
|
||||
}
|
||||
|
||||
delex(i)
|
||||
void delex(int i)
|
||||
{
|
||||
sigset_t sigt;
|
||||
|
||||
@@ -634,60 +635,56 @@ delex(i)
|
||||
done();
|
||||
}
|
||||
|
||||
done()
|
||||
void done()
|
||||
{
|
||||
unlink(lettmp);
|
||||
exit(error);
|
||||
}
|
||||
|
||||
cat(to, from1, from2)
|
||||
char *to, *from1, *from2;
|
||||
void cat(char *to, char *from1, char *from2)
|
||||
{
|
||||
register char *cp, *dp;
|
||||
char *cp, *dp;
|
||||
|
||||
cp = to;
|
||||
for (dp = from1; *cp = *dp++; cp++)
|
||||
for (dp = from1; (*cp = *dp++); cp++)
|
||||
;
|
||||
for (dp = from2; *cp++ = *dp++; )
|
||||
for (dp = from2; (*cp++ = *dp++);)
|
||||
;
|
||||
}
|
||||
|
||||
/* copy p... into s, update p */
|
||||
char *
|
||||
getarg(s, p)
|
||||
register char *s, *p;
|
||||
char *getarg(char *s, char *p)
|
||||
{
|
||||
while (*p == ' ' || *p == '\t')
|
||||
p++;
|
||||
if (*p == '\n' || *p == '\0')
|
||||
return(NULL);
|
||||
return (NULL);
|
||||
while (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\0')
|
||||
*s++ = *p++;
|
||||
*s = '\0';
|
||||
return(p);
|
||||
return (p);
|
||||
}
|
||||
|
||||
safefile(f)
|
||||
char *f;
|
||||
int safefile(char *f)
|
||||
{
|
||||
struct stat statb;
|
||||
|
||||
if (lstat(f, &statb) < 0)
|
||||
return (1);
|
||||
if (statb.st_nlink != 1 || (statb.st_mode & S_IFMT) == S_IFLNK) {
|
||||
fprintf(stderr,
|
||||
"mail: %s has more than one link or is a symbolic link\n",
|
||||
f);
|
||||
fprintf(stderr, "mail: %s has more than one link or is a symbolic link\n", f);
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
panic(msg, a1, a2, a3)
|
||||
char *msg;
|
||||
void panic(char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, msg);
|
||||
fprintf(stderr, "mail: ");
|
||||
fprintf(stderr, msg, a1, a2, a3);
|
||||
vfprintf(stderr, msg, args);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(args);
|
||||
done();
|
||||
}
|
||||
|
||||
131
src/cmd/ps.c
131
src/cmd/ps.c
@@ -133,11 +133,9 @@ struct psout *outargs; /* info for first npr processes */
|
||||
* know that r(hp|up|mt) are unlikely as are different mem's,
|
||||
* floppy, null, tty, etc.
|
||||
*/
|
||||
void
|
||||
maybetty(cp)
|
||||
register char *cp;
|
||||
void maybetty(char *cp)
|
||||
{
|
||||
register struct ttys *dp;
|
||||
struct ttys *dp;
|
||||
struct stat stb;
|
||||
|
||||
/* Allow only terminal devices. */
|
||||
@@ -167,11 +165,10 @@ maybetty(cp)
|
||||
dp->ttyd = -1;
|
||||
}
|
||||
|
||||
void
|
||||
getdev()
|
||||
void getdev()
|
||||
{
|
||||
register DIR *df;
|
||||
register struct direct *dbuf;
|
||||
DIR *df;
|
||||
struct direct *dbuf;
|
||||
|
||||
if (chdir("/dev") < 0) {
|
||||
perror("/dev");
|
||||
@@ -186,11 +183,10 @@ getdev()
|
||||
closedir(df);
|
||||
}
|
||||
|
||||
char *
|
||||
gettty()
|
||||
char *gettty()
|
||||
{
|
||||
register int tty_step;
|
||||
register char *p;
|
||||
int tty_step;
|
||||
char *p;
|
||||
|
||||
if (u.u_ttyp) {
|
||||
for (tty_step = 0; tty_step < nttys; ++tty_step) {
|
||||
@@ -205,9 +201,7 @@ gettty()
|
||||
return("?");
|
||||
}
|
||||
|
||||
unsigned
|
||||
getptr(adr)
|
||||
off_t adr;
|
||||
unsigned getptr(off_t adr)
|
||||
{
|
||||
unsigned ptr = 0;
|
||||
|
||||
@@ -217,21 +211,16 @@ getptr(adr)
|
||||
return ptr;
|
||||
}
|
||||
|
||||
int
|
||||
getbyte(adr)
|
||||
register char *adr;
|
||||
int getbyte(off_t adr)
|
||||
{
|
||||
char b;
|
||||
|
||||
if (lseek(file, (off_t) adr, 0) == (off_t) -1 || read (file, &b, 1) < 1)
|
||||
if (lseek(file, adr, 0) == (off_t) -1 || read (file, &b, 1) < 1)
|
||||
return(0);
|
||||
return((unsigned) b);
|
||||
}
|
||||
|
||||
int
|
||||
getcmd(a, addr)
|
||||
off_t addr;
|
||||
register struct psout *a;
|
||||
int getcmd(struct psout *a, off_t addr)
|
||||
{
|
||||
/* amount of top of stack to examine for args */
|
||||
#define ARGLIST (DEV_BSIZE * 2)
|
||||
@@ -337,16 +326,14 @@ getcmd(a, addr)
|
||||
* Save command data to outargs[].
|
||||
* Return 1 on success.
|
||||
*/
|
||||
int
|
||||
savcom(puid)
|
||||
int puid;
|
||||
int savcom(int puid)
|
||||
{
|
||||
char *tp;
|
||||
off_t addr;
|
||||
off_t daddr, saddr;
|
||||
register struct psout *a;
|
||||
register struct proc *procp = mproc;
|
||||
register struct user *up = &u;
|
||||
struct psout *a;
|
||||
struct proc *procp = mproc;
|
||||
struct user *up = &u;
|
||||
long txtsiz, datsiz, stksiz;
|
||||
|
||||
if (procp->p_flag & SLOAD) {
|
||||
@@ -409,11 +396,11 @@ savcom(puid)
|
||||
return getcmd(a, saddr);
|
||||
}
|
||||
|
||||
int
|
||||
pscomp(x1, x2)
|
||||
register struct psout *x1, *x2;
|
||||
int pscomp(const void *a1, const void *a2)
|
||||
{
|
||||
register int c;
|
||||
const struct psout *x1 = a1;
|
||||
const struct psout *x2 = a2;
|
||||
int c;
|
||||
|
||||
c = (x1)->o_ttyd - (x2)->o_ttyd;
|
||||
if (c == 0)
|
||||
@@ -424,12 +411,10 @@ pscomp(x1, x2)
|
||||
/*
|
||||
* fixup figures out everybodys name and sorts into a nice order.
|
||||
*/
|
||||
void
|
||||
fixup(np)
|
||||
register int np;
|
||||
void fixup(int np)
|
||||
{
|
||||
register int i;
|
||||
register struct passwd *pw;
|
||||
int i;
|
||||
struct passwd *pw;
|
||||
|
||||
if (uflg) {
|
||||
setpwent();
|
||||
@@ -451,10 +436,11 @@ fixup(np)
|
||||
qsort(outargs, np, sizeof (outargs[0]), pscomp);
|
||||
}
|
||||
|
||||
int
|
||||
wchancomp(x1, x2)
|
||||
register WCHAN *x1, *x2;
|
||||
int wchancomp(const void *a1, const void *a2)
|
||||
{
|
||||
const WCHAN *x1 = a1;
|
||||
const WCHAN *x2 = a2;
|
||||
|
||||
if (x1->caddr > x2->caddr)
|
||||
return(1);
|
||||
else if (x1->caddr == x2->caddr)
|
||||
@@ -463,13 +449,10 @@ wchancomp(x1, x2)
|
||||
return(-1);
|
||||
}
|
||||
|
||||
void
|
||||
addchan(name, caddr)
|
||||
char *name;
|
||||
unsigned caddr;
|
||||
void addchan(char *name, unsigned caddr)
|
||||
{
|
||||
static int left = 0;
|
||||
register WCHAN *wp;
|
||||
WCHAN *wp;
|
||||
|
||||
if (left == 0) {
|
||||
if (wchand) {
|
||||
@@ -493,17 +476,15 @@ addchan(name, caddr)
|
||||
wp->caddr = caddr;
|
||||
}
|
||||
|
||||
char *
|
||||
getchan(chan)
|
||||
register unsigned int chan;
|
||||
char *getchan(caddr_t chan)
|
||||
{
|
||||
register int i;
|
||||
register char *prevsym;
|
||||
int i;
|
||||
char *prevsym;
|
||||
|
||||
prevsym = "";
|
||||
if (chan) {
|
||||
for (i = 0; i < nchans; i++) {
|
||||
if (wchand[i].caddr > chan)
|
||||
if (wchand[i].caddr > (unsigned) chan)
|
||||
return (prevsym);
|
||||
prevsym = wchand[i].cname;
|
||||
}
|
||||
@@ -511,17 +492,13 @@ getchan(chan)
|
||||
return(prevsym);
|
||||
}
|
||||
|
||||
void
|
||||
perrexit(msg)
|
||||
char *msg;
|
||||
void perrexit(char *msg)
|
||||
{
|
||||
perror(msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
openfiles(argc, argv)
|
||||
char **argv;
|
||||
void openfiles(int argc, char **argv)
|
||||
{
|
||||
if (kflg)
|
||||
kmemf = argc > 1 ? argv[1] : _PATH_CORE;
|
||||
@@ -541,10 +518,7 @@ openfiles(argc, argv)
|
||||
perrexit(swapf);
|
||||
}
|
||||
|
||||
void
|
||||
getkvars(argc,argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
void getkvars(int argc, char **argv)
|
||||
{
|
||||
knlist(nl);
|
||||
if (! nflg) {
|
||||
@@ -581,9 +555,7 @@ getkvars(argc,argv)
|
||||
read(kmem, (char *)&hz, sizeof(hz));
|
||||
}
|
||||
|
||||
void
|
||||
ptime(a)
|
||||
struct psout *a;
|
||||
void ptime(struct psout *a)
|
||||
{
|
||||
time_t tm;
|
||||
|
||||
@@ -595,9 +567,7 @@ ptime(a)
|
||||
|
||||
char *uhdr = "USER PID NICE SZ TTY TIME";
|
||||
|
||||
void
|
||||
upr(a)
|
||||
register struct psout *a;
|
||||
void upr(struct psout *a)
|
||||
{
|
||||
printf("%-8.8s%6u%4d%4d %-3.3s",a->o_uname,a->o_pid,a->o_nice,a->o_size,a->o_tty);
|
||||
ptime(a);
|
||||
@@ -605,9 +575,7 @@ upr(a)
|
||||
|
||||
char *shdr = " PID TTY TIME";
|
||||
|
||||
void
|
||||
spr (a)
|
||||
register struct psout *a;
|
||||
void spr(struct psout *a)
|
||||
{
|
||||
printf("%6u %-3.3s",a->o_pid,a->o_tty);
|
||||
ptime(a);
|
||||
@@ -615,9 +583,7 @@ spr (a)
|
||||
|
||||
char *lhdr = " F S UID PID PPID CPU PRI NICE ADDR SZ WCHAN TTY TIME";
|
||||
|
||||
void
|
||||
lpr(a)
|
||||
register struct psout *a;
|
||||
void lpr(struct psout *a)
|
||||
{
|
||||
static char clist[] = "0SWRIZT";
|
||||
|
||||
@@ -636,10 +602,9 @@ lpr(a)
|
||||
ptime(a);
|
||||
}
|
||||
|
||||
void
|
||||
printhdr()
|
||||
void printhdr()
|
||||
{
|
||||
register char *hdr, *cmdstr = " COMMAND";
|
||||
char *hdr, *cmdstr = " COMMAND";
|
||||
|
||||
if (rflg)
|
||||
return;
|
||||
@@ -656,14 +621,12 @@ printhdr()
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
char **argv;
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int uid, euid, puid, nread;
|
||||
register int i, j;
|
||||
int i, j;
|
||||
char *ap;
|
||||
register struct proc *procp;
|
||||
struct proc *procp;
|
||||
|
||||
if ((ioctl(fileno(stdout), TIOCGWINSZ, &ws) != -1 &&
|
||||
ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
|
||||
@@ -803,8 +766,8 @@ main (argc, argv)
|
||||
}
|
||||
fixup(npr);
|
||||
for (i = 0; i < npr; i++) {
|
||||
register int cmdwidth = twidth - cmdstart - 2;
|
||||
register struct psout *a = &outargs[i];
|
||||
int cmdwidth = twidth - cmdstart - 2;
|
||||
struct psout *a = &outargs[i];
|
||||
|
||||
if (rflg) {
|
||||
if (write(1, (char *) a, sizeof (*a)) != sizeof (*a))
|
||||
|
||||
66
src/cmd/su.c
66
src/cmd/su.c
@@ -3,41 +3,39 @@
|
||||
* All rights reserved. The Berkeley software License Agreement
|
||||
* specifies the terms and conditions for redistribution.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <pwd.h>
|
||||
#include <syslog.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <paths.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <grp.h>
|
||||
#include <paths.h>
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <syslog.h>
|
||||
#include <unistd.h>
|
||||
|
||||
char userbuf[64] = "USER=";
|
||||
char homebuf[128] = "HOME=";
|
||||
char shellbuf[128] = "SHELL=";
|
||||
char pathbuf[128] = "PATH=" _PATH_STDPATH;
|
||||
char *cleanenv[] = { userbuf, homebuf, shellbuf, pathbuf, 0, 0 };
|
||||
char *user = "root";
|
||||
char *shell = _PATH_BSHELL;
|
||||
char userbuf[64] = "USER=";
|
||||
char homebuf[128] = "HOME=";
|
||||
char shellbuf[128] = "SHELL=";
|
||||
char pathbuf[128] = "PATH=" _PATH_STDPATH;
|
||||
char *cleanenv[] = { userbuf, homebuf, shellbuf, pathbuf, 0, 0 };
|
||||
char *user = "root";
|
||||
char *shell = _PATH_BSHELL;
|
||||
int fulllogin;
|
||||
int fastlogin;
|
||||
|
||||
extern char **environ;
|
||||
struct passwd *pwd;
|
||||
struct passwd *pwd;
|
||||
|
||||
setenvv(ename, eval, buf)
|
||||
char *ename, *eval, *buf;
|
||||
void setenvv(char *ename, char *eval, char *buf)
|
||||
{
|
||||
register char *cp, *dp;
|
||||
register char **ep = environ;
|
||||
char *cp, *dp;
|
||||
char **ep = environ;
|
||||
|
||||
/*
|
||||
* this assumes an environment variable "ename" already exists
|
||||
*/
|
||||
while (dp = *ep++) {
|
||||
while ((dp = *ep++)) {
|
||||
for (cp = ename; *cp == *dp && *cp; cp++, dp++)
|
||||
continue;
|
||||
if (*cp == 0 && (*dp == '=' || *dp == 0)) {
|
||||
@@ -48,14 +46,12 @@ setenvv(ename, eval, buf)
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
getenvv(ename)
|
||||
char *ename;
|
||||
char *getenvv(char *ename)
|
||||
{
|
||||
register char *cp, *dp;
|
||||
register char **ep = environ;
|
||||
char *cp, *dp;
|
||||
char **ep = environ;
|
||||
|
||||
while (dp = *ep++) {
|
||||
while ((dp = *ep++)) {
|
||||
for (cp = ename; *cp == *dp && *cp; cp++, dp++)
|
||||
continue;
|
||||
if (*cp == 0 && (*dp == '=' || *dp == 0))
|
||||
@@ -64,14 +60,12 @@ getenvv(ename)
|
||||
return ((char *)0);
|
||||
}
|
||||
|
||||
main(argc,argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char *password;
|
||||
char buf[1000];
|
||||
FILE *fp;
|
||||
register char *p;
|
||||
char *p;
|
||||
|
||||
openlog("su", LOG_ODELAY, LOG_AUTH);
|
||||
|
||||
@@ -103,30 +97,28 @@ again:
|
||||
* Only allow those in group zero to su to root.
|
||||
*/
|
||||
if (pwd->pw_uid == 0) {
|
||||
struct group *gr;
|
||||
struct group *gr;
|
||||
int i;
|
||||
|
||||
if ((gr = getgrgid(0)) != NULL) {
|
||||
for (i = 0; gr->gr_mem[i] != NULL; i++)
|
||||
if (strcmp(buf, gr->gr_mem[i]) == 0)
|
||||
goto userok;
|
||||
fprintf(stderr, "You do not have permission to su %s\n",
|
||||
user);
|
||||
fprintf(stderr, "You do not have permission to su %s\n", user);
|
||||
exit(1);
|
||||
}
|
||||
userok:
|
||||
setpriority(PRIO_PROCESS, 0, -2);
|
||||
}
|
||||
|
||||
#define Getlogin() (((p = getlogin()) && *p) ? p : buf)
|
||||
#define Getlogin() (((p = getlogin()) && *p) ? p : buf)
|
||||
if (pwd->pw_passwd[0] == '\0' || getuid() == 0)
|
||||
goto ok;
|
||||
password = getpass("Password:");
|
||||
if (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd)) != 0) {
|
||||
fprintf(stderr, "Sorry\n");
|
||||
if (pwd->pw_uid == 0) {
|
||||
syslog(LOG_CRIT, "BAD SU %s on %s",
|
||||
Getlogin(), ttyname(2));
|
||||
syslog(LOG_CRIT, "BAD SU %s on %s", Getlogin(), ttyname(2));
|
||||
}
|
||||
exit(2);
|
||||
}
|
||||
|
||||
304
src/cmd/vmstat.c
304
src/cmd/vmstat.c
@@ -3,93 +3,98 @@
|
||||
* All rights reserved. The Berkeley software License Agreement
|
||||
* specifies the terms and conditions for redistribution.
|
||||
*/
|
||||
#include <ctype.h>
|
||||
#include <nlist.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <nlist.h>
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/vm.h>
|
||||
#include <sys/dk.h>
|
||||
#include <sys/buf.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include <sys/dir.h>
|
||||
#include <sys/inode.h>
|
||||
#include <sys/dk.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/namei.h>
|
||||
|
||||
#include <machine/machparam.h>
|
||||
#include <sys/vm.h>
|
||||
|
||||
struct nlist nl[] = {
|
||||
#define X_CPTIME 0
|
||||
#define X_CPTIME 0
|
||||
{ "_cp_time" },
|
||||
#define X_RATE 1
|
||||
#define X_RATE 1
|
||||
{ "_rate" },
|
||||
#define X_TOTAL 2
|
||||
#define X_TOTAL 2
|
||||
{ "_total" },
|
||||
#define X_FORKSTAT 3
|
||||
#define X_FORKSTAT 3
|
||||
{ "_forkstat" },
|
||||
#define X_SUM 4
|
||||
#define X_SUM 4
|
||||
{ "_sum" },
|
||||
#define X_BOOTTIME 5
|
||||
#define X_BOOTTIME 5
|
||||
{ "_boottime" },
|
||||
#define X_DKXFER 6
|
||||
#define X_DKXFER 6
|
||||
{ "_dk_xfer" },
|
||||
#define X_HZ 7
|
||||
#define X_HZ 7
|
||||
{ "_hz" },
|
||||
#define X_NCHSTATS 8
|
||||
#define X_NCHSTATS 8
|
||||
{ "_nchstats" },
|
||||
#define X_DK_NDRIVE 9
|
||||
{ "_dk_ndrive" },
|
||||
#define X_DK_NAME 10
|
||||
#define X_DK_NAME 10
|
||||
{ "_dk_name" },
|
||||
#define X_DK_UNIT 11
|
||||
#define X_DK_UNIT 11
|
||||
{ "_dk_unit" },
|
||||
#define X_FREEMEM 12
|
||||
#define X_FREEMEM 12
|
||||
{ "_freemem" },
|
||||
{ "" },
|
||||
};
|
||||
|
||||
char **dk_name;
|
||||
char **dk_name;
|
||||
int *dk_unit;
|
||||
size_t pfree;
|
||||
size_t pfree;
|
||||
int pflag;
|
||||
char **dr_name;
|
||||
char **dr_name;
|
||||
int *dr_select;
|
||||
int dk_ndrive;
|
||||
int ndrives = 0;
|
||||
char *defdrives[] = { "sd0", 0 };
|
||||
double stat1();
|
||||
char *defdrives[] = { "sd0", 0 };
|
||||
double stat1();
|
||||
int hz;
|
||||
|
||||
struct {
|
||||
int busy;
|
||||
long time[CPUSTATES];
|
||||
long *xfer;
|
||||
long time[CPUSTATES];
|
||||
long *xfer;
|
||||
|
||||
struct vmrate Rate;
|
||||
struct vmtotal Total;
|
||||
struct vmsum Sum;
|
||||
struct vmrate Rate;
|
||||
struct vmtotal Total;
|
||||
struct vmsum Sum;
|
||||
|
||||
struct forkstat Forkstat;
|
||||
struct forkstat Forkstat;
|
||||
unsigned rectime;
|
||||
unsigned pgintime;
|
||||
} s, s1, z;
|
||||
#define rate s.Rate
|
||||
#define total s.Total
|
||||
#define sum s.Sum
|
||||
#define forkstat s.Forkstat
|
||||
|
||||
struct vmsum osum;
|
||||
double etime;
|
||||
int mf;
|
||||
time_t now, boottime;
|
||||
#define rate s.Rate
|
||||
#define total s.Total
|
||||
#define sum s.Sum
|
||||
#define forkstat s.Forkstat
|
||||
|
||||
struct vmsum osum;
|
||||
double etime;
|
||||
int mf;
|
||||
time_t now, boottime;
|
||||
int lines = 1;
|
||||
|
||||
void printhdr(sig)
|
||||
int sig;
|
||||
static void dotimes(void);
|
||||
static void doforkst(void);
|
||||
static void dosum(void);
|
||||
static void read_names(void);
|
||||
static void dointr(long nintv);
|
||||
static void stats(int dn);
|
||||
|
||||
void printhdr(int sig)
|
||||
{
|
||||
register int i, j;
|
||||
int i, j;
|
||||
|
||||
if (pflag)
|
||||
printf("-procs- -----memory----- -swap- ");
|
||||
@@ -108,8 +113,7 @@ void printhdr(sig)
|
||||
|
||||
for (i = 0; i < dk_ndrive; i++)
|
||||
if (dr_select[i])
|
||||
printf("%c%c%c ",
|
||||
dr_name[i][0], dr_name[i][1], dr_name[i][2]);
|
||||
printf("%c%c%c ", dr_name[i][0], dr_name[i][1], dr_name[i][2]);
|
||||
printf(" in sy");
|
||||
if (pflag)
|
||||
printf(" tr");
|
||||
@@ -120,65 +124,61 @@ void printhdr(sig)
|
||||
lines = 19;
|
||||
}
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
extern char *ctime();
|
||||
register i;
|
||||
int i;
|
||||
int iter, iflag = 0;
|
||||
long nintv, t;
|
||||
char *arg, **cp, buf[BUFSIZ];
|
||||
|
||||
knlist(nl);
|
||||
if(nl[0].n_value == 0) {
|
||||
if (nl[0].n_value == 0) {
|
||||
fprintf(stderr, "no /vmunix namelist\n");
|
||||
exit(1);
|
||||
}
|
||||
mf = open("/dev/kmem", 0);
|
||||
if(mf < 0) {
|
||||
if (mf < 0) {
|
||||
fprintf(stderr, "cannot open /dev/kmem\n");
|
||||
exit(1);
|
||||
}
|
||||
iter = 0;
|
||||
argc--, argv++;
|
||||
while (argc>0 && argv[0][0]=='-') {
|
||||
while (argc > 0 && argv[0][0] == '-') {
|
||||
char *cp = *argv++;
|
||||
argc--;
|
||||
while (*++cp) switch (*cp) {
|
||||
while (*++cp)
|
||||
switch (*cp) {
|
||||
case 't':
|
||||
dotimes();
|
||||
exit(0);
|
||||
|
||||
case 't':
|
||||
dotimes();
|
||||
exit(0);
|
||||
case 'z':
|
||||
close(mf);
|
||||
mf = open("/dev/kmem", 2);
|
||||
lseek(mf, (long)nl[X_SUM].n_value, L_SET);
|
||||
write(mf, &z.Sum, sizeof z.Sum);
|
||||
exit(0);
|
||||
|
||||
case 'z':
|
||||
close(mf);
|
||||
mf = open("/dev/kmem", 2);
|
||||
lseek(mf, (long)nl[X_SUM].n_value, L_SET);
|
||||
write(mf, &z.Sum, sizeof z.Sum);
|
||||
exit(0);
|
||||
case 'f':
|
||||
doforkst();
|
||||
exit(0);
|
||||
|
||||
case 'f':
|
||||
doforkst();
|
||||
exit(0);
|
||||
case 's':
|
||||
dosum();
|
||||
exit(0);
|
||||
|
||||
case 's':
|
||||
dosum();
|
||||
exit(0);
|
||||
case 'i':
|
||||
iflag++;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
iflag++;
|
||||
break;
|
||||
case 'p':
|
||||
pflag++;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
pflag++;
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,
|
||||
"usage: vmstat [ -fsiptz ] [ interval ] [ count]\n");
|
||||
exit(1);
|
||||
}
|
||||
default:
|
||||
fprintf(stderr, "usage: vmstat [ -fsiptz ] [ interval ] [ count]\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
lseek(mf, (long)nl[X_BOOTTIME].n_value, L_SET);
|
||||
read(mf, &boottime, sizeof boottime);
|
||||
@@ -189,18 +189,18 @@ main(argc, argv)
|
||||
exit(1);
|
||||
}
|
||||
lseek(mf, (long)nl[X_DK_NDRIVE].n_value, L_SET);
|
||||
read(mf, &dk_ndrive, sizeof (dk_ndrive));
|
||||
read(mf, &dk_ndrive, sizeof(dk_ndrive));
|
||||
if (dk_ndrive <= 0) {
|
||||
fprintf(stderr, "dk_ndrive %d\n", dk_ndrive);
|
||||
exit(1);
|
||||
}
|
||||
dr_select = (int *)calloc(dk_ndrive, sizeof (int));
|
||||
dr_name = (char **)calloc(dk_ndrive, sizeof (char *));
|
||||
dk_name = (char **)calloc(dk_ndrive, sizeof (char *));
|
||||
dk_unit = (int *)calloc(dk_ndrive, sizeof (int));
|
||||
#define allocate(e, t) \
|
||||
s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \
|
||||
s1./**/e = (t *)calloc(dk_ndrive, sizeof (t));
|
||||
dr_select = (int *)calloc(dk_ndrive, sizeof(int));
|
||||
dr_name = (char **)calloc(dk_ndrive, sizeof(char *));
|
||||
dk_name = (char **)calloc(dk_ndrive, sizeof(char *));
|
||||
dk_unit = (int *)calloc(dk_ndrive, sizeof(int));
|
||||
#define allocate(e, t) \
|
||||
s./**/ e = (t *)calloc(dk_ndrive, sizeof(t)); \
|
||||
s1./**/ e = (t *)calloc(dk_ndrive, sizeof(t));
|
||||
allocate(xfer, long);
|
||||
for (arg = buf, i = 0; i < dk_ndrive; i++) {
|
||||
dr_name[i] = arg;
|
||||
@@ -210,9 +210,8 @@ main(argc, argv)
|
||||
read_names();
|
||||
time(&now);
|
||||
nintv = now - boottime;
|
||||
if (nintv <= 0 || nintv > 60L*60L*24L*365L*10L) {
|
||||
fprintf(stderr,
|
||||
"Time makes no sense... namelist must be wrong.\n");
|
||||
if (nintv <= 0 || nintv > 60L * 60L * 24L * 365L * 10L) {
|
||||
fprintf(stderr, "Time makes no sense... namelist must be wrong.\n");
|
||||
exit(1);
|
||||
}
|
||||
if (iflag) {
|
||||
@@ -257,11 +256,11 @@ main(argc, argv)
|
||||
signal(SIGCONT, printhdr);
|
||||
loop:
|
||||
if (--lines == 0)
|
||||
printhdr();
|
||||
printhdr(0);
|
||||
lseek(mf, (long)nl[X_CPTIME].n_value, L_SET);
|
||||
read(mf, s.time, sizeof s.time);
|
||||
lseek(mf, (long)nl[X_DKXFER].n_value, L_SET);
|
||||
read(mf, s.xfer, dk_ndrive * sizeof (long));
|
||||
read(mf, s.xfer, dk_ndrive * sizeof(long));
|
||||
|
||||
if (nintv != 1) {
|
||||
lseek(mf, (long)nl[X_SUM].n_value, L_SET);
|
||||
@@ -287,18 +286,18 @@ loop:
|
||||
lseek(mf, (long)nl[X_SUM].n_value, L_SET);
|
||||
read(mf, &sum, sizeof sum);
|
||||
etime = 0;
|
||||
for (i=0; i < dk_ndrive; i++) {
|
||||
for (i = 0; i < dk_ndrive; i++) {
|
||||
t = s.xfer[i];
|
||||
s.xfer[i] -= s1.xfer[i];
|
||||
s1.xfer[i] = t;
|
||||
}
|
||||
for (i=0; i < CPUSTATES; i++) {
|
||||
for (i = 0; i < CPUSTATES; i++) {
|
||||
t = s.time[i];
|
||||
s.time[i] -= s1.time[i];
|
||||
s1.time[i] = t;
|
||||
etime += s.time[i];
|
||||
}
|
||||
if(etime == 0.)
|
||||
if (etime == 0.)
|
||||
etime = 1.;
|
||||
|
||||
printf("%2d%2d%2d", total.t_rq, total.t_dw, total.t_sw);
|
||||
@@ -306,14 +305,13 @@ loop:
|
||||
* We don't use total.t_free because it slops around too much
|
||||
* within this kernel
|
||||
*/
|
||||
printf("%7d", total.t_avm);
|
||||
printf("%7ld", total.t_avm);
|
||||
if (pflag)
|
||||
printf("%4d",
|
||||
total.t_avm ? (total.t_avmtxt * 100) / total.t_avm : 0);
|
||||
printf("%4ld", total.t_avm ? (total.t_avmtxt * 100) / total.t_avm : 0);
|
||||
printf("%6d", pfree);
|
||||
|
||||
if (pflag) {
|
||||
printf("%4d%3d ", rate.v_swpin / nintv, rate.v_swpout / nintv);
|
||||
printf("%4ld%3ld ", rate.v_swpin / nintv, rate.v_swpout / nintv);
|
||||
}
|
||||
|
||||
etime /= (float)hz;
|
||||
@@ -321,14 +319,14 @@ loop:
|
||||
if (dr_select[i])
|
||||
stats(i);
|
||||
}
|
||||
printf("%5d%4d", rate.v_intr/nintv, rate.v_syscall/nintv);
|
||||
printf("%5ld%4ld", rate.v_intr / nintv, rate.v_syscall / nintv);
|
||||
if (pflag)
|
||||
printf("%4d", rate.v_trap / nintv);
|
||||
printf("%4d", rate.v_swtch / nintv);
|
||||
printf("%4ld", rate.v_trap / nintv);
|
||||
printf("%4ld", rate.v_swtch / nintv);
|
||||
|
||||
for(i=0; i<CPUSTATES; i++) {
|
||||
for (i = 0; i < CPUSTATES; i++) {
|
||||
float f = stat1(i);
|
||||
if (! pflag && i == 0) { /* US+NI */
|
||||
if (!pflag && i == 0) { /* US+NI */
|
||||
i++;
|
||||
f += stat1(i);
|
||||
}
|
||||
@@ -337,108 +335,104 @@ loop:
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
nintv = 1;
|
||||
if (--iter &&argc > 0) {
|
||||
if (--iter && argc > 0) {
|
||||
sleep(atoi(argv[0]));
|
||||
goto loop;
|
||||
}
|
||||
}
|
||||
|
||||
dotimes()
|
||||
void dotimes()
|
||||
{
|
||||
printf("page in/out/reclamation is not applicable to 2.11BSD\n");
|
||||
}
|
||||
|
||||
dosum()
|
||||
void dosum()
|
||||
{
|
||||
struct nchstats nchstats;
|
||||
long nchtotal;
|
||||
|
||||
lseek(mf, (long)nl[X_SUM].n_value, L_SET);
|
||||
read(mf, &sum, sizeof sum);
|
||||
printf("%9d swap ins\n", sum.v_swpin);
|
||||
printf("%9d swap outs\n", sum.v_swpout);
|
||||
printf("%9d kbytes swapped in\n", sum.v_kbin);
|
||||
printf("%9d kbytes swapped out\n", sum.v_kbout);
|
||||
printf("%9d cpu context switches\n", sum.v_swtch);
|
||||
printf("%9d device interrupts\n", sum.v_intr);
|
||||
printf("%9d software interrupts\n", sum.v_soft);
|
||||
printf("%9d traps\n", sum.v_trap);
|
||||
printf("%9d system calls\n", sum.v_syscall);
|
||||
#define nz(x) ((x) ? (x) : 1)
|
||||
printf("%9ld swap ins\n", sum.v_swpin);
|
||||
printf("%9ld swap outs\n", sum.v_swpout);
|
||||
printf("%9ld kbytes swapped in\n", sum.v_kbin);
|
||||
printf("%9ld kbytes swapped out\n", sum.v_kbout);
|
||||
printf("%9ld cpu context switches\n", sum.v_swtch);
|
||||
printf("%9ld device interrupts\n", sum.v_intr);
|
||||
printf("%9ld software interrupts\n", sum.v_soft);
|
||||
printf("%9ld traps\n", sum.v_trap);
|
||||
printf("%9ld system calls\n", sum.v_syscall);
|
||||
#define nz(x) ((x) ? (x) : 1)
|
||||
lseek(mf, (long)nl[X_NCHSTATS].n_value, 0);
|
||||
read(mf, &nchstats, sizeof nchstats);
|
||||
nchtotal = nchstats.ncs_goodhits + nchstats.ncs_badhits +
|
||||
nchstats.ncs_falsehits + nchstats.ncs_miss + nchstats.ncs_long;
|
||||
printf("%9d total name lookups", nchtotal);
|
||||
printf(" (cache hits %d%% system %d%% per-process)\n",
|
||||
nchstats.ncs_goodhits * 100 / nz(nchtotal),
|
||||
nchstats.ncs_pass2 * 100 / nz(nchtotal));
|
||||
printf("%9s badhits %d, falsehits %d, toolong %d\n", "",
|
||||
nchstats.ncs_badhits, nchstats.ncs_falsehits, nchstats.ncs_long);
|
||||
nchtotal = nchstats.ncs_goodhits + nchstats.ncs_badhits + nchstats.ncs_falsehits +
|
||||
nchstats.ncs_miss + nchstats.ncs_long;
|
||||
printf("%9ld total name lookups", nchtotal);
|
||||
printf(" (cache hits %ld%% system %ld%% per-process)\n",
|
||||
nchstats.ncs_goodhits * 100 / nz(nchtotal), nchstats.ncs_pass2 * 100 / nz(nchtotal));
|
||||
printf("%9s badhits %ld, falsehits %ld, toolong %ld\n", "", nchstats.ncs_badhits,
|
||||
nchstats.ncs_falsehits, nchstats.ncs_long);
|
||||
}
|
||||
|
||||
doforkst()
|
||||
void doforkst()
|
||||
{
|
||||
lseek(mf, (long)nl[X_FORKSTAT].n_value, L_SET);
|
||||
read(mf, &forkstat, sizeof forkstat);
|
||||
if (forkstat.cntfork != 0)
|
||||
printf("%d forks, %d kbytes, average=%.2f\n",
|
||||
forkstat.cntfork, forkstat.sizfork,
|
||||
(float) forkstat.sizfork / forkstat.cntfork);
|
||||
printf("%ld forks, %ld kbytes, average=%.2f\n", forkstat.cntfork, forkstat.sizfork,
|
||||
(float)forkstat.sizfork / forkstat.cntfork);
|
||||
if (forkstat.cntvfork != 0)
|
||||
printf("%d vforks, %d kbytes, average=%.2f\n",
|
||||
forkstat.cntvfork, forkstat.sizvfork,
|
||||
(float) forkstat.sizvfork / forkstat.cntvfork);
|
||||
printf("%ld vforks, %ld kbytes, average=%.2f\n", forkstat.cntvfork, forkstat.sizvfork,
|
||||
(float)forkstat.sizvfork / forkstat.cntvfork);
|
||||
}
|
||||
|
||||
stats(dn)
|
||||
void stats(int dn)
|
||||
{
|
||||
if (dn >= dk_ndrive) {
|
||||
printf(" 0");
|
||||
return;
|
||||
}
|
||||
printf("%4.0f", s.xfer[dn]/etime);
|
||||
printf("%4.0f", s.xfer[dn] / etime);
|
||||
}
|
||||
|
||||
double
|
||||
stat1(row)
|
||||
double stat1(row)
|
||||
{
|
||||
double t;
|
||||
register i;
|
||||
int i;
|
||||
|
||||
t = 0;
|
||||
for(i=0; i<CPUSTATES; i++)
|
||||
for (i = 0; i < CPUSTATES; i++)
|
||||
t += s.time[i];
|
||||
if(t == 0.)
|
||||
if (t == 0.)
|
||||
t = 1.;
|
||||
return(s.time[row]*100./t);
|
||||
return (s.time[row] * 100. / t);
|
||||
}
|
||||
|
||||
dointr(nintv)
|
||||
long nintv;
|
||||
void dointr(long nintv)
|
||||
{
|
||||
printf("Device interrupt statistics are not applicable to 2.11BSD\n");
|
||||
}
|
||||
|
||||
#define steal(where, var) \
|
||||
lseek(mf, where, L_SET); read(mf, &var, sizeof var);
|
||||
#define steal(where, var) \
|
||||
lseek(mf, where, L_SET); \
|
||||
read(mf, &var, sizeof var);
|
||||
|
||||
/*
|
||||
* Read the drive names out of kmem.
|
||||
*/
|
||||
read_names()
|
||||
void read_names()
|
||||
{
|
||||
char two_char[2];
|
||||
register int i;
|
||||
int i;
|
||||
|
||||
lseek(mf, (long)nl[X_DK_NAME].n_value, L_SET);
|
||||
read(mf, dk_name, dk_ndrive * sizeof (char *));
|
||||
read(mf, dk_name, dk_ndrive * sizeof(char *));
|
||||
lseek(mf, (long)nl[X_DK_UNIT].n_value, L_SET);
|
||||
read(mf, dk_unit, dk_ndrive * sizeof (int));
|
||||
read(mf, dk_unit, dk_ndrive * sizeof(int));
|
||||
|
||||
for(i = 0; dk_name[i]; i++) {
|
||||
for (i = 0; dk_name[i]; i++) {
|
||||
lseek(mf, (long)dk_name[i], L_SET);
|
||||
read(mf, two_char, sizeof two_char);
|
||||
sprintf(dr_name[i], "%c%c%d", two_char[0], two_char[1],
|
||||
dk_unit[i]);
|
||||
sprintf(dr_name[i], "%c%c%d", two_char[0], two_char[1], dk_unit[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,62 +8,55 @@
|
||||
* All rights reserved. The Berkeley software License Agreement
|
||||
* specifies the terms and conditions for redistribution.
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <paths.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <utmp.h>
|
||||
#include <paths.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <sys/time.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <utmp.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define IGNOREUSER "sleeper"
|
||||
#define IGNOREUSER "sleeper"
|
||||
|
||||
char hostname[32];
|
||||
char mesg[3000];
|
||||
int msize,sline;
|
||||
struct utmp *utmp;
|
||||
char who[UT_NAMESIZE + 1] = "???";
|
||||
long clock;
|
||||
char hostname[32];
|
||||
char mesg[3000];
|
||||
int msize, sline;
|
||||
struct utmp *utmp;
|
||||
char who[UT_NAMESIZE + 1] = "???";
|
||||
long clock;
|
||||
struct tm *localclock;
|
||||
|
||||
extern errno;
|
||||
static void sendmes(char *tty);
|
||||
|
||||
main(argc, argv)
|
||||
char *argv[];
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
register int i, c;
|
||||
register struct utmp *p;
|
||||
int i, c;
|
||||
struct utmp *p;
|
||||
int f;
|
||||
struct stat statb;
|
||||
|
||||
(void) gethostname(hostname, sizeof (hostname));
|
||||
(void)gethostname(hostname, sizeof(hostname));
|
||||
if ((f = open(_PATH_UTMP, O_RDONLY, 0)) < 0) {
|
||||
fprintf(stderr, "Cannot open %s\n", _PATH_UTMP);
|
||||
exit(1);
|
||||
}
|
||||
clock = time( 0 );
|
||||
localclock = localtime( &clock );
|
||||
sline = ttyslot(); /* 'utmp' slot no. of sender */
|
||||
(void) fstat(f, &statb);
|
||||
clock = time(0);
|
||||
localclock = localtime(&clock);
|
||||
sline = ttyslot(); /* 'utmp' slot no. of sender */
|
||||
(void)fstat(f, &statb);
|
||||
utmp = (struct utmp *)malloc((unsigned)statb.st_size);
|
||||
c = read(f, (char *)utmp, (int)statb.st_size);
|
||||
(void) close(f);
|
||||
(void)close(f);
|
||||
c /= sizeof(struct utmp);
|
||||
if (sline)
|
||||
strncpy(who, utmp[sline].ut_name, sizeof(utmp[sline].ut_name));
|
||||
sprintf(mesg,
|
||||
"\n\007\007Broadcast Message from %s@%s (%.*s) at %d:%02d ...\r\n\n"
|
||||
, who
|
||||
, hostname
|
||||
, sizeof(utmp[sline].ut_line)
|
||||
, utmp[sline].ut_line
|
||||
, localclock -> tm_hour
|
||||
, localclock -> tm_min
|
||||
);
|
||||
sprintf(mesg, "\n\007\007Broadcast Message from %s@%s (%.*s) at %d:%02d ...\r\n\n", who,
|
||||
hostname, sizeof(utmp[sline].ut_line), utmp[sline].ut_line, localclock->tm_hour,
|
||||
localclock->tm_min);
|
||||
msize = strlen(mesg);
|
||||
if (argc >= 2) {
|
||||
/* take message from unix file instead of standard input */
|
||||
@@ -82,26 +75,24 @@ char *argv[];
|
||||
mesg[msize++] = i;
|
||||
}
|
||||
fclose(stdin);
|
||||
for (i=0; i<c; i++) {
|
||||
for (i = 0; i < c; i++) {
|
||||
p = &utmp[i];
|
||||
if (p->ut_name[0] == 0 ||
|
||||
strncmp(p->ut_name, IGNOREUSER, sizeof(p->ut_name)) == 0)
|
||||
if (p->ut_name[0] == 0 || strncmp(p->ut_name, IGNOREUSER, sizeof(p->ut_name)) == 0)
|
||||
continue;
|
||||
sendmes(p->ut_line);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
sendmes(tty)
|
||||
char *tty;
|
||||
void sendmes(char *tty)
|
||||
{
|
||||
register f, flags;
|
||||
int f, flags;
|
||||
static char t[50] = "/dev/";
|
||||
int e, i;
|
||||
|
||||
strcpy(t + 5, tty);
|
||||
|
||||
if ((f = open(t, O_WRONLY|O_NDELAY)) < 0) {
|
||||
if ((f = open(t, O_WRONLY | O_NDELAY)) < 0) {
|
||||
if (errno != EWOULDBLOCK)
|
||||
perror(t);
|
||||
return;
|
||||
@@ -114,15 +105,15 @@ char *tty;
|
||||
goto oldway;
|
||||
i = write(f, mesg, msize);
|
||||
e = errno;
|
||||
(void) fcntl(f, F_SETFL, flags);
|
||||
(void)fcntl(f, F_SETFL, flags);
|
||||
if (i == msize) {
|
||||
(void) close(f);
|
||||
(void)close(f);
|
||||
return;
|
||||
}
|
||||
if (e != EWOULDBLOCK) {
|
||||
errno = e;
|
||||
perror(t);
|
||||
(void) close(f);
|
||||
(void)close(f);
|
||||
return;
|
||||
}
|
||||
oldway:
|
||||
@@ -132,10 +123,10 @@ oldway:
|
||||
return;
|
||||
}
|
||||
if (i) {
|
||||
(void) close(f);
|
||||
(void)close(f);
|
||||
return;
|
||||
}
|
||||
|
||||
(void) write(f, mesg, msize);
|
||||
(void)write(f, mesg, msize);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
179
src/cmd/write.c
179
src/cmd/write.c
@@ -1,59 +1,87 @@
|
||||
/*
|
||||
* write to another user
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <signal.h>
|
||||
#include <utmp.h>
|
||||
#include <paths.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <paths.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <utmp.h>
|
||||
|
||||
#define NMAX sizeof(ubuf.ut_name)
|
||||
#define LMAX sizeof(ubuf.ut_line)
|
||||
#define NMAX sizeof(ubuf.ut_name)
|
||||
#define LMAX sizeof(ubuf.ut_line)
|
||||
|
||||
struct utmp ubuf;
|
||||
int signum[] = {SIGHUP, SIGINT, SIGQUIT, 0};
|
||||
char me[NMAX + 1] = "???";
|
||||
char *him;
|
||||
char *mytty;
|
||||
char histty[32];
|
||||
char ttybuf[32];
|
||||
char *histtya;
|
||||
struct utmp ubuf;
|
||||
int signum[] = { SIGHUP, SIGINT, SIGQUIT, 0 };
|
||||
char me[NMAX + 1] = "???";
|
||||
char *him;
|
||||
char *mytty;
|
||||
char histty[32];
|
||||
char ttybuf[32];
|
||||
char *histtya;
|
||||
int logcnt;
|
||||
FILE *tf;
|
||||
FILE *tf;
|
||||
|
||||
void timout(sig)
|
||||
int sig;
|
||||
void timout(int sig)
|
||||
{
|
||||
fprintf(stderr, "write: Timeout opening their tty\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void eof(sig)
|
||||
int sig;
|
||||
void eof(int sig)
|
||||
{
|
||||
fprintf(tf, "EOF\r\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
void sigs(sig_t sig)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; signum[i]; i++)
|
||||
signal(signum[i], sig);
|
||||
}
|
||||
|
||||
void ex(char *bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
sigs(SIG_IGN);
|
||||
i = fork();
|
||||
if (i < 0) {
|
||||
printf("Try again\n");
|
||||
goto out;
|
||||
}
|
||||
if (i == 0) {
|
||||
fclose(tf); /* Close his terminal */
|
||||
setgid(getgid()); /* Give up effective group privs */
|
||||
sigs((sig_t)0);
|
||||
execl(getenv("SHELL") ? getenv("SHELL") : "/bin/sh", "sh", "-c", bp + 1, 0);
|
||||
exit(0);
|
||||
}
|
||||
while (wait((int *)NULL) != i)
|
||||
;
|
||||
printf("!\n");
|
||||
out:
|
||||
sigs(eof);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct stat stbuf;
|
||||
register i;
|
||||
register FILE *uf;
|
||||
int i;
|
||||
FILE *uf;
|
||||
int c1, c2;
|
||||
time_t clock = time(0);
|
||||
int suser = getuid() == 0;
|
||||
int nomesg = 0;
|
||||
struct tm *localclock = localtime( &clock );
|
||||
struct tm *localclock = localtime(&clock);
|
||||
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "Usage: write user [ttyname]\n");
|
||||
@@ -77,9 +105,8 @@ main(argc, argv)
|
||||
perror("write: Can't stat your tty");
|
||||
exit(1);
|
||||
}
|
||||
if ((stbuf.st_mode&020) == 0) {
|
||||
fprintf(stderr,
|
||||
"write: You have write permission turned off\n");
|
||||
if ((stbuf.st_mode & 020) == 0) {
|
||||
fprintf(stderr, "write: You have write permission turned off\n");
|
||||
if (!suser)
|
||||
exit(1);
|
||||
}
|
||||
@@ -91,8 +118,8 @@ main(argc, argv)
|
||||
while (fread((char *)&ubuf, sizeof(ubuf), 1, uf) == 1) {
|
||||
if (ubuf.ut_name[0] == '\0')
|
||||
continue;
|
||||
if (strcmp(ubuf.ut_line, mytty)==0) {
|
||||
for (i=0; i<NMAX; i++) {
|
||||
if (strcmp(ubuf.ut_line, mytty) == 0) {
|
||||
for (i = 0; i < NMAX; i++) {
|
||||
c1 = ubuf.ut_name[i];
|
||||
if (c1 == ' ')
|
||||
c1 = 0;
|
||||
@@ -103,7 +130,7 @@ main(argc, argv)
|
||||
}
|
||||
if (him[0] == '-' && him[1] == 0)
|
||||
goto nomat;
|
||||
for (i=0; i<NMAX; i++) {
|
||||
for (i = 0; i < NMAX; i++) {
|
||||
c1 = him[i];
|
||||
c2 = ubuf.ut_name[i];
|
||||
if (c1 == 0)
|
||||
@@ -112,36 +139,30 @@ main(argc, argv)
|
||||
if (c1 != c2)
|
||||
goto nomat;
|
||||
}
|
||||
if (histtya && strncmp(histtya, ubuf.ut_line,
|
||||
sizeof(ubuf.ut_line)))
|
||||
if (histtya && strncmp(histtya, ubuf.ut_line, sizeof(ubuf.ut_line)))
|
||||
continue;
|
||||
logcnt++;
|
||||
if (histty[0]==0 || nomesg && histtya == 0) {
|
||||
if (histty[0] == 0 || nomesg && histtya == 0) {
|
||||
strcpy(ttybuf, "/dev/");
|
||||
strcat(ttybuf, ubuf.ut_line);
|
||||
if (histty[0]==0)
|
||||
if (histty[0] == 0)
|
||||
strcpy(histty, ttybuf);
|
||||
if (access(ttybuf, 0) < 0 || stat(ttybuf, &stbuf) < 0 ||
|
||||
(stbuf.st_mode&020) == 0)
|
||||
if (access(ttybuf, 0) < 0 || stat(ttybuf, &stbuf) < 0 || (stbuf.st_mode & 020) == 0)
|
||||
nomesg++;
|
||||
else {
|
||||
strcpy(histty, ttybuf);
|
||||
nomesg = 0;
|
||||
}
|
||||
}
|
||||
nomat:
|
||||
;
|
||||
nomat:;
|
||||
}
|
||||
fclose(uf);
|
||||
if (logcnt==0) {
|
||||
fprintf(stderr, "write: %s not logged in%s\n", him,
|
||||
histtya ? " on that tty" : "");
|
||||
if (logcnt == 0) {
|
||||
fprintf(stderr, "write: %s not logged in%s\n", him, histtya ? " on that tty" : "");
|
||||
exit(1);
|
||||
}
|
||||
if (histtya==0 && logcnt > 1) {
|
||||
fprintf(stderr,
|
||||
"write: %s logged in more than once ... writing to %s\n",
|
||||
him, histty+5);
|
||||
if (histtya == 0 && logcnt > 1) {
|
||||
fprintf(stderr, "write: %s logged in more than once ... writing to %s\n", him, histty + 5);
|
||||
}
|
||||
cont:
|
||||
if (access(histty, 0) < 0) {
|
||||
@@ -156,19 +177,20 @@ cont:
|
||||
}
|
||||
alarm(0);
|
||||
sigs(eof);
|
||||
{ char hostname[32];
|
||||
gethostname(hostname, sizeof (hostname));
|
||||
fprintf(tf,
|
||||
"\r\nMessage from %s@%s on %s at %d:%02d ...\r\n\007\007\007",
|
||||
me, hostname, mytty, localclock->tm_hour, localclock->tm_min);
|
||||
fflush(tf);
|
||||
{
|
||||
char hostname[32];
|
||||
gethostname(hostname, sizeof(hostname));
|
||||
fprintf(tf, "\r\nMessage from %s@%s on %s at %d:%02d ...\r\n\007\007\007", me, hostname,
|
||||
mytty, localclock->tm_hour, localclock->tm_min);
|
||||
fflush(tf);
|
||||
}
|
||||
for (;;) {
|
||||
char buf[BUFSIZ];
|
||||
register char *bp;
|
||||
char *bp;
|
||||
|
||||
i = read(0, buf, sizeof buf);
|
||||
if (i <= 0)
|
||||
eof();
|
||||
eof(0);
|
||||
if (buf[0] == '!') {
|
||||
buf[i] = 0;
|
||||
ex(buf);
|
||||
@@ -184,8 +206,7 @@ cont:
|
||||
*bp = toascii(*bp);
|
||||
}
|
||||
|
||||
if (isprint(*bp) ||
|
||||
*bp == ' ' || *bp == '\t' || *bp == '\n') {
|
||||
if (isprint(*bp) || *bp == ' ' || *bp == '\t' || *bp == '\n') {
|
||||
putc(*bp, tf);
|
||||
} else {
|
||||
putc('^', tf);
|
||||
@@ -196,45 +217,9 @@ cont:
|
||||
fflush(tf);
|
||||
|
||||
if (ferror(tf) || feof(tf)) {
|
||||
printf("\n\007Write failed (%s logged out?)\n",
|
||||
him);
|
||||
printf("\n\007Write failed (%s logged out?)\n", him);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ex(bp)
|
||||
char *bp;
|
||||
{
|
||||
register i;
|
||||
|
||||
sigs(SIG_IGN);
|
||||
i = fork();
|
||||
if (i < 0) {
|
||||
printf("Try again\n");
|
||||
goto out;
|
||||
}
|
||||
if (i == 0) {
|
||||
fclose(tf); /* Close his terminal */
|
||||
setgid(getgid()); /* Give up effective group privs */
|
||||
sigs((sig_t) 0);
|
||||
execl(getenv("SHELL") ?
|
||||
getenv("SHELL") : "/bin/sh", "sh", "-c", bp+1, 0);
|
||||
exit(0);
|
||||
}
|
||||
while (wait((int *)NULL) != i)
|
||||
;
|
||||
printf("!\n");
|
||||
out:
|
||||
sigs(eof);
|
||||
}
|
||||
|
||||
sigs(sig)
|
||||
sig_t sig;
|
||||
{
|
||||
register i;
|
||||
|
||||
for (i=0; signum[i]; i++)
|
||||
signal(signum[i], sig);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user