Newer
Older

rswindell
committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* ident.c */
/* Synchronet Indentification (RFC1413) functions */
/* $Id$ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to mods@synchro.net *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
#include "ident.h"
char* identify(SOCKADDR_IN* client_addr, u_short local_port, char* buf, size_t maxlen)

rswindell
committed
{
char req[128];
char* identity=NULL;

rswindell
committed
SOCKET sock=INVALID_SOCKET;
SOCKADDR_IN addr;
struct timeval tv;
fd_set socket_set;

rswindell
committed
do {
if((sock = open_socket(SOCK_STREAM)) == INVALID_SOCKET) {
sprintf(buf,"ERROR %d creating socket",ERROR_VALUE);
break;
}
addr=*client_addr;

rswindell
committed
if(connect(sock, (struct sockaddr*)&addr, sizeof(addr))!=0) {

rswindell
committed
sprintf(buf,"ERROR %d connecting to server",ERROR_VALUE);
break;
}
tv.tv_sec=10;
tv.tv_usec=0;
FD_ZERO(&socket_set);
FD_SET(sock,&socket_set);
i=select(sock+1,NULL,&socket_set,NULL,&tv);
if(i<1) {
sprintf(buf,"ERROR %d selecting socket for send",ERROR_VALUE);
break;
}
sprintf(req,"%u, %u\r\n", ntohs(client_addr->sin_port), local_port);
if(sendsocket(sock,req,strlen(req))!=(int)strlen(req)) {

rswindell
committed
sprintf(buf,"ERROR %d sending request",ERROR_VALUE);
break;
}
tv.tv_sec=10;
tv.tv_usec=0;
FD_ZERO(&socket_set);
FD_SET(sock,&socket_set);
i=select(sock+1,&socket_set,NULL,NULL,&tv);
if(i<1) {
sprintf(buf,"ERROR %d detecting response",ERROR_VALUE);
break;
}
sprintf(buf,"ERROR %d receiving response",ERROR_VALUE);

rswindell
committed
break;
}