- Timestamp:
- 2006-01-10T21:35:08Z (18 years ago)
- Branches:
- master
- Children:
- a4dc9f7
- Parents:
- 3e91c3e (diff), dd8d4c5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
irc.c
r3e91c3e r8e419cb 40 40 irc_t *irc_new( int fd ) 41 41 { 42 irc_t *irc = g_new0( irc_t, 1 ); 43 42 irc_t *irc; 43 struct hostent *peer; 44 unsigned int i; 45 char buf[128]; 46 #ifdef IPV6 47 struct sockaddr_in6 sock[1]; 48 #else 44 49 struct sockaddr_in sock[1]; 45 #ifdef IPV646 struct sockaddr_in6 sock6[1];47 50 #endif 48 struct hostent *peer;49 unsigned int i, j;51 52 irc = g_new0( irc_t, 1 ); 50 53 51 54 irc->fd = fd; … … 71 74 72 75 i = sizeof( *sock ); 73 #ifdef IPV6 74 j = sizeof( *sock6 ); 75 #endif 76 76 77 if( global.conf->hostname ) 77 78 irc->myhost = g_strdup( global.conf->hostname ); 78 else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET ) 79 { 80 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) ) 79 #ifdef IPV6 80 else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx ) 81 { 82 if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) ) 81 83 irc->myhost = g_strdup( peer->h_name ); 82 } 83 #ifdef IPV6 84 else if( getsockname( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 ) 85 { 86 if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) ) 84 else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) 85 irc->myhost = g_strdup( ipv6_unwrap( buf ) ); 86 } 87 #else 88 else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx ) 89 { 90 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) ) 87 91 irc->myhost = g_strdup( peer->h_name ); 92 else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL ) 93 irc->myhost = g_strdup( buf ); 88 94 } 89 95 #endif … … 91 97 i = sizeof( *sock ); 92 98 #ifdef IPV6 93 j = sizeof( *sock6 ); 99 if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx ) 100 { 101 if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) ) 102 irc->host = g_strdup( peer->h_name ); 103 else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) 104 irc->host = g_strdup( ipv6_unwrap( buf ) ); 105 } 106 #else 107 if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx ) 108 { 109 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) ) 110 irc->host = g_strdup( peer->h_name ); 111 else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL ) 112 irc->host = g_strdup( buf ); 113 } 94 114 #endif 95 if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET ) 96 { 97 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) ) 98 irc->host = g_strdup( peer->h_name ); 99 } 100 #ifdef IPV6 101 else if( getpeername( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 ) 102 { 103 if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) ) 104 irc->host = g_strdup( peer->h_name ); 105 } 106 #endif 107 115 116 /* Rare, but possible. */ 108 117 if( !irc->host ) irc->host = g_strdup( "localhost." ); 109 118 if( !irc->myhost ) irc->myhost = g_strdup( "localhost." ); … … 264 273 g_free(irc); 265 274 266 if( global.conf->runmode == RUNMODE_INETD )275 if( global.conf->runmode == RUNMODE_INETD || global.conf->runmode == RUNMODE_FORKDAEMON ) 267 276 g_main_quit( global.loop ); 268 277 } … … 422 431 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); 423 432 } 424 else if( strcmp( cmd[1], (global.conf)-> password) == 0 )433 else if( strcmp( cmd[1], (global.conf)->auth_pass ) == 0 ) 425 434 { 426 435 irc->status = USTATUS_AUTHORIZED; … … 500 509 { 501 510 irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost ); 511 } 512 else if( g_strcasecmp( cmd[0], "OPER" ) == 0 ) 513 { 514 if( !cmd[2] ) 515 irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); 516 else if( strcmp( cmd[2], global.conf->oper_pass ) == 0 ) 517 irc_umode_set( irc, "+o", 1 ); 518 // else 519 /* FIXME/TODO: Find out which reply to send now. */ 502 520 } 503 521 else if( g_strcasecmp( cmd[0], "MODE" ) == 0 ) … … 524 542 { 525 543 if( cmd[2] ) 526 irc_umode_set( irc, irc->nick, cmd[2]);544 irc_umode_set( irc, cmd[2], 0 ); 527 545 } 528 546 else … … 923 941 if( irc->sendbuffer != NULL ) { 924 942 size = strlen( irc->sendbuffer ) + strlen( line ); 925 #ifdef FLOOD_SEND926 if( size > FLOOD_SEND_MAXBUFFER ) {927 /* Die flooder, die! >:) */928 929 g_free(irc->sendbuffer);930 931 /* We need the \r\n at the start because else we might append our string to a half932 * sent line. A bit hackish, but it works.933 */934 irc->sendbuffer = g_strdup( "\r\nERROR :Sendq Exceeded\r\n" );935 irc->quit = 1;936 937 return;938 }939 #endif940 943 irc->sendbuffer = g_renew ( char, irc->sendbuffer, size + 1 ); 941 944 strcpy( ( irc->sendbuffer + strlen( irc->sendbuffer ) ), line ); … … 1075 1078 irc_reply( irc, 2, ":Host %s is running BitlBee " BITLBEE_VERSION " " ARCH "/" CPU ".", irc->myhost ); 1076 1079 irc_reply( irc, 3, ":%s", IRCD_INFO ); 1077 irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES, CMODES ); 1080 irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES ); 1081 irc_reply( irc, 5, "PREFIX=(ov)@+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); 1078 1082 irc_motd( irc ); 1079 irc_umode_set( irc, irc->myhost, "+" UMODE);1083 irc_umode_set( irc, "+" UMODE, 1 ); 1080 1084 1081 1085 u = user_add( irc, irc->mynick ); … … 1204 1208 1205 1209 1206 void irc_umode_set( irc_t *irc, char *who, char *s ) 1207 { 1210 void irc_umode_set( irc_t *irc, char *s, int allow_priv ) 1211 { 1212 /* allow_priv: Set to 0 if s contains user input, 1 if you want 1213 to set a "privileged" mode (+o, +R, etc). */ 1208 1214 char m[256], st = 1, *t; 1209 1215 int i; … … 1218 1224 if( *t == '+' || *t == '-' ) 1219 1225 st = *t == '+'; 1220 else 1226 else if( st == 0 || ( strchr( UMODES, *t ) || ( allow_priv && strchr( UMODES_PRIV, *t ) ) ) ) 1221 1227 m[(int)*t] = st; 1222 1228 } … … 1225 1231 1226 1232 for( i = 0; i < 256 && strlen( irc->umode ) < ( sizeof( irc->umode ) - 1 ); i ++ ) 1227 if( m[i] && strchr( UMODES, i ))1233 if( m[i] ) 1228 1234 irc->umode[strlen(irc->umode)] = i; 1229 1235
Note: See TracChangeset
for help on using the changeset viewer.