Add CUSEEME support. This has *not* been tested, nor
could I find anyone to test it, so please report any problems to me.
This commit is contained in:
parent
7fbcb4ce39
commit
0579bd7175
@ -2,8 +2,8 @@ LIB= alias
|
||||
SHLIB_MAJOR= 2
|
||||
SHLIB_MINOR= 5
|
||||
CFLAGS+=-Wall -I${.CURDIR}
|
||||
SRCS= alias.c alias_db.c alias_ftp.c alias_irc.c alias_util.c alias_old.c \
|
||||
alias_nbt.c
|
||||
SRCS= alias.c alias_cuseeme.c alias_db.c alias_ftp.c alias_irc.c \
|
||||
alias_nbt.c alias_old.c alias_util.c
|
||||
|
||||
MAN3=libalias.3
|
||||
|
||||
|
@ -99,6 +99,7 @@
|
||||
#define FTP_CONTROL_PORT_NUMBER 21
|
||||
#define IRC_CONTROL_PORT_NUMBER_1 6667
|
||||
#define IRC_CONTROL_PORT_NUMBER_2 6668
|
||||
#define CUSEEME_PORT_NUMBER 7648
|
||||
|
||||
/*
|
||||
The following macro is used to update an
|
||||
@ -623,6 +624,9 @@ UdpAliasIn(struct ip *pip)
|
||||
&ud->uh_dport );
|
||||
}
|
||||
|
||||
if (ntohs(ud->uh_dport) == CUSEEME_PORT_NUMBER)
|
||||
AliasHandleCUSeeMeIn(pip, original_address);
|
||||
|
||||
/* If UDP checksum is not zero, then adjust since destination port */
|
||||
/* is being unaliased and destination port is being altered. */
|
||||
if (ud->uh_sum != 0)
|
||||
@ -668,6 +672,9 @@ UdpAliasOut(struct ip *pip)
|
||||
alias_address = GetAliasAddress(link);
|
||||
alias_port = GetAliasPort(link);
|
||||
|
||||
if (ntohs(ud->uh_dport) == CUSEEME_PORT_NUMBER)
|
||||
AliasHandleCUSeeMeOut(pip, link);
|
||||
|
||||
/* If NETBIOS Datagram, It should be alias address in UDP Data, too */
|
||||
if (ntohs(ud->uh_dport) == NETBIOS_DGM_PORT_NUMBER
|
||||
|| ntohs(ud->uh_sport) == NETBIOS_DGM_PORT_NUMBER )
|
||||
|
120
lib/libalias/alias_cuseeme.c
Normal file
120
lib/libalias/alias_cuseeme.c
Normal file
@ -0,0 +1,120 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
|
||||
* with the aid of code written by
|
||||
* Junichi SATOH <junichi@astec.co.jp> 1996, 1997.
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/udp.h>
|
||||
|
||||
#include "alias_local.h"
|
||||
|
||||
/* CU-SeeMe Data Header */
|
||||
struct cu_header {
|
||||
u_int16_t dest_family;
|
||||
u_int16_t dest_port;
|
||||
u_int32_t dest_addr;
|
||||
int16_t family;
|
||||
u_int16_t port;
|
||||
u_int32_t addr;
|
||||
u_int32_t seq;
|
||||
u_int16_t msg;
|
||||
u_int16_t data_type;
|
||||
u_int16_t packet_len;
|
||||
};
|
||||
|
||||
/* Open Continue Header */
|
||||
struct oc_header {
|
||||
u_int16_t client_count; /* Number of client info structs */
|
||||
u_int32_t seq_no;
|
||||
char user_name[20];
|
||||
char reserved[4]; /* flags, version stuff, etc */
|
||||
};
|
||||
|
||||
/* client info structures */
|
||||
struct client_info {
|
||||
u_int32_t address; /* Client address */
|
||||
char reserved[8]; /* Flags, pruning bitfield, packet counts etc */
|
||||
};
|
||||
|
||||
void
|
||||
AliasHandleCUSeeMeOut(struct ip *pip, struct alias_link *link)
|
||||
{
|
||||
struct udphdr *ud;
|
||||
|
||||
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
|
||||
if(ud->uh_ulen >= sizeof(struct cu_header)) {
|
||||
struct cu_header *cu;
|
||||
struct alias_link *cu_link;
|
||||
|
||||
cu = (struct cu_header *)(ud + 1);
|
||||
if (cu->addr)
|
||||
cu->addr = (u_int32_t)GetAliasAddress(link).s_addr;
|
||||
|
||||
cu_link = FindUdpTcpOut(pip->ip_src, GetDestAddress(link),
|
||||
ud->uh_dport, 0, IPPROTO_UDP);
|
||||
|
||||
#ifndef NO_FW_PUNCH
|
||||
if (cu_link)
|
||||
PunchFWHole(cu_link);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AliasHandleCUSeeMeIn(struct ip *pip, struct in_addr original_addr)
|
||||
{
|
||||
struct in_addr alias_addr;
|
||||
struct udphdr *ud;
|
||||
struct cu_header *cu;
|
||||
struct oc_header *oc;
|
||||
struct client_info *ci;
|
||||
char *end;
|
||||
int i;
|
||||
|
||||
alias_addr.s_addr = pip->ip_dst.s_addr;
|
||||
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
|
||||
cu = (struct cu_header *)(ud + 1);
|
||||
oc = (struct oc_header *)(cu + 1);
|
||||
ci = (struct client_info *)(oc + 1);
|
||||
end = (char *)cu + ud->uh_ulen;
|
||||
|
||||
if ((char *)oc <= end) {
|
||||
if(cu->dest_addr)
|
||||
cu->dest_addr = (u_int32_t)original_addr.s_addr;
|
||||
if(ntohs(cu->data_type) == 101)
|
||||
/* Find and change our address */
|
||||
for(i = 0; (char *)(ci + 1) <= end && i < oc->client_count; i++, ci++)
|
||||
if(ci->address == (u_int32_t)alias_addr.s_addr) {
|
||||
ci->address = (u_int32_t)original_addr.s_addr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
@ -92,6 +92,8 @@ void AliasHandleFtpOut(struct ip *, struct alias_link *, int);
|
||||
void AliasHandleIrcOut(struct ip *pip, struct alias_link *link, int maxsize );
|
||||
void AliasHandleUdpNbt(struct ip *, struct alias_link *, struct in_addr *, u_short);
|
||||
void AliasHandleUdpNbtNS(struct ip *, struct alias_link *, struct in_addr *, u_short *, struct in_addr *, u_short *);
|
||||
void AliasHandleCUSeeMeOut(struct ip *, struct alias_link *);
|
||||
void AliasHandleCUSeeMeIn(struct ip *, struct in_addr);
|
||||
|
||||
|
||||
|
||||
|
@ -2,8 +2,8 @@ LIB= alias
|
||||
SHLIB_MAJOR= 2
|
||||
SHLIB_MINOR= 5
|
||||
CFLAGS+=-Wall -I${.CURDIR}
|
||||
SRCS= alias.c alias_db.c alias_ftp.c alias_irc.c alias_util.c alias_old.c \
|
||||
alias_nbt.c
|
||||
SRCS= alias.c alias_cuseeme.c alias_db.c alias_ftp.c alias_irc.c \
|
||||
alias_nbt.c alias_old.c alias_util.c
|
||||
|
||||
MAN3=libalias.3
|
||||
|
||||
|
@ -99,6 +99,7 @@
|
||||
#define FTP_CONTROL_PORT_NUMBER 21
|
||||
#define IRC_CONTROL_PORT_NUMBER_1 6667
|
||||
#define IRC_CONTROL_PORT_NUMBER_2 6668
|
||||
#define CUSEEME_PORT_NUMBER 7648
|
||||
|
||||
/*
|
||||
The following macro is used to update an
|
||||
@ -623,6 +624,9 @@ UdpAliasIn(struct ip *pip)
|
||||
&ud->uh_dport );
|
||||
}
|
||||
|
||||
if (ntohs(ud->uh_dport) == CUSEEME_PORT_NUMBER)
|
||||
AliasHandleCUSeeMeIn(pip, original_address);
|
||||
|
||||
/* If UDP checksum is not zero, then adjust since destination port */
|
||||
/* is being unaliased and destination port is being altered. */
|
||||
if (ud->uh_sum != 0)
|
||||
@ -668,6 +672,9 @@ UdpAliasOut(struct ip *pip)
|
||||
alias_address = GetAliasAddress(link);
|
||||
alias_port = GetAliasPort(link);
|
||||
|
||||
if (ntohs(ud->uh_dport) == CUSEEME_PORT_NUMBER)
|
||||
AliasHandleCUSeeMeOut(pip, link);
|
||||
|
||||
/* If NETBIOS Datagram, It should be alias address in UDP Data, too */
|
||||
if (ntohs(ud->uh_dport) == NETBIOS_DGM_PORT_NUMBER
|
||||
|| ntohs(ud->uh_sport) == NETBIOS_DGM_PORT_NUMBER )
|
||||
|
120
sys/netinet/libalias/alias_cuseeme.c
Normal file
120
sys/netinet/libalias/alias_cuseeme.c
Normal file
@ -0,0 +1,120 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
|
||||
* with the aid of code written by
|
||||
* Junichi SATOH <junichi@astec.co.jp> 1996, 1997.
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/udp.h>
|
||||
|
||||
#include "alias_local.h"
|
||||
|
||||
/* CU-SeeMe Data Header */
|
||||
struct cu_header {
|
||||
u_int16_t dest_family;
|
||||
u_int16_t dest_port;
|
||||
u_int32_t dest_addr;
|
||||
int16_t family;
|
||||
u_int16_t port;
|
||||
u_int32_t addr;
|
||||
u_int32_t seq;
|
||||
u_int16_t msg;
|
||||
u_int16_t data_type;
|
||||
u_int16_t packet_len;
|
||||
};
|
||||
|
||||
/* Open Continue Header */
|
||||
struct oc_header {
|
||||
u_int16_t client_count; /* Number of client info structs */
|
||||
u_int32_t seq_no;
|
||||
char user_name[20];
|
||||
char reserved[4]; /* flags, version stuff, etc */
|
||||
};
|
||||
|
||||
/* client info structures */
|
||||
struct client_info {
|
||||
u_int32_t address; /* Client address */
|
||||
char reserved[8]; /* Flags, pruning bitfield, packet counts etc */
|
||||
};
|
||||
|
||||
void
|
||||
AliasHandleCUSeeMeOut(struct ip *pip, struct alias_link *link)
|
||||
{
|
||||
struct udphdr *ud;
|
||||
|
||||
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
|
||||
if(ud->uh_ulen >= sizeof(struct cu_header)) {
|
||||
struct cu_header *cu;
|
||||
struct alias_link *cu_link;
|
||||
|
||||
cu = (struct cu_header *)(ud + 1);
|
||||
if (cu->addr)
|
||||
cu->addr = (u_int32_t)GetAliasAddress(link).s_addr;
|
||||
|
||||
cu_link = FindUdpTcpOut(pip->ip_src, GetDestAddress(link),
|
||||
ud->uh_dport, 0, IPPROTO_UDP);
|
||||
|
||||
#ifndef NO_FW_PUNCH
|
||||
if (cu_link)
|
||||
PunchFWHole(cu_link);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AliasHandleCUSeeMeIn(struct ip *pip, struct in_addr original_addr)
|
||||
{
|
||||
struct in_addr alias_addr;
|
||||
struct udphdr *ud;
|
||||
struct cu_header *cu;
|
||||
struct oc_header *oc;
|
||||
struct client_info *ci;
|
||||
char *end;
|
||||
int i;
|
||||
|
||||
alias_addr.s_addr = pip->ip_dst.s_addr;
|
||||
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
|
||||
cu = (struct cu_header *)(ud + 1);
|
||||
oc = (struct oc_header *)(cu + 1);
|
||||
ci = (struct client_info *)(oc + 1);
|
||||
end = (char *)cu + ud->uh_ulen;
|
||||
|
||||
if ((char *)oc <= end) {
|
||||
if(cu->dest_addr)
|
||||
cu->dest_addr = (u_int32_t)original_addr.s_addr;
|
||||
if(ntohs(cu->data_type) == 101)
|
||||
/* Find and change our address */
|
||||
for(i = 0; (char *)(ci + 1) <= end && i < oc->client_count; i++, ci++)
|
||||
if(ci->address == (u_int32_t)alias_addr.s_addr) {
|
||||
ci->address = (u_int32_t)original_addr.s_addr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
@ -92,6 +92,8 @@ void AliasHandleFtpOut(struct ip *, struct alias_link *, int);
|
||||
void AliasHandleIrcOut(struct ip *pip, struct alias_link *link, int maxsize );
|
||||
void AliasHandleUdpNbt(struct ip *, struct alias_link *, struct in_addr *, u_short);
|
||||
void AliasHandleUdpNbtNS(struct ip *, struct alias_link *, struct in_addr *, u_short *, struct in_addr *, u_short *);
|
||||
void AliasHandleCUSeeMeOut(struct ip *, struct alias_link *);
|
||||
void AliasHandleCUSeeMeIn(struct ip *, struct in_addr);
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user