git-svn-id: svn://svn.code.sf.net/p/bitchx/code/tags/ircii-pana-1.1-final@1 13b04d17-f746-0410-82c6-800466cd88b0
112 lines
2.7 KiB
C
112 lines
2.7 KiB
C
/*
|
|
* experimental identd module for bx.
|
|
* adds a /set identd on/off toggle.
|
|
* adds a /set identd_user <username>
|
|
* and implements a identd server for bx. This obviously won't work unless
|
|
* your running as root. And is mainly meant for use with os/2 and win95
|
|
* ports.
|
|
* Copyright 1998 Colten Edwards.
|
|
*/
|
|
|
|
#include "irc.h"
|
|
#include "struct.h"
|
|
#include "ircaux.h"
|
|
#include "output.h"
|
|
#include "vars.h"
|
|
#include "module.h"
|
|
#define INIT_MODULE
|
|
#include "modval.h"
|
|
|
|
void identd_read(int s)
|
|
{
|
|
char buffer[100];
|
|
char *bufptr;
|
|
unsigned int lport = 0, rport = 0;
|
|
*buffer = 0;
|
|
bufptr = buffer;
|
|
if (recv(s, buffer, sizeof(buffer)-1, 0) <=0)
|
|
{
|
|
bitchsay("ERROR in identd request");
|
|
close_socketread(s);
|
|
return;
|
|
}
|
|
if (sscanf(bufptr, "%d , %d", &lport, &rport) == 2)
|
|
{
|
|
if (lport < 1 || rport < 1 || lport > 32767 || rport > 32767)
|
|
{
|
|
close_socketread(s);
|
|
bitchsay("ERROR port for identd bad [%d:%d]", lport, rport);
|
|
return;
|
|
}
|
|
sprintf(buffer, "%hu , %hu : USERID : UNIX : %s", lport, rport, get_dllstring_var("identd_user"));
|
|
dcc_printf(s, "%s\r\n", buffer);
|
|
bitchsay("Sent IDENTD request %s", buffer);
|
|
set_socketflags(identd, now);
|
|
}
|
|
close_socketread(s);
|
|
}
|
|
|
|
void identd_handler(int s)
|
|
{
|
|
struct sockaddr_in remaddr;
|
|
int sra = sizeof(struct sockaddr_in);
|
|
int sock = -1;
|
|
#if 0
|
|
if (!(get_dllint_var("identd")) || !(get_dllstring_var("identd_user")))
|
|
{
|
|
int opt = 0;
|
|
int optlen = sizeof(opt);
|
|
getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)&opt, optlen);
|
|
return;
|
|
}
|
|
#endif
|
|
if ((sock = accept(s, (struct sockaddr *) &remaddr, &sra)) > -1)
|
|
{
|
|
if (!(get_dllint_var("identd")) || !(get_dllstring_var("identd_user")))
|
|
{
|
|
close(sock);
|
|
return;
|
|
}
|
|
add_socketread(sock, s, 0, inet_ntoa(remaddr.sin_addr), identd_read, NULL);
|
|
add_sockettimeout(sock, 20, NULL);
|
|
}
|
|
}
|
|
|
|
int start_identd(void)
|
|
{
|
|
int sock = -1;
|
|
unsigned short port = 113;
|
|
if (identd != -1)
|
|
return -1;
|
|
if ((sock = connect_by_number(NULL, &port, SERVICE_SERVER, PROTOCOL_TCP, 1)) > -1)
|
|
add_socketread(sock, port, 0, NULL, identd_handler, NULL);
|
|
identd = sock;
|
|
return 0;
|
|
}
|
|
|
|
int Identd_Cleanup(IrcCommandDll **intp, Function_ptr *global_table)
|
|
{
|
|
if (identd != -1)
|
|
{
|
|
close_socketread(identd);
|
|
identd = -1;
|
|
}
|
|
remove_module_proc(VAR_PROC, MODULENAME, NULL, NULL);
|
|
return 0;
|
|
}
|
|
|
|
int Identd_Init(IrcCommandDll **intp, Function_ptr *global_table)
|
|
{
|
|
#if !defined(__EMX__) && !defined(WINNT)
|
|
if (getuid() && geteuid())
|
|
{
|
|
return -1;
|
|
}
|
|
#endif
|
|
initialize_module("Identd");
|
|
add_module_proc(VAR_PROC, MODULENAME, "identd", NULL, BOOL_TYPE_VAR, 0, NULL, NULL);
|
|
add_module_proc(VAR_PROC, MODULENAME, "identd_user", NULL, STR_TYPE_VAR, 0, NULL, NULL);
|
|
put_it("%s", convert_output_format("$G $0 v$1 by panasync", "%s %s", MODULENAME, "0.01"));
|
|
return start_identd();
|
|
}
|