Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

udpfeed.c

Go to the documentation of this file.
00001 /* ==================================================================== 
00002  * The Kannel Software License, Version 1.0 
00003  * 
00004  * Copyright (c) 2001-2008 Kannel Group  
00005  * Copyright (c) 1998-2001 WapIT Ltd.   
00006  * All rights reserved. 
00007  * 
00008  * Redistribution and use in source and binary forms, with or without 
00009  * modification, are permitted provided that the following conditions 
00010  * are met: 
00011  * 
00012  * 1. Redistributions of source code must retain the above copyright 
00013  *    notice, this list of conditions and the following disclaimer. 
00014  * 
00015  * 2. Redistributions in binary form must reproduce the above copyright 
00016  *    notice, this list of conditions and the following disclaimer in 
00017  *    the documentation and/or other materials provided with the 
00018  *    distribution. 
00019  * 
00020  * 3. The end-user documentation included with the redistribution, 
00021  *    if any, must include the following acknowledgment: 
00022  *       "This product includes software developed by the 
00023  *        Kannel Group (http://www.kannel.org/)." 
00024  *    Alternately, this acknowledgment may appear in the software itself, 
00025  *    if and wherever such third-party acknowledgments normally appear. 
00026  * 
00027  * 4. The names "Kannel" and "Kannel Group" must not be used to 
00028  *    endorse or promote products derived from this software without 
00029  *    prior written permission. For written permission, please  
00030  *    contact org@kannel.org. 
00031  * 
00032  * 5. Products derived from this software may not be called "Kannel", 
00033  *    nor may "Kannel" appear in their name, without prior written 
00034  *    permission of the Kannel Group. 
00035  * 
00036  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 
00037  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
00038  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00039  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS 
00040  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,  
00041  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  
00042  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR  
00043  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  
00044  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE  
00045  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  
00046  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
00047  * ==================================================================== 
00048  * 
00049  * This software consists of voluntary contributions made by many 
00050  * individuals on behalf of the Kannel Group.  For more information on  
00051  * the Kannel Group, please see <http://www.kannel.org/>. 
00052  * 
00053  * Portions of this software are based upon software originally written at  
00054  * WapIT Ltd., Helsinki, Finland for the Kannel project.  
00055  */ 
00056 
00057 /* udpfeed.c - blindly send UDP packets to a certain port
00058  *
00059  * This little tool reads a bunch of files and sends each of them
00060  * to a given port as a single UDP packets.  It's useful for running
00061  * sets of test packets to see if any of them will crash the gateway.
00062  * By default, it sends them at one-second intervals.
00063  */
00064 
00065 #include <unistd.h>
00066 
00067 #include "gwlib/gwlib.h"
00068 
00069 #define UDP_MAXIMUM (65535 - 40)
00070 
00071 static unsigned char usage[] = "\
00072 Usage: udpfeed [options] files...\n\
00073 \n\
00074 where options are:\n\
00075 \n\
00076 -h      help\n\
00077 -g hostname name of IP number of host to send to (default: localhost)\n\
00078 -p port     port number to send to (default: 9200)\n\
00079 -i interval delay between packers (default: 1.0 seconds)\n\
00080 \n\
00081 Each file will be sent as a single packet.\n\
00082 ";
00083 
00084 static Octstr *hostname;
00085 static int port = 9200;  /* By default, the sessionless WSP port */
00086 static double interval = 1.0;  /* Default interval (seconds) between packets */
00087 static long maxsize = UDP_MAXIMUM;  /* Maximum packet size in octets */
00088 
00089 static void help(void) {
00090     info(0, "\n%s", usage);
00091 }
00092 
00093 static void send_file(int udpsock, char *filename, Octstr *address) {
00094     Octstr *contents;
00095 
00096     contents = octstr_read_file(filename);
00097     if (contents == NULL) {
00098         info(0, "Skipping \"%s\".", filename);
00099         return;
00100     }
00101 
00102     info(0, "Sending \"%s\", %ld octets.", filename, octstr_len(contents));
00103 
00104     if (octstr_len(contents) > maxsize) {
00105         octstr_truncate(contents, maxsize);
00106         warning(0, "Truncating to %ld octets.", maxsize);
00107     }
00108 
00109     udp_sendto(udpsock, contents, address);
00110 
00111     octstr_destroy(contents);
00112 }
00113 
00114 int main(int argc, char **argv) {
00115     int opt;
00116     Octstr *address;
00117     int udpsock;
00118 
00119     gwlib_init();
00120 
00121     /* Set defaults that can't be set statically */
00122     hostname = octstr_create("localhost");
00123 
00124     while ((opt = getopt(argc, argv, "hg:p:i:m:")) != EOF) {
00125         switch(opt) {
00126         case 'g':
00127             octstr_destroy(hostname);
00128             hostname = octstr_create(optarg);
00129             break;
00130 
00131         case 'p':
00132             port = atoi(optarg);
00133             break;
00134 
00135         case 'i':
00136             interval = atof(optarg);
00137             break;
00138 
00139         case 'm':
00140             maxsize = atol(optarg);
00141             if (maxsize > UDP_MAXIMUM) {
00142                 maxsize = UDP_MAXIMUM;
00143                 warning(0, "-m: truncated to UDP maximum of"
00144                     "%ld bytes.", maxsize);
00145             }
00146             break;
00147 
00148         case 'h':
00149             help();
00150             exit(0);
00151             break;
00152 
00153         case '?':
00154         default:
00155             error(0, "Unknown option '%c'", opt);
00156             help();
00157             exit(1);
00158             break;
00159         }
00160     }
00161 
00162     address = udp_create_address(hostname, port);
00163     udpsock = udp_client_socket();
00164     if (udpsock < 0)
00165         exit(1);
00166 
00167     for ( ; optind < argc; optind++) {
00168         send_file(udpsock, argv[optind], address);
00169         if (interval > 0 && optind + 1 < argc)
00170             gwthread_sleep(interval);
00171     }
00172 
00173     octstr_destroy(address);
00174     octstr_destroy(hostname);
00175     gwlib_shutdown();
00176         return 0;
00177 }
See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.