/* * udpmsg: send messages via UDP */ /* * Copyright (c) 2006 Andreas Jaggi <andreas.jaggi@waterwave.ch> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <netinet/in.h> #include <arpa/inet.h> #include "udpmsg.h" const char usagemsg[] = "usage: udpmsg -i <IP> -m <message>\n" "\n" "arguments:\n" " -i IP send to host with address IP\n" " -m message message to send\n" " also: udpmsg -v show version\n" " udpmsg -h display this help\n" " udpmsg -l display (BSD) license\n" ; const char versionmsg[] = "udpmsg 0.3\n"; void usage ( ); void version ( ); int main ( int argc, char* argv[] ) { int sock; int tmp; in_addr_t remote_addr = 0; char* msg = NULL; struct sockaddr_in *destination = NULL; while ( (tmp = getopt(argc, argv, "i:m:hlv")) != -1 ) { switch ( tmp ) { case 'h': usage(); exit(0); case 'l': license(); exit(0); case 'v': version(); exit(0); case 'i': remote_addr = inet_addr(optarg); break; case 'm': msg = optarg; break; } } if ( (remote_addr == 0) || (msg == NULL) ) { usage(); exit(-1); } sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if ( sock < 0 ) { showerror("socket"); exit(-1); } destination = alloca(sizeof(struct sockaddr_in)); destination->sin_family = AF_INET; destination->sin_addr.s_addr = remote_addr; destination->sin_port = UDPMSG_PORT; tmp = sendto(sock, msg, strlen(msg)+1, 0, (struct sockaddr*)destination, sizeof(struct sockaddr_in)); if ( tmp < 0 ) { showerror("sendto"); exit(-1); } tmp = close(sock); if ( tmp < 0 ) { showerror("close"); exit(-1); } exit(0); } void usage ( ) { write(1, usagemsg, strlen(usagemsg)); } void version ( ) { write(1, versionmsg, strlen(versionmsg)); }