📄 scrapit.c
字号:
#include "scrapi.h"#include <netdb.h>#include <stdio.h>#include <unistd.h>#include <strings.h>#ifndef TRUE#define TRUE (0 == 0)#endif /* TRUE */#ifndef FALSE#define FALSE (0 != 0)#endif /* FALSE */#define SYS_ERROR (-1)#define FAILED(x) ((x) == SYS_ERROR)#define SAP(x) ((struct sockaddr *) (x))#define ARRAYSIZE(x,type) (sizeof(x) / sizeof(type))#define MAXARGS 10#define MAXTOKEN 128#define MAXLINE (MAXARGS * MAXTOKEN)struct cmdinfo { char *command; void (*function)(int,char *[]); int argc;};typedef struct cmdinfo cmdinfo;static char *program;staticintparse_address(char *str,struct sockaddr *s,int family){ char *cp; unsigned short port; cp = index(str,'/'); if (cp != NULL) { if (sscanf(cp + 1,"%hu",&port) != 1) return(FALSE); *cp = '\0'; if (!scrapi_sockaddr_parse(s,str,htons(port))) return(FALSE); } else { if (sscanf(str,"%hu",&port) != 1) return(FALSE); scrapi_sockaddr_any(s,family); scrapi_sockaddr_set_port(s,htons(port)); } return(TRUE);}staticintparse_flow(char *argv[],struct sockaddr *dst,int *proto, struct sockaddr *src){ struct protoent *pe; if (!parse_address(argv[1],dst,AF_INET)) { fprintf(stderr,"%s: Bad destination parameter\n",program); return(FALSE); } pe = getprotobyname(argv[2]); if (pe == NULL) { if (sscanf(argv[2],"%d",proto) != 1) { fprintf(stderr,"%s: Bad protocol parameter\n", program); return(FALSE); } } else *proto = pe->p_proto; if (!parse_address(argv[3],src,dst->sa_family)) { fprintf(stderr,"%s: Bad source parameter\n",program); return(FALSE); } return(TRUE);}staticvoidhelp(int argc,char *argv[]){ printf("Commands:\n"); printf(" close destination protocol source\n"); printf(" help\n"); printf(" quit\n"); printf(" receiver destination protocol source reservation service style\n"); printf(" sender destination protocol source bw ttl\n"); printf(" status destination protocol source\n");#ifdef ISI_TEST printf(" translation form\n");#endif ISI_TEST printf("Parameters:\n"); printf(" destination or source ::= <address/port> | <port> | <0>\n"); printf(" protocol ::= <name> | <number>\n"); printf(" reservation ::= <on> | <off>\n"); printf(" service ::= <cl> | <gs>\n"); printf(" style ::= <shared> | <distinct>\n"); printf(" bw ::= <number>\n"); printf(" ttl ::= <number>\n");#ifdef ISI_TEST printf(" form ::= <fl> | <gpi> | <none>\n");#endif ISI_TEST}staticvoidquit(int argc,char *argv[]){ scrapi_close(NULL,0,0); exit(0);}staticvoidclose_flow(int argc,char *argv[]){ struct SOCKADDR dst,src; int proto; if (!parse_flow(argv,SAP(&dst),&proto,SAP(&src))) return; if (scrapi_close(SAP(&dst),proto,SAP(&src))) return; scrapi_perror(SAP(&dst),proto,SAP(&src),program);}staticvoidsender(int argc,char *argv[]){ struct SOCKADDR dst,src; int proto,ttl; double bw; if (!parse_flow(argv,SAP(&dst),&proto,SAP(&src))) return; if (sscanf(argv[4],"%lg",&bw) != 1) { fprintf(stderr,"%s: Bad bandwidth parameter\n",program); return; } if (sscanf(argv[5],"%d",&ttl) != 1) { fprintf(stderr,"%s: Bad ttl parameter\n",program); return; } if (scrapi_sender(SAP(&dst),proto,SAP(&src),bw,ttl,0)) return; scrapi_perror(SAP(&dst),proto,SAP(&src),program);}staticvoidreceiver(int argc,char *argv[]){ struct SOCKADDR dst,src; int proto,reserve; scrapi_service service; scrapi_style style; if (!parse_flow(argv,SAP(&dst),&proto,SAP(&src))) return; if (strcmp(argv[4],"on") == 0) reserve = TRUE; else if (strcmp(argv[4],"off") == 0) reserve = FALSE; else { fprintf(stderr,"%s: Bad reserve parameter\n",program); return; } if (strcmp(argv[5],"cl") == 0) service = scrapi_service_cl; else if (strcmp(argv[5],"gs") == 0) service = scrapi_service_gs; else { fprintf(stderr,"%s: Bad service parameter\n",program); return; } if (strcmp(argv[6],"shared") == 0) style = scrapi_style_shared; else if (strcmp(argv[6],"distinct") == 0) style = scrapi_style_distinct; else { fprintf(stderr,"%s: Bad style parameter\n",program); return; } if (scrapi_receiver(SAP(&dst),proto,SAP(&src), reserve,service,style,0)) return; scrapi_perror(SAP(&dst),proto,SAP(&src),program);}staticvoidstatus(int argc,char *argv[]){ struct SOCKADDR dst,src; int proto; if (!parse_flow(argv,SAP(&dst),&proto,SAP(&src))) return; switch (scrapi_get_status(SAP(&dst),proto,SAP(&src))) { case scrapi_status_red: printf("status is red\n"); break; case scrapi_status_yellow: printf("status is yellow\n"); break; case scrapi_status_green: printf("status is green\n"); break; }}#ifdef ISI_TESTstaticvoidtranslation(int argc,char *argv[]){ extern void scrapi_internal_use_flow_labels(int); extern void scrapi_internal_use_gpi(int); if (strcmp(argv[1],"fl") == 0) { scrapi_internal_use_flow_labels(TRUE); scrapi_internal_use_gpi(FALSE); } else if (strcmp(argv[1],"gpi") == 0) { scrapi_internal_use_flow_labels(FALSE); scrapi_internal_use_gpi(TRUE); } else if (strcmp(argv[1],"none") == 0) { scrapi_internal_use_flow_labels(FALSE); scrapi_internal_use_gpi(FALSE); } else fprintf(stderr,"%s: Bad translation parameter\n",program);}#endif ISI_TESTstaticcmdinfo table[]= { { "close", close_flow, 4 }, { "help", help, 1 }, { "quit", quit, 1 }, { "receiver", receiver, 7 }, { "sender", sender, 6 }, { "status", status, 4 },#ifdef ISI_TEST { "translation", translation, 2 },#endif ISI_TEST};staticvoidprompt(){ printf("%s> ",program); fflush(stdout);}intmain(int argc,char *argv[]){ int i,n,found,nargc; fd_set set; cmdinfo *c; char *cp,buffer[MAXLINE],args[MAXARGS][MAXTOKEN],*nargv[MAXARGS]; cp = rindex(argv[0],'/'); if (cp == NULL) program = argv[0]; else program = cp + 1; if (!scrapi_dispatch()) { fprintf(stderr,"%s: No RSVP daemon\n",program); quit(0,NULL); } scrapi_debug(stdout); prompt(); for (i = 0;i < MAXARGS; i++) nargv[i] = args[i]; while (TRUE) { scrapi_poll_list(&set); FD_SET(fileno(stdin),&set); n = select(FD_SETSIZE,&set,NULL,NULL,NULL); if (FAILED(n)) quit(0,NULL); scrapi_dispatch(); if (!FD_ISSET(fileno(stdin),&set)) continue; if (fgets(buffer,MAXLINE,stdin) == NULL) quit(0,NULL); nargc = sscanf(buffer,"%s %s %s %s %s %s %s %s %s %s", nargv[0],nargv[1],nargv[2],nargv[3],nargv[4], nargv[5],nargv[6],nargv[7],nargv[8],nargv[9]); if (FAILED(nargc)) { prompt(); continue; } found = FALSE; for (i = 0;i < ARRAYSIZE(table,cmdinfo); i++) { c = &table[i]; if (strcmp(nargv[0],c->command) == 0) { found = TRUE; if (nargc == c->argc) { (*c->function)(nargc,nargv); break; } } } if (i == ARRAYSIZE(table,cmdinfo)) { if (found) fprintf(stderr, "%s: Wrong number of parameters\n", program); else fprintf(stderr,"%s: Unknown command\n", program); } prompt(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -