int Stattype
[] = {0, 0, 0, 0,
SS_NODEVICE
, SS_FAIL
, SS_FAIL
, SS_BADSEQ
* cico - this program is used to place a call to a
* remote machine, login, and copy files between the two machines.
char wkpre
[NAMESIZE
], file
[NAMESIZE
];
char msg
[BUFSIZ
], *p
, *q
;
extern onintr(), timeout();
signal(SIGILL
, intrEXIT
);
signal(SIGTRAP
, intrEXIT
);
signal(SIGIOT
, intrEXIT
);
signal(SIGEMT
, intrEXIT
);
signal(SIGFPE
, intrEXIT
);
signal(SIGBUS
, intrEXIT
);
signal(SIGSEGV
, intrEXIT
);
signal(SIGSYS
, intrEXIT
);
signal(SIGQUIT
, intrQUIT
);
signal(SIGTERM
, intrTERM
);
ret
= guinfo(getuid(), User
, msg
);
ASSERT(ret
== 0, "BAD UID ret %d", ret
);
while(argc
>1 && argv
[1][0] == '-'){
* Errorrate = atoi(&argv[1][2]);
* strcat(rflags, " -g ");
Role
= atoi(&argv
[1][2]);
sprintf(Rmtname
, "%.7s", &argv
[1][2]);
Debug
= atoi(&argv
[1][2]);
printf("unknown flag %s\n", argv
[1]);
ret
= ioctl(0, TIOCGETP
, &Savettyb
);
Savettyb
.sg_flags
|= ECHO
;
Savettyb
.sg_flags
&= ~RAW
;
signal(SIGALRM
, timeout
);
ret
= ioctl(0, TIOCSETP
, &Savettyb
);
ret
= ioctl(0, TIOCSETP
, &Savettyb
);
DEBUG(4, "msg-%s,", msg
);
sprintf(Rmtname
, "%.7s", q
);
DEBUG(4, "sys-%s\n", Rmtname
);
else if (callback(Loginuser
)) {
DEBUG(4, "CALLBACK Role %d\n", Role
);
logent("CALLBACK", "REQUIRED");
/* set up for call back */
systat(Rmtname
, SS_CALLBACK
, "CALL BACK");
gename(CMDPRE
, Rmtname
, 'C', file
);
close(creat(file
, 0666));
if (callok(Rmtname
) == SS_BADSEQ
) {
logent("BADSEQ", "PREVIOUS");
omsg('R', "BADSEQ", Ofn
);
if ((ret
= gnxseq(Rmtname
)) == seq
) {
systat(Rmtname
, Stattype
[7], Stattext
[7]);
logent("BAD SEQ", "HANDSHAKE FAILED");
omsg('R', "BADSEQ", Ofn
);
ret
= gnsys(Rmtname
, Spool
, CMDPRE
);
else if (Role
== MASTER
&& callok(Rmtname
) != 0) {
logent("SYSTEM STATUS", "CAN NOT CALL");
sprintf(wkpre
, "%c.%.7s", CMDPRE
, Rmtname
);
signal(SIGQUIT
, SIG_IGN
);
if (!iswrk(file
, "chk", Spool
, wkpre
) && !onesys
) {
logent(Rmtname
, "NO WORK");
if (Ifn
!= -1 && Role
== MASTER
) {
write(Ofn
, EOTMSG
, strlen(EOTMSG
));
sprintf(msg
, "call to %s ", Rmtname
);
if (mlock(Rmtname
) != 0) {
Ofn
= Ifn
= conn(Rmtname
);
systat(Rmtname
, Stattype
[-Ofn
],
logent(msg
, "SUCCEEDED");
signal(SIGALRM
, timeout
);
sprintf(msg
, "%.7s -Q%d %s", Myname
, seq
, rflags
);
DEBUG(4, "msg-%s\n", msg
);
logent("BAD SEQ", "HANDSHAKE FAILED");
systat(Rmtname
, Stattype
[7], Stattext
[7]);
if (strcmp(&msg
[1], "OK") != SAME
) {
logent(&msg
[1], "HANDSHAKE FAILED");
DEBUG(1, " Rmtname %s, ", Rmtname
);
DEBUG(1, "my Role %s, ", Role
? "MASTER" : "SLAVE");
DEBUG(1, "Spool - %s\n", Spool
);
DEBUG(1, "Ifn - %d, ", Ifn
);
DEBUG(1, "Ofn - %d, ", Ofn
);
DEBUG(1, "Loginuser - %s\n", Loginuser
);
logent("startup", "FAILED");
systat(Rmtname
, SS_FAIL
, "STARTUP");
systat(Rmtname
, SS_INPROGRESS
, "TALKING");
ret
= cntrl(Role
, wkpre
);
DEBUG(1, "ret from cntrl - %d\n", ret
);
signal(SIGALRM
, timeout
);
systat(Rmtname
, SS_FAIL
, "CONVERSATION");
DEBUG(4, "send OO %d,", ret
);
int Hupvec
[] = {0, 0, 1};
* cleanup(code) cleanup and exit with "code" status
ret
= ioctl(0, TIOCSETP
, &Savettyb
);
DEBUG(4, "\nIfn - %d, ", Ifn
);
DEBUG(4, "ret ioctl - %d\n", ret
);
DEBUG(4, "tty.flags %o,", Savettyb
.sg_flags
);
DEBUG(4, "tty.ispeed %d, ", Savettyb
.sg_ispeed
);
DEBUG(4, "tty.ospeed %d, ", Savettyb
.sg_ospeed
);
ret
= ioctl(0, TIOCSETP
, Hupvec
);
DEBUG(4, "ret ioctl - %d\n", ret
);
write(Ofn
, EOTMSG
, strlen(EOTMSG
));
DEBUG(1, "exit code %d\n", code
);
* onintr(inter) interrupt - remove locks and exit
sprintf(str
, "SIGNAL %d", inter
);
intrINT() { onintr(SIGINT
);}
intrHUP() { onintr(SIGHUP
);}
intrQUIT() { onintr(SIGQUIT
);}
intrTERM() { onintr(SIGTERM
);}
* fixmode(tty) fix kill/echo/raw on line
ioctl(tty
, TIOCGETP
, &ttbuf
);
ttbuf
.sg_flags
|= (ANYP
| RAW
);
ttbuf
.sg_flags
&= ~(ECHO
| ALLDELAY
);
ret
= ioctl(tty
, TIOCSETP
, &ttbuf
);
ASSERT(ret
>= 0, "RETURN FROM STTY %d", ret
);
* timeout() catch SIGALRM routine