[insert project logo here (125x200px max)] Navigator Mailinglists Please report any errors or ommissions you find to our `Help' mailinglist, or post a message in the Forums. Copyright and Licensing Information Snap is (c) Jonathan T. Moore, 1999-2002 and licensed under the GNU General Public License (GPL). All other parts of Splash are (c) Willem de Bruijn, 2002-2003 and licensed under the BSD Open Source License. All sourcecode is made publicly available. Acknowledgement Splash and the Splash website are hosted by SourceForge.net |
Splash - DocumentationSNMP Plus a Lightweight API for SNAP Handlingsnap-1.1-wjdb/src/snap_exec.cGo to the documentation of this file.00001 /* 00002 * snap_sendandreceive.c : SNAP user-space node daemon. 00003 * Sends a package and waits for a return packet 00004 * It prints the stack output of the return packet 00005 * 00006 * $Id: snap_exec.c,v 1.1 2003/04/02 17:01:15 wdebruij Exp $ 00007 */ 00008 00009 #include <time.h> 00010 #include <sys/time.h> 00011 #include "../lib/libsnap.h" 00012 #include <arpa/inet.h> 00013 #include <assert.h> 00014 #include <fcntl.h> 00015 #include <netinet/ip.h> 00016 #include <netdb.h> 00017 #include <netinet/in.h> 00018 #include <unistd.h> 00019 #include <stdio.h> 00020 #include <string.h> 00021 #include <sys/socket.h> 00022 #include <sys/un.h> 00023 #include <sys/stat.h> 00024 #include <sys/types.h> 00025 #include "../lib/snap.h" 00026 #include "../lib/bytecode.h" 00027 #include "../lib/packet.h" 00028 #include "../lib/d_printf.h" 00029 #include "../lib/memalloc.h" 00030 #include "../lib/io.h" 00031 #include <pthread.h> 00032 00033 #include "snap_demux_handler.h" 00034 00035 #define NIPQUAD(addr) \ 00036 ((unsigned char *)&addr)[0], \ 00037 ((unsigned char *)&addr)[1], \ 00038 ((unsigned char *)&addr)[2], \ 00039 ((unsigned char *)&addr)[3] 00040 00041 #define IPPROTO_SNAP 130 00042 00043 /* settable options */ 00044 unsigned char out_ttl = 32; 00045 short int receiveport = 7777; 00046 struct sockaddr_in destaddr; 00047 struct sockaddr_in srcaddr; 00048 struct sockaddr_in localaddr; 00049 00050 extern char *basename(const char *); 00051 void parse_cmdline(int argc,char **argv); 00052 00053 int infd; 00054 buffer_t inbuf; 00055 int sd; 00056 00057 int compare_longints(const void* a, const void* b){ 00058 const long int *da = (const long int *) a; 00059 const long int *db = (const long int *) b; 00060 00061 return (*da > *db) - (*da < *db); 00062 } 00063 00064 int init_request(int argc,char **argv) { 00065 int packet_lenb; 00066 struct snaphdr *hdr; 00067 char ra_space[4]; 00068 00069 parse_cmdline(argc,argv); 00070 00071 /* first suck in the binary packet */ 00072 packet_lenb = file_to_str(infd,&inbuf); 00073 if (packet_lenb < inbuf.lenb) 00074 inbuf.lenb = packet_lenb; 00075 d_printf(100,"snap_exec : read in %d bytes\n",inbuf.lenb); 00076 00077 /* touch up certain SNAP header entries */ 00078 hdr = (struct snaphdr *)inbuf.s; 00079 hdr->saddr = srcaddr.sin_addr.s_addr; 00080 hdr->daddr = destaddr.sin_addr.s_addr; 00081 hdr->version = 1; 00082 hdr->flags = 0; 00083 hdr->sport = htons(receiveport); 00084 00085 /* open up raw socket */ 00086 if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_SNAP)) < 0) { 00087 perror("snap_exec : inject failed :socket error"); 00088 exit(1); 00089 } 00090 00091 /* set socket options : first, router alert */ 00092 bzero(ra_space,4); 00093 ra_space[IPOPT_OPTVAL] = IPOPT_RA; 00094 ra_space[IPOPT_OLEN] = 4; 00095 if (setsockopt(sd, IPPROTO_IP, IP_OPTIONS, ra_space, 00096 sizeof(ra_space)) < 0) { 00097 perror("snap_exec : setsockopt: router alert"); 00098 exit(1); 00099 } 00100 00101 /* now set resource bound as requested */ 00102 if (setsockopt(sd, IPPROTO_IP, IP_TTL, 00103 (char *)&out_ttl, sizeof(out_ttl)) < 0) { 00104 perror("snap_exec : setsockopt: ttl"); 00105 exit(1); 00106 } 00107 00108 return(0); 00109 } 00110 00111 void sendpkt(){ 00112 /* send to the local interpreter */ 00113 /* replace localaddr with destaddr in the sendto(..) to send directly */ 00114 localaddr.sin_addr.s_addr = htonl( (127 << 24) + 1 ); /* == 127.0.0.1 */ 00115 localaddr.sin_family = AF_INET; 00116 00117 if (sendto(sd, inbuf.s, inbuf.lenb, 0, (struct sockaddr *)&localaddr, 00118 sizeof(localaddr)) < 0) { 00119 perror("snap_exec : sendto error "); 00120 } 00121 } 00122 00123 void usage(int argc, char **argv) { 00124 printf("usage: %s [-?] [-t ttl] [-p receiveport] src dest infile\n",basename(argv[0])); 00125 printf("\t-t : set the outgoing TTL (resource bound) (default=16)\n"); 00126 printf("\t-p : set the source port number (default=7777)\n"); 00127 printf("\t-? : print this help\n"); 00128 } 00129 00130 void parse_cmdline(int argc, char **argv) { 00131 char *opts = "?t:p:"; 00132 char c; 00133 int args_expected = 3; 00134 int args_processed = 0; 00135 int argidx; 00136 char *infilename; 00137 00138 while((c = getopt(argc,argv,opts)) != EOF) { 00139 switch(c) { 00140 case '?': 00141 usage(argc,argv); 00142 exit(1); 00143 case 't': 00144 out_ttl = atoi(optarg); 00145 if (out_ttl <= 0) { 00146 fprintf(stderr,"%s: invalid TTL: %d\n",basename(argv[0]),out_ttl); 00147 fflush(stderr); 00148 usage(argc,argv); 00149 exit(1); 00150 } 00151 fprintf(stderr,"%s: setting TTL to %d\n",basename(argv[0]),out_ttl); 00152 break; 00153 case 'p': 00154 receiveport = atoi(optarg); 00155 if (receiveport <= 0) { 00156 fprintf(stderr,"%s: invalid source port: %d\n", 00157 basename(argv[0]),receiveport); 00158 fflush(stderr); 00159 usage(argc,argv); 00160 exit(1); 00161 } 00162 break; 00163 default: 00164 fprintf(stderr,"%s: unrecognized option -%c\n", 00165 basename(argv[0]),c); 00166 fflush(stderr); 00167 usage(argc,argv); 00168 exit(1); 00169 } 00170 } 00171 argidx = optind; 00172 00173 bzero(&destaddr,sizeof(destaddr)); 00174 00175 while(args_processed < args_expected) { 00176 if (argidx >= argc) { 00177 /* missing arguments */ 00178 printf("%s: missing argument(s)\n",basename(argv[0])); 00179 usage(argc,argv); 00180 exit(1); 00181 } 00182 switch(args_processed) { 00183 case 0: { /* source address */ 00184 struct hostent *srchostp = NULL; 00185 srchostp = gethostbyname(argv[argidx]); 00186 if (srchostp == NULL) { 00187 fprintf(stderr,"%s: unknown dest host %s\n", 00188 basename(argv[0]),argv[argidx]); 00189 fflush(stderr); 00190 usage(argc,argv); 00191 exit(1); 00192 } 00193 assert(srchostp->h_addrtype == AF_INET); 00194 assert(srchostp->h_length == sizeof(unsigned int)); 00195 memcpy(&srcaddr.sin_addr.s_addr,srchostp->h_addr,srchostp->h_length); 00196 srcaddr.sin_family = AF_INET; 00197 break; 00198 } 00199 case 1: { /* destination address */ 00200 struct hostent *desthostp = NULL; 00201 desthostp = gethostbyname(argv[argidx]); 00202 if (desthostp == NULL) { 00203 fprintf(stderr,"%s: unknown dest host %s\n", 00204 basename(argv[0]),argv[argidx]); 00205 fflush(stderr); 00206 usage(argc,argv); 00207 exit(1); 00208 } 00209 assert(desthostp->h_addrtype == AF_INET); 00210 assert(desthostp->h_length == sizeof(unsigned int)); 00211 memcpy(&destaddr.sin_addr.s_addr,desthostp->h_addr,desthostp->h_length); 00212 destaddr.sin_family = AF_INET; 00213 break; 00214 } 00215 case 2: /* packet file name */ 00216 infilename = argv[argidx]; 00217 if (strcmp(infilename,"-") == 0) { 00218 infd = 0; /* stdin */ 00219 } else { 00220 infd = open(infilename,O_RDONLY); 00221 if (infd == -1) { 00222 fprintf(stderr,"%s: unable to open file \"%s\" for input\n", 00223 basename(argv[0]),infilename); 00224 fflush(stderr); 00225 exit(1); 00226 } 00227 } 00228 break; 00229 } 00230 argidx++; 00231 args_processed++; 00232 } 00233 if (argidx < argc) { 00234 /* extra arguments */ 00235 printf("%s: extra argument(s)\n",basename(argv[0])); 00236 usage(argc,argv); 00237 exit(1); 00238 } 00239 return; 00240 } 00241 00242 int main(int argc, char** argv){ 00243 char* env_val; 00244 int protocols; 00245 00246 /* initialize the request */ 00247 init_request (argc, argv); 00248 00249 /* initialize the recv protocol(s) */ 00250 env_val = getenv("SNAP_DEMUX_HANDLER"); 00251 if (env_val != NULL) 00252 protocols = atoi(env_val); 00253 else 00254 protocols = SNAP_UDP; 00255 snap_demux_init(protocols); 00256 00257 /* execute the requests */ 00258 sendpkt(); 00259 if (snap_demux_handler((buffer_handler) &snap_demux_buffer_print_unsafe)) 00260 00261 snap_demux_close(); 00262 00263 return 0; 00264 } |