diff --git a/src/modules/files/udp.c b/src/modules/files/udp.c index dc3295076ab1acf371ef2fdb740aa4921442383f..e64301962ed03245be5e9ed18d2f056ebda72cca 100644 --- a/src/modules/files/udp.c +++ b/src/modules/files/udp.c @@ -1,5 +1,5 @@ /* - * $Id: udp.c,v 1.15 2000/08/19 11:47:22 grubba Exp $ + * $Id: udp.c,v 1.16 2000/10/12 20:22:57 mirar Exp $ */ #define NO_PIKE_SHORTHAND @@ -7,7 +7,7 @@ #include "file_machine.h" -RCSID("$Id: udp.c,v 1.15 2000/08/19 11:47:22 grubba Exp $"); +RCSID("$Id: udp.c,v 1.16 2000/10/12 20:22:57 mirar Exp $"); #include "fdlib.h" #include "interpret.h" #include "svalue.h" @@ -550,6 +550,48 @@ static void udp_set_blocking(INT32 args) ref_push_object(THISOBJ); } +static void udp_connect(INT32 args) +{ + struct sockaddr_in addr; + struct pike_string *dest_addr = NULL; + struct pike_string *src_addr = NULL; + INT_TYPE dest_port = 0; + INT_TYPE src_port = 0; + + int tmp; + + get_all_args("UDP.connect", args, "%S%i", &dest_addr, &dest_port); + + if(FD < 0) + { + FD = fd_socket(AF_INET, SOCK_DGRAM, 0); + if(FD < 0) + { + THIS->my_errno=errno; + error("UDP.connect: failed to create socket\n"); + } + set_close_on_exec(FD, 1); + } + + get_inet_addr(&addr, dest_addr->str); + addr.sin_port = htons(((u_short)dest_port)); + + tmp=FD; + THREADS_ALLOW(); + tmp=fd_connect(tmp, (struct sockaddr *)&addr, sizeof(addr)); + THREADS_DISALLOW(); + + if(tmp < 0) + { + THIS->my_errno=errno; + error("UDP.connect: failed to connect\n"); + }else{ + THIS->my_errno=0; + pop_n_elems(args); + push_int(1); + } +} + static void udp_query_address(INT32 args) { struct sockaddr_in addr; @@ -613,6 +655,9 @@ void init_udp(void) ADD_FUNCTION("send",udp_sendto, tFunc(tStr tInt tStr tOr(tVoid,tInt),tInt),0); + + ADD_FUNCTION("connect",udp_connect, + tFunc(tString tInt,tInt),0); ADD_FUNCTION("_set_nonblocking", udp_set_nonblocking, tFunc(tOr(tFunc(tVoid,tVoid),tVoid),tObj), 0 );