[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

SourceForge.net Logo

osi-open source certified logo

Splash - Documentation

SNMP Plus a Lightweight API for SNAP Handling

Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

snap-1.1-wjdb/src/snap_exec.c

Go 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 }