📄 proto.c
字号:
/* proto.c Copyright Michael Temari 08/01/1996 All Rights Reserved */#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <net/hton.h>#include <net/gen/socket.h>#include <net/gen/in.h>#include <net/gen/inet.h>#include <net/gen/tcp.h>#include <net/gen/udp.h>#include "talk.h"#include "proto.h"#include "net.h"#include "screen.h"_PROTOTYPE(static int TalkChk, (int gotreply, struct talk_reply *reply, char *msg));_PROTOTYPE(static int TalkTrans, (int type, long id, struct talk_reply *reply, int here));static char *AnswerMsgs[] = { "Success", "User Not Logged In", "Failure", "Remote Does Not Know who we are", "User is not accepting calls", "Are request was not know", "Incorrect Version", "Bad Address", "Bad Control Address"};static int TalkChk(gotreply, reply, msg)int gotreply;struct talk_reply *reply;char *msg;{ if(!gotreply) { ScreenMsg(msg); return(-1); } if(reply->answer == SUCCESS) return(0); if(reply->answer < (sizeof(AnswerMsgs) / sizeof(AnswerMsgs[0]))) ScreenMsg(AnswerMsgs[reply->answer]); else ScreenMsg("Bad Answer"); return(-1);}static int TalkTrans(type, id, reply, here)int type;long id;struct talk_reply *reply;int here;{struct talk_request request;int tries;int gotreply; memset(&request, 0, sizeof(request)); request.version = TALK_VERSION; request.type = type; request.id = id; request.addr.sa_family = htons(AF_INET); request.addr.sin_port = dataport; request.addr.sin_addr = laddr; request.ctl_addr.sa_family = htons(AF_INET); request.ctl_addr.sin_port = ctlport; request.ctl_addr.sin_addr = laddr; request.pid = getpid(); strncpy(request.luser, luser, USER_SIZE); strncpy(request.ruser, ruser, USER_SIZE); strncpy(request.rtty, rtty, TTY_SIZE); tries = 0; gotreply = 0; while(!ScreenDone && tries++ < 3 && !gotreply) { if(!sendrequest(&request, here)) if(!getreply(reply, 5)) gotreply = 1; if(!gotreply) continue; if(reply->version != request.version || reply->type != request.type) gotreply = 0; } return(gotreply);}int TalkInit(){struct talk_reply reply;long id = 0;long rid;int s;int ring;char buff[32]; /* Check if someone was calling us */ ScreenMsg("Initiating Talk Protocol"); /* Check is someone was calling us */ s = TalkTrans(LOOK_UP, ++id, &reply, 0); /* Someone was calling us */ if(s && reply.answer == SUCCESS) { s = NetConnect(reply.addr.sin_port); if(s == 1) { ScreenMsg("Your party has hung up"); TalkTrans(DELETE, reply.id, &reply, 0); } return(s == 0 ? 0 : -1); } ScreenMsg("Ringing User"); ring = 0; while(!ScreenDone && ring++ < 5) { if(TalkChk(TalkTrans(ANNOUNCE, -1, &reply, 0), &reply, "No response to are ring")) return(-1); rid = reply.id; sprintf(buff, "Ring #%d", ring); ScreenMsg(buff); if(ring == 1) { if(TalkChk(TalkTrans(LEAVE_INVITE, ++id, &reply, 1), &reply, "Could not leave are invitaion locally")) return(-1); } s = NetListen(RING_WAIT); if(s <= 0) { TalkTrans(DELETE, reply.id, &reply, 1); TalkTrans(DELETE, rid, &reply, 0); return(s); } } return(-1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -