Thread: [IRC-Dev CVS] [CVS] Module ircdh: Change committed (Page 2)
Brought to you by:
zolty
From: Toni G. <zo...@us...> - 2003-01-23 11:08:13
|
CVSROOT : /cvsroot/irc-dev Module : ircdh Commit time: 2003-01-23 11:08:11 UTC Added files: doc/history/lazyserver.jcea doc/history/tener_en_cuenta.jcea doc/history/todo.jcea Removed files: lazyserver.jcea tener_en_cuenta.jcea todo.jcea Log message: Muevo los *.jcea al history ---------------------- diff included ---------------------- Index: ircdh/doc/history/lazyserver.jcea diff -u /dev/null ircdh/doc/history/lazyserver.jcea:1.1 --- /dev/null Thu Jan 23 03:08:12 2003 +++ ircdh/doc/history/lazyserver.jcea Thu Jan 23 03:08:01 2003 @@ -0,0 +1,72 @@ +$Id: lazyserver.jcea,v 1.1 2003/01/23 11:08:01 zolty Exp $ + +14/Jun/00 +Con la tecnologia de IRC sobre tuneles IP que he +desarrollado (http://www.argo.es/clones/clones2.html), el +interes por los "Lazy server" se diluye un poco, salvo +por el hecho de que ello ahorraria CPU y ancho de banda. + +Se necesitaria un comando "setip" para fijar la IP y HOST. +Este comando deberia estar permitido SOLO desde ciertas +IPs (en particular 127.0.0.1). + +22/Dic/99 + +Cuando en un sitio hay varios clientes, no tiene sentido que +todos ellos se conecten al servidor, sino que lo mas rentable +es que hubiese un servidor local. La ventaja es mayor, incluso, +cuando los usuarios tienen canales comunes, etc. + +Pero un servidor local no siempre es factible ya que, por un +lado requiere un esfuerzo de administracion y, por otro, +los lugares donde resulta rentable no son CONFIABLES. + +Este proyecto pretende desarrollar un "lazy server". Es decir +un servidor que actue de proxy entre varios usuarios y un servidor +normal de la red. La red solo debe enviar una copia al proxy +de todas aquellos paquetes que deban ser recibido por uno o +mas usuarios del mismo. + +No basta con hacer proxy de "join", "privmsg", "notice", +"part", "quit", "squit", "mode" y alguno mas, ya que todos +los demas comandos del IRC deben poder ser enviados sin +problemas. Ello complica la parte del servidor de IRC en si, que +debe parchearse para poder soportar "lazyservers". Si un usuario +del proxy hace un "/version gaia.*", ese comando debe rutarse +por la red, y la respuesta debe llegar al usuario que hizo la +peticion, no a todo el mundo. + +De todas formas ese problema se soluciona -aparentemente- de forma +bastante sencilla. Practicamente los unicos cambios que serian +necesarios en el servidor serian: + +a) Fiarse del "from" que envia un "lazy server", si se corresponde + a nicks asignados. + +b) Permitir la entrada de un nuevo nick solo si su IP se corresponde + con una IP local. + +c) La mayoria de los comandos del proxy no tienen efecto hasta que + el servidor del que cuelga responde (por ejemplo, entradas + y salidas en canales). + +d) En aquellos comandos que un servidor debe enviar (respuesta) a + varios usuarios, el servidor debe ser parcheado para que + solamente envie una copia para todos los usuarios que + cuelgan del proxy. + +En una primera fase, el cambio mas sencillo en el servidor de IRC +seria: + +a) Anadir un nuevo comando para la entrada de "lazy servers". + +b) Cambiar las rutinas de "parsing" para que tengan en cuenta + el punto A anterior. + +c) cptr de estos clientes deberia ser el mismo. tal vez sea + necesaria una especie de "contador de referencias", asi como + una lista de nicks asociados. + +Una de las ventajas que abre este sistema, ademas de reducir +trafico, es la posibilidad de meter "clones" sin necesitar una IP +fija, a pesar del sistema de control de clones distribuido. Index: ircdh/doc/history/tener_en_cuenta.jcea diff -u /dev/null ircdh/doc/history/tener_en_cuenta.jcea:1.1 --- /dev/null Thu Jan 23 03:08:12 2003 +++ ircdh/doc/history/tener_en_cuenta.jcea Thu Jan 23 03:08:01 2003 @@ -0,0 +1,45 @@ +$Id: tener_en_cuenta.jcea,v 1.1 2003/01/23 11:08:01 zolty Exp $ + +14/Ene/00 +Un proxy abierto puede pasar el chequeo si, por ejemplo, +la conexion del usuario completa la capacidad del +proxy, ya que este no tendra recursos para atender +la verificacion de la red. + +El problema se agrava por el hecho de que si eso +ocurre, la IP sera mantenida en cache y no pasara +mas comprobaciones de proxy durante 30 minutos. + +10/Ene/00 +Los modos +A y +S de canales, no son +representados por muchos clientes de IRC, +entre ellos el popular mIRC, a menos que se +este utilizando la version 5.61 o superior. + +10/Ene/00 +Las bases de datos de disco se pueden truncar a 0, +pero no borrar. + +22/Dic/99 +He hecho algunas pruebas para ver hasta que punto puede +resultar rentable en terminos de ancho de banda el +que la comunicacion entre servidores se realice usando +compresion GZIP. Para ello he generado un BURST y lo he +grabado en disco. Comprimido con GZIP, su tamano se +reduce a la mitad. + +La ganancia no es demasiado importante, por tanto. + +27/Oct/99 +Las BDD no residentes no se compactan, aunque +se marca la orden en disco. + +27/Oct/99 +Solo se conservan en memoria los registros +que afectan al servidor en concreto. + +27/Oct/99 +"make install" elimina las BDD que no se +estan empleando. Por tanto hay que modificar +el "Makefile" si se an~aden BDD nuevas. + Index: ircdh/doc/history/todo.jcea diff -u /dev/null ircdh/doc/history/todo.jcea:1.1 --- /dev/null Thu Jan 23 03:08:12 2003 +++ ircdh/doc/history/todo.jcea Thu Jan 23 03:08:01 2003 @@ -0,0 +1,753 @@ +$Id: todo.jcea,v 1.1 2003/01/23 11:08:01 zolty Exp $ + +13/Ago/02 +La variable que contiene losmodos de usuario esta superpoblada y +apenas le queda ya algun bit libre. Habia que mover lo que son +flags internos del usuario (si se le ha hecho PING o no, si es TS8, etc) +a una variable separada, preferiblemente que exista SOLO cuando el +usuario/conexion es local. + +13/Ago/02 +Cuando un usuario esta silenciado, recibe un "notice" del servidor, +informandole de este hecho. Eso deberia cambiarse por un NUMERIC. + +06/Ago/02 +Poder poner, al conectar, una clave de servidor y otra de nick, al mismo tiempo. + +06/Ago/02 +Documentar en el registro (irc.org) correspondiente el uso +de QUITLEN y AWAYLEN. + +05/Ago/02 +Estudiar la conveniencia de que el taman~o del comentario de los +QUIT y de las GLINES no este vinculado a TOPICLEN. El problema se +nota cuando un usuario tiene una IP Virtual larga, que se puede +cortar cuando le cae una GLINE. + +29/Jul/02: +Canal con +n, status del usuario sin +o ni +v, ban al nick unicamente, +cuando se cambia de nick y se pone otra vez el baneado, puede escribir en el +canal :) + +25/Jul/02 +Cuando alguien se pone +x, deberia salirle publicidad +de la personalizacion de IPs Virtuales, tomando el +mensaje directamente de la BDD. + +09/Jul/02 +Si se configura el server con "BDD_VIP3", el usuario +solo deberia poder ponerse el "+x" si el nick +aparece en la tabla "v" o "w". + +Estudiar implicaciones en cosas como cambios de nick. + +24/Jun/02 +[13:16] <zolty> Cuando el servidor tiene activado el WATCH y un usuario +[13:16] <zolty> que monitorizamos y que no esta en nuestro servidor, +[13:16] <zolty> entra/sale de la red o cambia de nick, y el nick +[13:16] <zolty> esta en la tabla "v" o "w", la IP que aparece en el +[13:16] <zolty> WATCH que nos manda el servidor, es la ip virtual +[13:16] <zolty> normal, no la ip virtual personalizada que le +[13:16] <zolty> corresponde. +[13:16] <zolty> Cuando uno sale, se avisa el watch, antes de hacer +[13:16] <zolty> un "mode -r" y es muy raro, porque a la hora de enviar +[13:16] <zolty> el notify, AUN tiene el +r. +[13:16] <zolty> Cuando uno entra, se avisa el watch antes de recibir +[13:16] <zolty> un +r que vendra del nodo donde esta el usuario +[13:16] <zolty> monitorizado. + +21/Jun/02 +Comprobar que KICK, JOIN, PART efectivamente son ya +100% puros. + +12/Jun/02 +/server servidor puerto clave_server:clave_nick +/server servidor puerto clave_server!clave_nick + +12/Jun/02 +> /watch L +> 1 no esta en irc, ultimo paso el Tue May 21 17:30:18 2002 +> +> Sin embargo el usuario 1 jamas conecto al irc... propongo que se mande +> un tiempo 0 tal y como se hace al borrar al usuario de la lista, pero +> no el momento en que se añadio ese nick al watch. + +17/Abr/02 +En varios sitios aparecen numeros como 512, 510, etc., que +se utilizan como limitadores de la longitud de la linea +enviada o recibida, etc. Habria que transformar esos numeros +en un macro usado en todas partes. + +Eso incluye el nuevo macro MAXLEN introducido en 2.10.H.04.14. + +28/Dic/01 +En los casos en los que no suponga una perdida de rendimiento +o memoria apreciable, no deberiamos permitir que comandos +ilegales enviados por otros nodos maten nuestro servidor. Lo mas +inteligente seria detectar el problema, hacer log y cortar el enlace +de forma permanente hasta que venga un IRCop y haga un "rehash" manual, +por ejemplo. + +Por ejemplo, el comando ":nombre_del_Servidor join #canal" mata un server. + +15/Nov/01 +Comentado por "SHauN": + +Porqué los servidores puestamente no admiten mayusculas en nombre o +identidades? Será depende del dia... porque hay dias que no hay dios que +entre con una identidad Mayus/Minus Porque el servidor te denega el accesso +con un mensaje: Bad Name/Ident i sin embargo otros dias por el mismo +servidor no hay ningun problema? + +Comprobarlo y solucionarlo. + +12/Nov/01 +"/trace pepe pepe.*" muestra dos veces un mensaje de "no such server". + +12/Nov/01 +Zoltan: +Para acabar, hay un bug, para meter en el todo.jcea... Ocurre que si un usuario con modos +r o +rh, recibe un rename, +no se manda al usuario los modos que se pierden. +Sé que hoy por hoy, un usuario con +r no recibe renames, pero según tu Web, hay la intención de hacer renames a los +usuarios tras un cambio de contraseña..... y ha se solucionar esto para que el usuario pueda ver los modos que se +pierden + +Es más grave si haces un "ghost" por "nick", ya que te hace un +"rename" del nick, pero no libera modos. + +30/Oct/01 + Ahora mismo, el raw 319, cuando nos devuelve, al hacer un whois, la lista +de canales, lo hace mostrando el orden en que hemos entrado a los canales, +ordenados del mas reciente al primero. Pienso que sería de más utilidad +tener dicha lista ordenada alfabeticamente, pues a nadie le interesa el +orden en que uno entra a los canales, pero si puede ser útil tener esa lista +ordenada alfabeticamente para cuando queremos ver si fulanito está en tal o +cual canal, y máxime desde que carme y retevision admiten 15 canales a la +vez para users. Por lo tanto, devolver la lista ordenada sería lo más +práctico. Para ello, o bien se va reordenando la lista que guarda en memoria +los canales de cada usuario, cada vez que un usuario entra en un canal, (lo +que pienso que es gastar cpu y tiempo de ejecución a lo tonto) o, +simplemente, cuando se va a mostrar esa información, procesarla y devolverla +ordenada alfabeticamente. + + Saludos, + +NiKoLaS + +19/Sep/01 +Para facilitar la tarea de bots de control de proxies abiertos, +la verificacion de GLINES debe hacerse *ANTES* de expulsar +a un usuario por socks abierto. + +El problema es que las GLINES no se pueden cambiar de posicion +ya que dependen del DNS inverso y en IDENT. + +Una posibilidad es que cuando hay un socks abierto, se ponga una +marca al usuario, y se le deje continuar. Una vez validadas las +GLINES, comprobamos dicha marca y nos lo cargamos si es menester. + +18/Sep/01 +Cambios de nick y de ciertos modos (en especial +h y +x) deben +borrar la caché de IP virtual de ese nick. + +07/Sep/01 +Entrando a traves de un nodo que no tolera el +x, si hago un +whois a un usuario con IP virtual en la tabla "v", aparece su +IP virtual "real", no la de la tabla. + +Eso pasa para gente que cuando entra lo hace con /nick nick:clave, +no con /server server puerto clave + +Se puede comprobar haciendo un "/who 0 o", habiendo entrado +por un tunel de Argo. + +EXPLICACION ADICIONAL: + +Si compilamos un IRCD con "BDD_VIP2 : HISPANO/ESNET: Ocultación de IP de TODOS los usuarios [N/y/?]" +y "NO", entonces el servidor no permitirá que los usuarios locales se pongan +x, pero si que +aceptara +x de usuarios de otros nodos de la red. + +El problema es que si un usuario conecta y activa su +x una vez +que ya esta conectado (por ejemplo, porque entro con un nick que no era +r) +entonces se calculara su IP virtual de forma estandar, y no se mostrara la +IP virtual que corresponde a ese nick segun la tabla "v", de existir. + +Este bug solo es visible cuando el nick al que hacemos "whois" +tiene una entrada personalizada en la tabla "v". + +31/Ago/01 +Si un usuario con IP virtual en tabla "v" entra por un servidor +que no tolera +x, evidentemente no se vera su IP virtual por BDD. + +17/Ago/01 +Dado que la gente es incapaz de trabajar (no digo recordar :-) +las claves seguras de 12 caracteres del "+r", ademas del problema +de solo poder usar 64 caracteres y, pero, solo 4 caracteres al +principio de cada grupo, seria mas interesante que en vez de que +los usuarios metan la clave directamente, meter un texto largo +y calcular su HASH. De esa forma es más fácil aprovechar los +64 bits de verdad, aun con claves relativamente "recordables". + +16/Ago/01 +Persiste el problema de que algunos usuarios ven IPs virtuales +incorrectas si un usuario cambia de nick, y ambos nicks tienen +IPs virtuales diferentes (solo posible si al menos uno de ellos +tiene entrada en la tabla "v", o hay un cambio de clave +de proteccion de IP por medio). + +27/Jul/01 +En el MOTD deberia salir una frase al azar, en plan "fortune". + +25/Jul/01 +Pensar sobre la conveniencia de ampliar el limite de +30 "bans" que tienen ahora los canales. + +22/Jun/01 +Cuando se compacta la base de datos, debe realizarse en un "thread" o +proceso aparte, para no dejar de gestionar las conexiones durante +periodos prolongados. Dicha tarea aparte debe avisar al servidor +principal de su finalizacion, para que haga un "rehash" y recargue +la base de datos, incluyendo la validacion de su "hash". + +14/Jun/01 +> >Se supone que si pongo un ban a alguien solo por su nick (nick!*@*), el +> >tipo no puede hablar si esta en el canal, y no puede entrar si sale e +> >intenta volver a entrar, no ? Bueno, esto funciona. +> > +> >Pero y si el tipo se cambia el nick? Puede volver a entrar en el canal y +> >hablar, pero si luego se vuelve a poner el otro nick (el que estaba +> >baneado) ... puede seguir hablando ? Es lo que me ha pasado a mi. Esto es +> >correcto? Si hay un ban para un nick, por que si se lo cambia y despues +> >vuelve al nick baneado, ese ban no le afecta ya ? + +06/Jun/01 +Pensar sobre la conveniencia de que los usuarios +normales no puedan ver el nodo por el que se +conecta otro usuario. + +Cambiar el "wallops" para que en vez de mandar solo a +Opers e IRCops, mande a todos los que tienen +w, y restringir +dicho modo a Opers e IRCops. Esto es mas claro y logico. + +17/May/01 +Con u2.10.H.02.44, el modo "+w" es ignorado a menos +que seamos tambien "+o" o "+h". Lo logico seria que +el modo "+w" solo se pueda poner si somos "+h" o "+o", +o que su funcionalidad se pase a una máscara "+s". + +26/Abr/01 +El notice que informa del "silence" deberia +enviarse en la misma rutina que envia el "silence" en +si, para evitar duplicar codigo. + +Ojo cuando se manda un mensaje a varios destinos. + +25/Abr/01 +Meter RC4 en el servidor, tanto para los enlaces +server<->server como server<->cliente. + +16/Abr/01 +* 2001/04/16 jc...@ar... (Z11 - u2.10.H.02.27) FIX + ----------------------------------------------------------------------- + Bug comunicado por {^DaNi^}. + + Los contadores de la zlib hace "wrap". Entre otros efectos, el nivel + de compresion informado es incorrecto. + + Soluciono el problema manteniendo un contador separado, que se actualiza + sumandole el valor de los contadores zlib antes y despues de la llamada, + considerando tambien el caso especial del wrapping. + + Observo que la rutina original del IRCD tambien hace wrapping. + + Ello es visible, por ejemplo, cada 2000 gigas o 2000 millones de + mensajes transferidos sin split. + + En IRC-Hispano, a fecha de hoy, supondría tener enlaces sin caidas + durante unos ocho meses. Por lo tanto, no me preocupo de este tema + de momento... + +11/Abr/01 +Por defecto, solo se deberia mostrar canales +con mas de X usuarios. + +22/Mar/01 +Tener un sistema para poder hacer seguimientos +de cambios de un nick determinado, aunque no +estemos en un canal comun. + +11/Ene/01 +[21:21] <DjAcE> creo que tengo un pequeqo bug +[21:22] <jcea> :) +[21:22] <DjAcE> /who #hacking x% no devuelve nada +[21:22] <DjAcE> pero si le metes el formato del who +[21:22] <DjAcE> p.e. /who #hackers x%cn +[21:22] <DjAcE> entonces si + +13/Dic/00 +El servidor deberia reconocer un "nick *" +como una orden para ponerse un nick +de la forma "invnnnnnn". Esto es util +para temas como el IRCQ, y demas +servicios automaticos. + +07/Dic/00 +Cuando un usuario cambia de nick, su IP virtual no +se recalcula. + +24/Nov/00 +Con las nuevas reglas de acceso a la BDD, si se an~aden +nuevas tablas o registros confidenciales, los viejos +nodos los seguiran mostrando mientras no se actualicen. + +16/Nov/00 +Cada vez que cambias de nick, el server te informa de +tu nueva IP virtual... que es la misma. Al menos es la +misma si solo tienes el flag "+x". + +16/Nov/00 +Si tenemos los flags "ohX", y nos quitamos el +"oh", el "X" permanece. + +14/Nov/00 +El lag calculado para "/map" debe actualizarse +en mas ocasiones que "CREATE". Por ejemplo, cuando +entra un nick nuevo, o cuando un usuario cambia de nick. + +En general, cuando se mande un "timestamp". + +14/Nov/00 +En los nodos sin usuarios no es facil calcular +el lag. En esos casos es mejor imprimir un "?" +a imprimir 0 segundos. + +19/Oct/00 +El "make config" debe obligar a que el usuario introduzca +un usuario/grupo correcto, que sino luego falla el +"make install". + +La gente es boba... + +17/Oct/00 +En canales con muchos usuarios tenemos dos problemas: + +a) La gente se cae por flood cuando el servidor le manda + la lista de usuarios del canal. + +b) Mucho trafico "espureo" en el canal, con todas + las entradas y salidas del mismo. + +17/Oct/00 +Un "/list" no deberia sacar un listado extenso de canales. +De hecho, deberia limitarse el numero de canales mostrados +por cualquier "list", indicando, en caso preciso, que hay +mas canales pero se requiere una consulta mas especifica. + +El problema es que cuando se busca por "topic" o por +nombre de canal, por ejemplo, el filtrado en si lo hace +el cliente, no el servidor!. O eso es lo que pasa en +el mIRC. + +16/Oct/00 +El mensaje de "Too many connections from same IP for *.*.*.*" +no deberia ser visible para usuarios normales. + +15/Oct/00 +Cuando usamos el modo +x en un canal, deberia aparecer ++x-x, para que no quede como "modo" del canal. + +Claro que esto tiene la ventaja de que se sabe que +se ha usado un modo "x" en un canal determinado, porque +queda constancia. Pero esto solo lo ve la gente que +estaba en el canal en el momento de usarlo. + +05/Oct/00 +Cuando entra en un canal alguien con IP virtual, +los que no tienen +X reciben la virtual, y los que +tienen +X DEBERIAN recibir la real. + +Ahora mismo todo el mundo recibe la virtual, incluyendo +la gente con +X. Ello obliga a hacer un WHOIS aparte, +y puede crear conflictos con los sistemas de cache +de muchos clientes IRC. + +Lo mismo se aplica para privsmg, part, quit, etc. + +28/Jun/00 +Eliminar la cache interna del IRCD para DNS. + +23/Jun/00 +?Que informacion se guarda en el WHOWAS si un usuario sale +y nadie en el nodo local le ha hecho un who/whois? + +22/Jun/00 +Cuando sabemos que es un usuario, deberia completarse la +posible negociacion con "REJ". + +22/Jun/00 +Si ACK sin REQ previo, cortar enlace. + +14/Jun/00 +Si un leaf tiene un numero de serie mayor que su HUB, +le intenta introducir registros que este ignora. Esto +supone trafico extra innecesario, y si el leaf tenia +el grifo abierto -> split. + +a) El HUB no debe responder a "B". +b) En el join, el HUB debe indicar al otro extremo + que no va a aceptar registros provenientes de el. + +12/Jun/00 +Estudiar la interaccion entre las microrafagas +y que algunas de las conexiones en modo "microrafaga" +se corte de forma abrupta antes de cerrar +la "microrafaga". + +04/May/00 +A veces "stats l" filtra informacion sobre +conexiones de usuarios. + +19/Abr/00 +Las GLINEs deberian validarse tambien contra las +IPs virtuales. + +18/Abr/00 +Si se hace un /whois IPvirtual, no dice que este +conectado, aunque asi sea. + +28/Mar/00 +Probando "/who" no deberia ser posible sacar la +IP de un usuario con IP virtual. + +Tampoco deberia ser posible localizar clones cuando +algunos de los usuarios tienen IP virtual y otros no. + +23/Mar/00 + An~adir una base de datos con clave + el nombre de un nodo y valor un mensaje + que se muestra a todos los usuarios que se + conectan por dicho nodo. + +22/Mar/00 + Se veian las IPs reales en los "notice" que envia el servidor cuando + un usuario entra o sale, si se tiene la mascara "+s" apropiada activada. + + La solucion es que ese flag solo este disponible para Helpers e IRCops. + + Se visualiza la IP real cuando un usuario intenta + conectar y: + + - La conexion esta prohibida + - Demasiadas conexiones para la clase + - Demasiadas conexiones para la IP + + Esto se soluciona sin mas que definir esos mensajes + como aptos de ser recibidos exclusivamente por IRCops + y Helpers + +09/Mar/00 +Posibilidad de corromper una base de datos: + +Si durante la transferencia de una base de datos se +detecta que esta corrupta (por ejemplo, porque se +hace un "rehash" mientras tanto), el nodo borra su BDD +local, pero le estan llegando registros nuevos, asi que +perdera los primeros. + +El otro extremo no se entera porque no detecta que se le +ha indicado base de datos corrupta, porque en ese +momento tiene el grifo cerrado. + +Una posibilidad es que cuando se envie el fin de una BDD +se envie su HASH. Si en el receptor no coinciden, borra +la BDD y la pide otra vez. + +09/Mar/00 +En algunos servidores aparecen algunas lineas en blanco +en las bases de datos en disco. Creo que mete las lineas +en blanco al final del fichero, cuando ocurre algo +"especial", y a medida que se van an~adiendo registros, +esas lineas acaban por aparecer por medio. + +Estudiando el codigo no hay muchas posibilidades. Como +no sea al compactar... + +29/Feb/00 +Peticion de Trebolin. +Los usuarios con clones deberian poder consultar el numero +de clones que tienen disponibles, asi como su fecha de +alta y de expiracion. + +21/Feb/00 +Las ILINES deben ser "case insensible", y lo que +se propaga por base de datos debe ser minusculas. +Corregir las que ya estan metidas. + +18/Feb/00 +Cuando un cliente sale del IRC, se almacena en el WHOWAS +su IP cifrada si estaba protegido. Los Operadores de la +red deberian tener acceso tambien a la IP real. + +08/Feb/00 +Aunque un Channel Service puede enviar mensajes a todos +los miembros de un canal, dichos mensajes aparecen +dentro del canal, como si el CS estuviese dentro, +no como un mensaje Global. + +24/Ene/00 +Cuando no se puede completar una verificacion SOCKS, +el cliente entra, y deberia salirle algun mensaje +en pantalla. + +20/Ene/00 +Cuando un usuario con nick registrado se pone un nick +sin registrar, aparece su IP real. Perfecto. Lo malo +es que si luego recupera su nick registrado, +su nick antiguo y su IP real aparecen en un "/whowas". + +19/Ene/00 +Verificar que cuando un servidor no inicia una conexion, +no envia la negociacion de BDD *ANTES* de haber +recibido la identificacion PASS/SERVER del otro +extremo. + +Ello puede provocar el envio de varios segmentos +de claves repetidos. El sistema lo descarta +automaticamente, pero supone un consumo de CPU +y ancho de banda. + +18/Ene/00 +Cuando se envia el informe de SOCKS abierto, deberia +esperarse a tener la resolucion inversa. + +18/Ene/00 +Cuando un proxy es inseguro, deberia enviarse +al usuario a alguna pagina con informacion +sobre el tema. + +17/Ene/00 +?Cuanto dura una entrada en IPcheck, si el usuario +no esta conectado?. + +10/Ene/00 +No todas las BDD deben normalizarse a minusculas. + +10/Ene/00 +Alguna forma para borrar TODAS las bases de datos +de un nodo determinado. + +07/Ene/00 +Cuando se realiza una compactacion de una base de datos, +debe propagarse tambien su HASH. Si tras compactar la +base de datos, el HASH no coincide, deberia borrarse +y solicitar una nueva copia a la red. + +04/Ene/00 +Los registros BDD que llegan a ver visibles FUERA del +modulo s_bdd.c no deberian contener informacion +no necesaria para las rutinas externas, como +el formato interno, el destino, etc. + +Ademas, el destino es accesible para el comando "dbq". + +04/Ene/00 +Deberian poder enviarse globales a canales, aunque +estos tengan modo "+n". + +03/Ene/00 +A la hora de contar los clones, tambien se cuentan las +conexiones de los propios servidores. + +Curiosamente solo se tiene en cuenta cuando somos nosotros +quienes recibimos la conexion, no quien la inicia. Ello hace +que los contadores sean diferentes en cada nodo de la red. + +16/Dic/99 +Posibilidad de que un usuario pueda ponerse la +etiqueta de "no publicidad". + +16/Dic/99 +Los mensajes globales que provengan de determinados +nicks deben consultar una base de datos para cambiar +su procedencia (por ejemplo, todo lo que venga de +"global" que aparezca desde el bot "publicidad", que +realmente no existe). De esta forma se puede cambiar +facilmente la apariencia de los mensajes, sin hacer +nada especial, y permite que los usuarios bloqueen +los mensajes de forma selectiva. + +13/Dic/99 +Reaparecen viejos fantasmas. Algunas veces un servidor +no permite la conexion del numero de usuario que tiene +permitidos por clones. No parece haber ninguna razon +para ello, ninguna regla. + +Por ejemplo, entro dos clones desde +"castor.argo.es", pero al intentar hacer lo mismo desde +"corinto.argo.es", me dice que ya tengo dos clones +(al intentar meter el segundo), y solo me admite +una conexion. + +05/Nov/99 +A medida que la red crezca, sera mas necesario el +adoptar ciertas protecciones ante nodos maliciosos, +ya que al delegar multitud de actividades de gestion +en los nodos, estos deben ser relativamente confiables. + +Es posible, por ejemplo, ampliar el comando "nick" +para que envie una prueba de que el nodo conoce +la clave del usuario; esa prueba puede ser +verificada por cualquier nodo que SI la conozca, +especialmente los nodos de control. + +05/Nov/99 +Los comandos NICK+MODE suelen ir juntos, especialmente +cuando estamos hablando de nicks registrados. Deberiamos +pensar en un comando nuevo que unificase ambos. + +03/Nov/99 +Las estructuras HASH deberian ocupar una o mas +"cache lines" (32bytes en Intel, 64bytes Athlon). + +03/Nov/99 +El taman~o de las estructuras HASH para cada +BDD deberia depender de: + +a) El numero de registros +b) El numero de accesos por segundo + +De esa forma no se desperdicia tanta +memoria como ahora, ni se penaliza la +velocidad de acceso de las tablas realmente +criticas. + +02/Nov/99 +Cuando se ordena el borrado de una BDD, no podemos +estar seguros de que el HUB haya propagado la orden +a traves de la red ANTES de cortar sus enlaces +con el resto de nodos. + +Por ello a veces es preciso borrar una base de datos +varias veces, para que se entere toda la red. + +02/Nov/99 +Deberia definirse un "pool" de structuras hash +para no tener que hacer un malloc para cada una +de ellas. Es decir, algo como hacer malloc de +grupos de 100 estructuras, por ejemplo. De esta +forma la peticiones de memoria son mas rapidas, +y la carga en memoria del malloc es menor +(porque se pide un objeto grande en vez de muchos +pequen~os). + +27/Oct/99 +Cuando un mismo registro tiene varios destinatarios, +en cada servidor se almacena en memoria solo el mas +reciente cuya mascara sea valida para ese servidor. + +Deberia almacenarse el que tenga la mascara +mas especifica. El problema es programar esto. + +Lo sencillo seria que mascaras mas especificas +sencillamente son mas largas, pero eso no vale +para "*.irc-hispano.org". + +Otra posibilidad es simplemente contar el numero +de caracteres que "absorbe" cada comodin. A mas +absorcion, menos especifico. Pero esto es equivalente +a lo anterior. + +Si forzamos a que la parte "irc-hispano.org" sea siempre +sustituida por un "*", se puede usar una metrica de +este tipo. + +De todas formas, es cierto que "*.org" es mas especifico +que "*". + +27/Oct/99 +Conservar en memoria exclusivamente un indice +a la posicion en la BDD en disco. La BDD se +mapea en memoria con un mmap. + +Ojo con la entrada de nuevos registros (hay +que ampliar el mmap), con su borrado y, +sobre todo, con la compactacion de la BDD. + +Aunque este sistema es rapido y ocupa muy poca +memoria, tiene el problema del arranque, cuando +hay que leer la BDD a memoria. Tal vez sea +conveniente adoptar alguna herramienta tipo GDBM. +El problema de ese enfoque es comprobar la +integridad de la BDD, ademas de que las +compactaciones seguirian siendo lentas. + +21/Oct/99 +La compactacion destruye registros cuando +estos no son para "*". Eso es asi porque +cuando se van a buscar, no existen en +el server local a menos que la mascara +de destinatario haga match con el server. + +21/Oct/99 +Soporte para IPs privadas en la red, a traves +de una BDD, con registros especificos para +cada nodo de la misma. + +Esto es especialmente importante en los +nuevos nodos que entren, pertenecientes +a redes de cable. + +Las direcciones propagadas deberian ser +de la forma "17.1.168.192.gaia.irc-hispano.org", +para permitir una delegacion DNS simple. + +Los nodos no deben propagar la posible +resolucion interna, porque solo es valida +de forma local, y puede propagar +informacion confidencial. + +15/Oct/99 +Poner los HASHES con mmap(), para no tener +que hacer tantas operaciones cuando se reciben +registros nuevos. + +?Que ocurre si alguien borra el fichero o reduce +su taman~o mientras tenemos el mmap? + +13/Oct/99 +La compactacion no elimina registros duplicados. +Ese es un problema cuando, por ejemplo, un usuario +cambia muchas veces la clave de nick entre dos +claves distintas. Los registros con la clave +actual seran mantenidos siempre. + +11/Oct/99 +Tenemos problemas si una BDD se borra si ese nodo +tiene varias vias de actualizacion (HUB). Ver documentacion +online. + +El parche DB25 soluciona el problema, pero es bastante +chapucero. Hay que pensar algo mejor. + +08/Oct/99 +Imprimir NOTICES a los ircops en puntos estrategicos: + Borrado de la base de datos + Compactacion + Preguntas remotas + +08/Oct/99 +Cuando un servidor detecta que una de sus BDD +esta corrupta, solicita una copia nueva a TODOS +sus enlaces. Si es un HUB, ello supone: + + * Que recibira actualizaciones por todos sus enlaces + * Que enviara dichas actualizaciones por todos los enlaces + +Esto es un consumo de ancho de banda y CPU importante, +aunque solo se produce en los HUBs con BDD corrupta. + +Esto es aplicable tambien cuando un HUB con varios HUBS +se conecta a ellos y tiene una version inferior a la suya. + + + Index: ircdh/lazyserver.jcea diff -u ircdh/lazyserver.jcea:1.1.1.1 ircdh/lazyserver.jcea:removed --- ircdh/lazyserver.jcea:1.1.1.1 Fri Jul 26 14:58:22 2002 +++ ircdh/lazyserver.jcea Thu Jan 23 03:08:12 2003 @@ -1,72 +0,0 @@ -$Id: lazyserver.jcea,v 1.1.1.1 2002/07/26 21:58:22 zolty Exp $ - -14/Jun/00 -Con la tecnologia de IRC sobre tuneles IP que he -desarrollado (http://www.argo.es/clones/clones2.html), el -interes por los "Lazy server" se diluye un poco, salvo -por el hecho de que ello ahorraria CPU y ancho de banda. - -Se necesitaria un comando "setip" para fijar la IP y HOST. -Este comando deberia estar permitido SOLO desde ciertas -IPs (en particular 127.0.0.1). - -22/Dic/99 - -Cuando en un sitio hay varios clientes, no tiene sentido que -todos ellos se conecten al servidor, sino que lo mas rentable -es que hubiese un servidor local. La ventaja es mayor, incluso, -cuando los usuarios tienen canales comunes, etc. - -Pero un servidor local no siempre es factible ya que, por un -lado requiere un esfuerzo de administracion y, por otro, -los lugares donde resulta rentable no son CONFIABLES. - -Este proyecto pretende desarrollar un "lazy server". Es decir -un servidor que actue de proxy entre varios usuarios y un servidor -normal de la red. La red solo debe enviar una copia al proxy -de todas aquellos paquetes que deban ser recibido por uno o -mas usuarios del mismo. - -No basta con hacer proxy de "join", "privmsg", "notice", -"part", "quit", "squit", "mode" y alguno mas, ya que todos -los demas comandos del IRC deben poder ser enviados sin -problemas. Ello complica la parte del servidor de IRC en si, que -debe parchearse para poder soportar "lazyservers". Si un usuario -del proxy hace un "/version gaia.*", ese comando debe rutarse -por la red, y la respuesta debe llegar al usuario que hizo la -peticion, no a todo el mundo. - -De todas formas ese problema se soluciona -aparentemente- de forma -bastante sencilla. Practicamente los unicos cambios que serian -necesarios en el servidor serian: - -a) Fiarse del "from" que envia un "lazy server", si se corresponde - a nicks asignados. - -b) Permitir la entrada de un nuevo nick solo si su IP se corresponde - con una IP local. - -c) La mayoria de los comandos del proxy no tienen efecto hasta que - el servidor del que cuelga responde (por ejemplo, entradas - y salidas en canales). - -d) En aquellos comandos que un servidor debe enviar (respuesta) a - varios usuarios, el servidor debe ser parcheado para que - solamente envie una copia para todos los usuarios que - cuelgan del proxy. - -En una primera fase, el cambio mas sencillo en el servidor de IRC -seria: - -a) Anadir un nuevo comando para la entrada de "lazy servers". - -b) Cambiar las rutinas de "parsing" para que tengan en cuenta - el punto A anterior. - -c) cptr de estos clientes deberia ser el mismo. tal vez sea - necesaria una especie de "contador de referencias", asi como - una lista de nicks asociados. - -Una de las ventajas que abre este sistema, ademas de reducir -trafico, es la posibilidad de meter "clones" sin necesitar una IP -fija, a pesar del sistema de control de clones distribuido. Index: ircdh/tener_en_cuenta.jcea diff -u ircdh/tener_en_cuenta.jcea:1.1.1.1 ircdh/tener_en_cuenta.jcea:removed --- ircdh/tener_en_cuenta.jcea:1.1.1.1 Fri Jul 26 14:58:22 2002 +++ ircdh/tener_en_cuenta.jcea Thu Jan 23 03:08:12 2003 @@ -1,45 +0,0 @@ -$Id: tener_en_cuenta.jcea,v 1.1.1.1 2002/07/26 21:58:22 zolty Exp $ - -14/Ene/00 -Un proxy abierto puede pasar el chequeo si, por ejemplo, -la conexion del usuario completa la capacidad del -proxy, ya que este no tendra recursos para atender -la verificacion de la red. - -El problema se agrava por el hecho de que si eso -ocurre, la IP sera mantenida en cache y no pasara -mas comprobaciones de proxy durante 30 minutos. - -10/Ene/00 -Los modos +A y +S de canales, no son -representados por muchos clientes de IRC, -entre ellos el popular mIRC, a menos que se -este utilizando la version 5.61 o superior. - -10/Ene/00 -Las bases de datos de disco se pueden truncar a 0, -pero no borrar. - -22/Dic/99 -He hecho algunas pruebas para ver hasta que punto puede -resultar rentable en terminos de ancho de banda el -que la comunicacion entre servidores se realice usando -compresion GZIP. Para ello he generado un BURST y lo he -grabado en disco. Comprimido con GZIP, su tamano se -reduce a la mitad. - -La ganancia no es demasiado importante, por tanto. - -27/Oct/99 -Las BDD no residentes no se compactan, aunque -se marca la orden en disco. - -27/Oct/99 -Solo se conservan en memoria los registros -que afectan al servidor en concreto. - -27/Oct/99 -"make install" elimina las BDD que no se -estan empleando. Por tanto hay que modificar -el "Makefile" si se an~aden BDD nuevas. - Index: ircdh/todo.jcea diff -u ircdh/todo.jcea:1.5 ircdh/todo.jcea:removed --- ircdh/todo.jcea:1.5 Thu Aug 22 13:27:13 2002 +++ ircdh/todo.jcea Thu Jan 23 03:08:12 2003 @@ -1,753 +0,0 @@ -$Id: todo.jcea,v 1.5 2002/08/22 20:27:13 zolty Exp $ - -13/Ago/02 -La variable que contiene losmodos de usuario esta superpoblada y -apenas le queda ya algun bit libre. Habia que mover lo que son -flags internos del usuario (si se le ha hecho PING o no, si es TS8, etc) -a una variable separada, preferiblemente que exista SOLO cuando el -usuario/conexion es local. - -13/Ago/02 -Cuando un usuario esta silenciado, recibe un "notice" del servidor, -informandole de este hecho. Eso deberia cambiarse por un NUMERIC. - -06/Ago/02 -Poder poner, al conectar, una clave de servidor y otra de nick, al mismo tiempo. - -06/Ago/02 -Documentar en el registro (irc.org) correspondiente el uso -de QUITLEN y AWAYLEN. - -05/Ago/02 -Estudiar la conveniencia de que el taman~o del comentario de los -QUIT y de las GLINES no este vinculado a TOPICLEN. El problema se -nota cuando un usuario tiene una IP Virtual larga, que se puede -cortar cuando le cae una GLINE. - -29/Jul/02: -Canal con +n, status del usuario sin +o ni +v, ban al nick unicamente, -cuando se cambia de nick y se pone otra vez el baneado, puede escribir en el -canal :) - -25/Jul/02 -Cuando alguien se pone +x, deberia salirle publicidad -de la personalizacion de IPs Virtuales, tomando el -mensaje directamente de la BDD. - -09/Jul/02 -Si se configura el server con "BDD_VIP3", el usuario -solo deberia poder ponerse el "+x" si el nick -aparece en la tabla "v" o "w". - -Estudiar implicaciones en cosas como cambios de nick. - -24/Jun/02 -[13:16] <zolty> Cuando el servidor tiene activado el WATCH y un usuario -[13:16] <zolty> que monitorizamos y que no esta en nuestro servidor, -[13:16] <zolty> entra/sale de la red o cambia de nick, y el nick -[13:16] <zolty> esta en la tabla "v" o "w", la IP que aparece en el -[13:16] <zolty> WATCH que nos manda el servidor, es la ip virtual -[13:16] <zolty> normal, no la ip virtual personalizada que le -[13:16] <zolty> corresponde. -[13:16] <zolty> Cuando uno sale, se avisa el watch, antes de hacer -[13:16] <zolty> un "mode -r" y es muy raro, porque a la hora de enviar -[13:16] <zolty> el notify, AUN tiene el +r. -[13:16] <zolty> Cuando uno entra, se avisa el watch antes de recibir -[13:16] <zolty> un +r que vendra del nodo donde esta el usuario -[13:16] <zolty> monitorizado. - -21/Jun/02 -Comprobar que KICK, JOIN, PART efectivamente son ya -100% puros. - -12/Jun/02 -/server servidor puerto clave_server:clave_nick -/server servidor puerto clave_server!clave_nick - -12/Jun/02 -> /watch L -> 1 no esta en irc, ultimo paso el Tue May 21 17:30:18 2002 -> -> Sin embargo el usuario 1 jamas conecto al irc... propongo que se mande -> un tiempo 0 tal y como se hace al borrar al usuario de la lista, pero -> no el momento en que se añadio ese nick al watch. - -17/Abr/02 -En varios sitios aparecen numeros como 512, 510, etc., que -se utilizan como limitadores de la longitud de la linea -enviada o recibida, etc. Habria que transformar esos numeros -en un macro usado en todas partes. - -Eso incluye el nuevo macro MAXLEN introducido en 2.10.H.04.14. - -28/Dic/01 -En los casos en los que no suponga una perdida de rendimiento -o memoria apreciable, no deberiamos permitir que comandos -ilegales enviados por otros nodos maten nuestro servidor. Lo mas -inteligente seria detectar el problema, hacer log y cortar el enlace -de forma permanente hasta que venga un IRCop y haga un "rehash" manual, -por ejemplo. - -Por ejemplo, el comando ":nombre_del_Servidor join #canal" mata un server. - -15/Nov/01 -Comentado por "SHauN": - -Porqué los servidores puestamente no admiten mayusculas en nombre o -identidades? Será depende del dia... porque hay dias que no hay dios que -entre con una identidad Mayus/Minus Porque el servidor te denega el accesso -con un mensaje: Bad Name/Ident i sin embargo otros dias por el mismo -servidor no hay ningun problema? - -Comprobarlo y solucionarlo. - -12/Nov/01 -"/trace pepe pepe.*" muestra dos veces un mensaje de "no such server". - -12/Nov/01 -Zoltan: -Para acabar, hay un bug, para meter en el todo.jcea... Ocurre que si un usuario con modos +r o +rh, recibe un rename, -no se manda al usuario los modos que se pierden. -Sé que hoy por hoy, un usuario con +r no recibe renames, pero según tu Web, hay la intención de hacer renames a los -usuarios tras un cambio de contraseña..... y ha se solucionar esto para que el usuario pueda ver los modos que se -pierden - -Es más grave si haces un "ghost" por "nick", ya que te hace un -"rename" del nick, pero no libera modos. - -30/Oct/01 - Ahora mismo, el raw 319, cuando nos devuelve, al hacer un whois, la lista -de canales, lo hace mostrando el orden en que hemos entrado a los canales, -ordenados del mas reciente al primero. Pienso que sería de más utilidad -tener dicha lista ordenada alfabeticamente, pues a nadie le interesa el -orden en que uno entra a los canales, pero si puede ser útil tener esa lista -ordenada alfabeticamente para cuando queremos ver si fulanito está en tal o -cual canal, y máxime desde que carme y retevision admiten 15 canales a la -vez para users. Por lo tanto, devolver la lista ordenada sería lo más -práctico. Para ello, o bien se va reordenando la lista que guarda en memoria -los canales de cada usuario, cada vez que un usuario entra en un canal, (lo -que pienso que es gastar cpu y tiempo de ejecución a lo tonto) o, -simplemente, cuando se va a mostrar esa información, procesarla y devolverla -ordenada alfabeticamente. - - Saludos, - -NiKoLaS - -19/Sep/01 -Para facilitar la tarea de bots de control de proxies abiertos, -la verificacion de GLINES debe hacerse *ANTES* de expulsar -a un usuario por socks abierto. - -El problema es que las GLINES no se pueden cambiar de posicion -ya que dependen del DNS inverso y en IDENT. - -Una posibilidad es que cuando hay un socks abierto, se ponga una -marca al usuario, y se le deje continuar. Una vez validadas las -GLINES, comprobamos dicha marca y nos lo cargamos si es menester. - -18/Sep/01 -Cambios de nick y de ciertos modos (en especial +h y +x) deben -borrar la caché de IP virtual de ese nick. - -07/Sep/01 -Entrando a traves de un nodo que no tolera el +x, si hago un -whois a un usuario con IP virtual en la tabla "v", aparece su -IP virtual "real", no la de la tabla. - -Eso pasa para gente que cuando entra lo hace con /nick nick:clave, -no con /server server puerto clave - -Se puede comprobar haciendo un "/who 0 o", habiendo entrado -por un tunel de Argo. - -EXPLICACION ADICIONAL: - -Si compilamos un IRCD con "BDD_VIP2 : HISPANO/ESNET: Ocultación de IP de TODOS los usuarios [N/y/?]" -y "NO", entonces el servidor no permitirá que los usuarios locales se pongan +x, pero si que -aceptara +x de usuarios de otros nodos de la red. - -El problema es que si un usuario conecta y activa su +x una vez -que ya esta conectado (por ejemplo, porque entro con un nick que no era +r) -entonces se calculara su IP virtual de forma estandar, y no se mostrara la -IP virtual que corresponde a ese nick segun la tabla "v", de existir. - -Este bug solo es visible cuando el nick al que hacemos "whois" -tiene una entrada personalizada en la tabla "v". - -31/Ago/01 -Si un usuario con IP virtual en tabla "v" entra por un servidor -que no tolera +x, evidentemente no se vera su IP virtual por BDD. - -17/Ago/01 -Dado que la gente es incapaz de trabajar (no digo recordar :-) -las claves seguras de 12 caracteres del "+r", ademas del problema -de solo poder usar 64 caracteres y, pero, solo 4 caracteres al -principio de cada grupo, seria mas interesante que en vez de que -los usuarios metan la clave directamente, meter un texto largo -y calcular su HASH. De esa forma es más fácil aprovechar los -64 bits de verdad, aun con claves relativamente "recordables". - -16/Ago/01 -Persiste el problema de que algunos usuarios ven IPs virtuales -incorrectas si un usuario cambia de nick, y ambos nicks tienen -IPs virtuales diferentes (solo posible si al menos uno de ellos -tiene entrada en la tabla "v", o hay un cambio de clave -de proteccion de IP por medio). - -27/Jul/01 -En el MOTD deberia salir una frase al azar, en plan "fortune". - -25/Jul/01 -Pensar sobre la conveniencia de ampliar el limite de -30 "bans" que tienen ahora los canales. - -22/Jun/01 -Cuando se compacta la base de datos, debe realizarse en un "thread" o -proceso aparte, para no dejar de gestionar las conexiones durante -periodos prolongados. Dicha tarea aparte debe avisar al servidor -principal de su finalizacion, para que haga un "rehash" y recargue -la base de datos, incluyendo la validacion de su "hash". - -14/Jun/01 -> >Se supone que si pongo un ban a alguien solo por su nick (nick!*@*), el -> >tipo no puede hablar si esta en el canal, y no puede entrar si sale e -> >intenta volver a entrar, no ? Bueno, esto funciona. -> > -> >Pero y si el tipo se cambia el nick? Puede volver a entrar en el canal y -> >hablar, pero si luego se vuelve a poner el otro nick (el que estaba -> >baneado) ... puede seguir hablando ? Es lo que me ha pasado a mi. Esto es -> >correcto? Si hay un ban para un nick, por que si se lo cambia y despues -> >vuelve al nick baneado, ese ban no le afecta ya ? - -06/Jun/01 -Pensar sobre la conveniencia de que los usuarios -normales no puedan ver el nodo por el que se -conecta otro usuario. - -Cambiar el "wallops" para que en vez de mandar solo a -Opers e IRCops, mande a todos los que tienen +w, y restringir -dicho modo a Opers e IRCops. Esto es mas claro y logico. - -17/May/01 -Con u2.10.H.02.44, el modo "+w" es ignorado a menos -que seamos tambien "+o" o "+h". Lo logico seria que -el modo "+w" solo se pueda poner si somos "+h" o "+o", -o que su funcionalidad se pase a una máscara "+s". - -26/Abr/01 -El notice que informa del "silence" deberia -enviarse en la misma rutina que envia el "silence" en -si, para evitar duplicar codigo. - -Ojo cuando se manda un mensaje a varios destinos. - -25/Abr/01 -Meter RC4 en el servidor, tanto para los enlaces -server<->server como server<->cliente. - -16/Abr/01 -* 2001/04/16 jc...@ar... (Z11 - u2.10.H.02.27) FIX - ----------------------------------------------------------------------- - Bug comunicado por {^DaNi^}. - - Los contadores de la zlib hace "wrap". Entre otros efectos, el nivel - de compresion informado es incorrecto. - - Soluciono el problema manteniendo un contador separado, que se actualiza - sumandole el valor de los contadores zlib antes y despues de la llamada, - considerando tambien el caso especial del wrapping. - - Observo que la rutina original del IRCD tambien hace wrapping. - - Ello es visible, por ejemplo, cada 2000 gigas o 2000 millones de - mensajes transferidos sin split. - - En IRC-Hispano, a fecha de hoy, supondría tener enlaces sin caidas - durante unos ocho meses. Por lo tanto, no me preocupo de este tema - de momento... - -11/Abr/01 -Por defecto, solo se deberia mostrar canales -con mas de X usuarios. - -22/Mar/01 -Tener un sistema para poder hacer seguimientos -de cambios de un nick determinado, aunque no -estemos en un canal comun. - -11/Ene/01 -[21:21] <DjAcE> creo que tengo un pequeqo bug -[21:22] <jcea> :) -[21:22] <DjAcE> /who #hacking x% no devuelve nada -[21:22] <DjAcE> pero si le metes el formato del who -[21:22] <DjAcE> p.e. /who #hackers x%cn -[21:22] <DjAcE> entonces si - -13/Dic/00 -El servidor deberia reconocer un "nick *" -como una orden para ponerse un nick -de la forma "invnnnnnn". Esto es util -para temas como el IRCQ, y demas -servicios automaticos. - -07/Dic/00 -Cuando un usuario cambia de nick, su IP virtual no -se recalcula. - -24/Nov/00 -Con las nuevas reglas de acceso a la BDD, si se an~aden -nuevas tablas o registros confidenciales, los viejos -nodos los seguiran mostrando mientras no se actualicen. - -16/Nov/00 -Cada vez que cambias de nick, el server te informa de -tu nueva IP virtual... que es la misma. Al menos es la -misma si solo tienes el flag "+x". - -16/Nov/00 -Si tenemos los flags "ohX", y nos quitamos el -"oh", el "X" permanece. - -14/Nov/00 -El lag calculado para "/map" debe actualizarse -en mas ocasiones que "CREATE". Por ejemplo, cuando -entra un nick nuevo, o cuando un usuario cambia de nick. - -En general, cuando se mande un "timestamp". - -14/Nov/00 -En los nodos sin usuarios no es facil calcular -el lag. En esos casos es mejor imprimir un "?" -a imprimir 0 segundos. - -19/Oct/00 -El "make config" debe obligar a que el usuario introduzca -un usuario/grupo correcto, que sino luego falla el -"make install". - -La gente es boba... - -17/Oct/00 -En canales con muchos usuarios tenemos dos problemas: - -a) La gente se cae por flood cuando el servidor le manda - la lista de usuarios del canal. - -b) Mucho trafico "espureo" en el canal, con todas - las entradas y salidas del mismo. - -17/Oct/00 -Un "/list" no deberia sacar un listado extenso de canales. -De hecho, deberia limitarse el numero de canales mostrados -por cualquier "list", indicando, en caso preciso, que hay -mas canales pero se requiere una consulta mas especifica. - -El problema es que cuando se busca por "topic" o por -nombre de canal, por ejemplo, el filtrado en si lo hace -el cliente, no el servidor!. O eso es lo que pasa en -el mIRC. - -16/Oct/00 -El mensaje de "Too many connections from same IP for *.*.*.*" -no deberia ser visible para usuarios normales. - -15/Oct/00 -Cuando usamos el modo +x en un canal, deberia aparecer -+x-x, para que no quede como "modo" del canal. - -Claro que esto tiene la ventaja de que se sabe que -se ha usado un modo "x" en un canal determinado, porque -queda constancia. Pero esto solo lo ve la gente que -estaba en el canal en el momento de usarlo. - -05/Oct/00 -Cuando entra en un canal alguien con IP virtual, -los que no tienen +X reciben la virtual, y los que -tienen +X DEBERIAN recibir la real. - -Ahora mismo todo el mundo recibe la virtual, incluyendo -la gente con +X. Ello obliga a hacer un WHOIS aparte, -y puede crear conflictos con los sistemas de cache -de muchos clientes IRC. - -Lo mismo se aplica para privsmg, part, quit, etc. - -28/Jun/00 -Eliminar la cache interna del IRCD para DNS. - -23/Jun/00 -?Que informacion se guarda en el WHOWAS si un usuario sale -y nadie en el nodo local le ha hecho un who/whois? - -22/Jun/00 -Cuando sabemos que es un usuario, deberia completarse la -posible negociacion con "REJ". - -22/Jun/00 -Si ACK sin REQ previo, cortar enlace. - -14/Jun/00 -Si un leaf tiene un numero de serie mayor que su HUB, -le intenta introducir registros que este ignora. Esto -supone trafico extra innecesario, y si el leaf tenia -el grifo abierto -> split. - -a) El HUB no debe responder a "B". -b) En el join, el HUB debe indicar al otro extremo - que no va a aceptar registros provenientes de el. - -12/Jun/00 -Estudiar la interaccion entre las microrafagas -y que algunas de las conexiones en modo "microrafaga" -se corte de forma abrupta antes de cerrar -la "microrafaga". - -04/May/00 -A veces "stats l" filtra informacion sobre -conexiones de usuarios. - -19/Abr/00 -Las GLINEs deberian validarse tambien contra las -IPs virtuales. - -18/Abr/00 -Si se hace un /whois IPvirtual, no dice que este -conectado, aunque asi sea. - -28/Mar/00 -Probando "/who" no deberia ser posible sacar la -IP de un usuario con IP virtual. - -Tampoco deberia ser posible localizar clones cuando -algunos de los usuarios tienen IP virtual y otros no. - -23/Mar/00 - An~adir una base de datos con clave - el nombre de un nodo y valor un mensaje - que se muestra a todos los usuarios que se - conectan por dicho nodo. - -22/Mar/00 - Se veian las IPs reales en los "notice" que envia el servidor cuando - un usuario entra o sale, si se tiene la mascara "+s" apropiada activada. - - La solucion es que ese flag solo este disponible para Helpers e IRCops. - - Se visualiza la IP real cuando un usuario intenta - conectar y: - - - La conexion esta prohibida - - Demasiadas conexiones para la clase - - Demasiadas conexiones para la IP - - Esto se soluciona sin mas que definir esos mensajes - como aptos de ser recibidos exclusivamente por IRCops - y Helpers - -09/Mar/00 -Posibilidad de corromper una base de datos: - -Si durante la transferencia de una base de datos se -detecta que esta corrupta (por ejemplo, porque se -hace un "rehash" mientras tanto), el nodo borra su BDD -local, pero le estan llegando registros nuevos, asi que -perdera los primeros. - -El otro extremo no se entera porque no detecta que se le -ha indicado base de datos corrupta, porque en ese -momento tiene el grifo cerrado. - -Una posibilidad es que cuando se envie el fin de una BDD -se envie su HASH. Si en el receptor no coinciden, borra -la BDD y la pide otra vez. - -09/Mar/00 -En algunos servidores aparecen algunas lineas en blanco -en las bases de datos en disco. Creo que mete las lineas -en blanco al final del fichero, cuando ocurre algo -"especial", y a medida que se van an~adiendo registros, -esas lineas acaban por aparecer por medio. - -Estudiando el codigo no hay muchas posibilidades. Como -no sea al compactar... - -29/Feb/00 -Peticion de Trebolin. -Los usuarios con clones deberian poder consultar el numero -de clones que tienen disponibles, asi como su fecha de -alta y de expiracion. - -21/Feb/00 -Las ILINES deben ser "case insensible", y lo que -se propaga por base de datos debe ser minusculas. -Corregir las que ya estan metidas. - -18/Feb/00 -Cuando un cliente sale del IRC, se almacena en el WHOWAS -su IP cifrada si estaba protegido. Los Operadores de la -red deberian tener acceso tambien a la IP real. - -08/Feb/00 -Aunque un Channel Service puede enviar mensajes a todos -los miembros de un canal, dichos mensajes aparecen -dentro del canal, como si el CS estuviese dentro, -no como un mensaje Global. - -24/Ene/00 -Cuando no se puede completar una verificacion SOCKS, -el cliente entra, y deberia salirle algun mensaje -en pantalla. - -20/Ene/00 -Cuando un usuario con nick registrado se pone un nick -sin registrar, aparece su IP real. Perfecto. Lo malo -es que si luego recupera su nick registrado, -su nick antiguo y su IP real aparecen en un "/whowas". - -19/Ene/00 -Verificar que cuando un servidor no inicia una conexion, -no envia la negociacion de BDD *ANTES* de haber -recibido la identificacion PASS/SERVER del otro -extremo. - -Ello puede provocar el envio de varios segmentos -de claves repetidos. El sistema lo descarta -automaticamente, pero supone un consumo de CPU -y ancho de banda. - -18/Ene/00 -Cuando se envia el informe de SOCKS abierto, deberia -esperarse a tener la resolucion inversa. - -18/Ene/00 -Cuando un proxy es inseguro, deberia enviarse -al usuario a alguna pagina con informacion -sobre el tema. - -17/Ene/00 -?Cuanto dura una entrada en IPcheck, si el usuario -no esta conectado?. - -10/Ene/00 -No todas las BDD deben normalizarse a minusculas. - -10/Ene/00 -Alguna forma para borrar TODAS las bases de datos -de un nodo determinado. - -07/Ene/00 -Cuando se realiza una compactacion de una base de datos, -debe propagarse tambien su HASH. Si tras compactar la -base de datos, el HASH no coincide, deberia borrarse -y solicitar una nueva copia a la red. - -04/Ene/00 -Los registros BDD que llegan a ver visibles FUERA del -modulo s_bdd.c no deberian contener informacion -no necesaria para las rutinas externas, como -el formato interno, el destino, etc. - -Ademas, el destino es accesible para el comando "dbq". - -04/Ene/00 -Deberian poder enviarse globales a canales, aunque -estos tengan modo "+n". - -03/Ene/00 -A la hora de contar los clones, tambien se cuentan las -conexiones de los propios servidores. - -Curiosamente solo se tiene en cuenta cuando somos nosotros -quienes recibimos la conexion, no quien la inicia. Ello hace -que los contadores sean diferentes en cada nodo de la red. - -16/Dic/99 -Posibilidad de que un usuario pueda ponerse la -etiqueta de "no publicidad". - -16/Dic/99 -Los mensajes globales que provengan de determinados -nicks deben consultar una base de datos para cambiar -su procedencia (por ejemplo, todo lo que venga de -"global" que aparezca desde el bot "publicidad", que -realmente no existe). De esta forma se puede cambiar -facilmente la apariencia de los mensajes, sin hacer -nada especial, y permite que los usuarios bloqueen -los mensajes de forma selectiva. - -13/Dic/99 -Reaparecen viejos fantasmas. Algunas veces un servidor -no permite la conexion del numero de usuario que tiene -permitidos por clones. No parece haber ninguna razon -para ello, ninguna regla. - -Por ejemplo, entro dos clones desde -"castor.argo.es", pero al intentar hacer lo mismo desde -"corinto.argo.es", me dice que ya tengo dos clones -(al intentar meter el segundo), y solo me admite -una conexion. - -05/Nov/99 -A medida que la red crezca, sera mas necesario el -adoptar ciertas protecciones ante nodos maliciosos, -ya que al delegar multitud de actividades de gestion -en los nodos, estos deben ser relativamente confiables. - -Es posible, por ejemplo, ampliar el comando "nick" -para que envie una prueba de que el nodo conoce -la clave del usuario; esa prueba puede ser -verificada por cualquier nodo que SI la conozca, -especialmente los nodos de control. - -05/Nov/99 -Los comandos NICK+MODE suelen ir juntos, especialmente -cuando estamos hablando de nicks registrados. Deberiamos -pensar en un comando nuevo que unificase ambos. - -03/Nov/99 -Las estructuras HASH deberian ocupar una o mas -"cache lines" (32bytes en Intel, 64bytes Athlon). - -03/Nov/99 -El taman~o de las estructuras HASH para cada -BDD deberia depender de: - -a) El numero de registros -b) El numero de accesos por segundo - -De esa forma no se desperdicia tanta -memoria como ahora, ni se penaliza la -velocidad de acceso de las tablas realmente -criticas. - -02/Nov/99 -Cuando se ordena el borrado de una BDD, no podemos -estar seguros de que el HUB haya propagado la orden -a traves de la red ANTES de cortar sus enlaces -con el resto de nodos. - -Por ello a veces es preciso borrar una base de datos -varias veces, para que se entere toda la red. - -02/Nov/99 -Deberia definirse un "pool" de structuras hash -para no tener que hacer un malloc para cada una -de ellas. Es decir, algo como hacer malloc de -grupos de 100 estructuras, por ejemplo. De esta -forma la peticiones de memoria son mas rapidas, -y la carga en memoria del malloc es menor -(porque se pide un objeto grande en vez de muchos -pequen~os). - -27/Oct/99 -Cuando un mismo registro tiene varios destinatarios, -en cada servidor se almacena en memoria solo el mas -reciente cuya mascara sea valida para ese servidor. - -Deberia almacenarse el que tenga la mascara -mas especifica. El problema es programar esto. - -Lo sencillo seria que mascaras mas especificas -sencillamente son mas largas, pero eso no vale -para "*.irc-hispano.org". - -Otra posibilidad es simplemente contar el numero -de caracteres que "absorbe" cada comodin. A mas -absorcion, menos especifico. Pero esto es equivalente -a lo anterior. - -Si forzamos a que la parte "irc-hispano.org" sea siempre -sustituida por un "*", se puede usar una metrica de -este tipo. - -De todas formas, es cierto que "*.org" es mas especifico -que "*". - -27/Oct/99 -Conservar en memoria exclusivamente un indice -a la posicion en la BDD en disco. La BDD se -mapea en memoria con un mmap. - -Ojo con la entrada de nuevos registros (hay -que ampliar el mmap), con su borrado y, -sobre todo, con la compactacion de la BDD. - -Aunque este sistema es rapido y ocupa muy poca -memoria, tiene el problema del arranque, cuando -hay que leer la BDD a memoria. Tal vez sea -conveniente adoptar alguna herramienta tipo GDBM. -El problema de ese enfoque es comprobar la -integridad de la BDD, ademas de que las -compactaciones seguirian siendo lentas. - -21/Oct/99 -La compactacion destruye registros cuando -estos no son para "*". Eso es asi porque -cuando se van a buscar, no existen en -el server local a menos que la mascara -de destinatario haga match con el server. - -21/Oct/99 -Soporte para IPs privadas en la red, a traves -de una BDD, con registros especificos para -cada nodo de la misma. - -Esto es especialmente importante en los -nuevos nodos que entren, pertenecientes -a redes de cable. - -Las direcciones propagadas deberian ser -de la forma "17.1.168.192.gaia.irc-hispano.org", -para permitir una delegacion DNS simple. - -Los nodos no deben propagar la posible -resolucion interna, porque solo es valida -de forma local, y puede propagar -informacion confidencial. - -15/Oct/99 -Poner los HASHES con mmap(), para no tener -que hacer tantas operaciones cuando s... [truncated message content] |
From: Toni G. <zo...@us...> - 2003-02-01 17:57:24
|
CVSROOT : /cvsroot/irc-dev Module : ircdh Commit time: 2003-02-01 17:57:21 UTC Modified files: ChangeLog Makefile.in configure configure.in doc/ejemplo.conf doc/example.conf include/ircd_features.h include/patchlevel.h include/s_conf.h include/supported.h ircd/Makefile.in ircd/ircd_features.c ircd/ircd_lexer.l ircd/ircd_parser.y ircd/m_links.c ircd/m_map.c ircd/m_watch.c ircd/s_conf.c ircd/s_err.c ircd/s_stats.c Log message: 2003-02-01 Toni Garcia <zo...@ir...> 1.0.alpha17 * ircd/ircd_parser.y: Soporte de Elines. * ircd/ircd_lexer.l: Soporte de E-lines. * ircd/stats.c: Soporte de E-lines. * {include|ircd}/s_conf{h.c}: Soporte de E-lines. * ircd/m_map.c: Fix, hacia crash al hacer el map. * ircd/s_conf.c: Limpieza de funciones antiguas. * ircd/m_watch.c: feature_int() para el limite de watchs. * {include|ircd}/ircd_features.{h|c}: Actualizacion valores por defecto y agrego el valor de MAXWATCHS. ---------------------- diff included ---------------------- Index: ircdh/ChangeLog diff -u ircdh/ChangeLog:1.11 ircdh/ChangeLog:1.12 --- ircdh/ChangeLog:1.11 Sun Jan 19 13:20:25 2003 +++ ircdh/ChangeLog Sat Feb 1 09:57:10 2003 @@ -1,3 +1,22 @@ +2003-02-01 Toni Garcia <zo...@ir...> 1.0.alpha17 + * ircd/ircd_parser.y: Soporte de Elines. + + * ircd/ircd_lexer.l: Soporte de E-lines. + + * ircd/stats.c: Soporte de E-lines. + + * {include|ircd}/s_conf{h.c}: Soporte de E-lines. + + * ircd/m_map.c: Fix, hacia crash al hacer el map. + + * ircd/s_conf.c: Limpieza de funciones antiguas. + + * ircd/m_watch.c: feature_int() para el limite de watchs. + + * {include|ircd}/ircd_features.{h|c}: Actualizacion valores por defecto y + agrego el valor de MAXWATCHS. + + 2003-01-19 Toni Garcia <zo...@ir...> 1.0.alpha16 * ircd/s_conf.c: Clase Alfanumerica y nuevo ircd.conf. Index: ircdh/Makefile.in diff -u ircdh/Makefile.in:1.3 ircdh/Makefile.in:1.4 --- ircdh/Makefile.in:1.3 Sat Jan 18 11:09:00 2003 +++ ircdh/Makefile.in Sat Feb 1 09:57:10 2003 @@ -146,8 +146,8 @@ # Indent all headers and source files: indent: - @test "`indent --version`" = "GNU indent 2.2.6" || \ - (echo "You need GNU indent 2.2.8a; See doc/readme.indent" && exit -1); + @test "`indent --version`" = "GNU indent 2.2.7" || \ + (echo "You need GNU indent 2.2.7; See doc/readme.indent" && exit -1); VERSION_CONTROL=none indent include/*.h ircd/*.c # do a cvs update Index: ircdh/configure diff -u ircdh/configure:1.5 ircdh/configure:1.6 --- ircdh/configure:1.5 Sat Jan 18 14:54:26 2003 +++ ircdh/configure Sat Feb 1 09:57:10 2003 @@ -1,71 +1,325 @@ #! /bin/sh - # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# Generated by GNU Autoconf 2.57. # +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + -# Defaults: -ac_help= +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# ac_default_prefix=/usr/local -# Any additions from configure.in: +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="ircd/ircd.c" ac_default_prefix=$HOME -ac_help="$ac_help - --enable-poll Force poll to be used regardless of whether or not - it is a system call" -ac_help="$ac_help - --enable-debug Turn on debugging mode" -ac_help="$ac_help - --disable-asserts Disable assertion checking" -ac_help="$ac_help - --disable-symbols Disable debugging symbols (remove -g from CFLAGS)" -ac_help="$ac_help - --enable-profile Enable profiling support (add -pg to CFLAGS)" -ac_help="$ac_help - --enable-pedantic Enable pedantic warnings (add -pedantic to CFLAGS)" -ac_help="$ac_help - --enable-warnings Enable warnings (add -Wall to CFLAGS)" -ac_help="$ac_help - --disable-inlines Disable inlining for a few critical functions" -ac_help="$ac_help - --disable-devpoll Disable the /dev/poll-based engine" -ac_help="$ac_help - --disable-kqueue Disable the kqueue-based engine" -ac_help="$ac_help - --with-symlink=name Name to give the symlink; if name is "no," no - symlink will be created." -ac_help="$ac_help - --with-mode=mode Permissions (in octal) to give the binary" -ac_help="$ac_help - --with-owner=owner Specify owner of the installed binary" -ac_help="$ac_help - --with-group=group Specify group owner of the installed binary" -ac_help="$ac_help - --with-domain=domain Domain name to use in local statistics gathering" -ac_help="$ac_help - --with-chroot=dir Specify that the server will be operated under - a different root directory given by dir. See - doc/readme.chroot for more information." -ac_help="$ac_help - --with-dpath=dir Directory for all server data files" -ac_help="$ac_help - --with-cpath=file Set server configuration file" -ac_help="$ac_help - --with-lpath=file Set the debugging log file" -ac_help="$ac_help - --with-maxcon=maxcon Maximum number of connections server will accept" +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#if HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#if HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#if STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# if HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#if HAVE_STRINGS_H +# include <strings.h> +#endif +#if HAVE_INTTYPES_H +# include <inttypes.h> +#else +# if HAVE_STDINT_H +# include <stdint.h> +# endif +#endif +#if HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP AWK SET_MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S RMPROG SHPROG OSDEP_C ENGINE_C INSTALL_RULE SYMLINK IRCDMODE IRCDOWN IRCDGRP DPATH LIBOBJS LTLIBOBJS' +ac_subst_files='' # Initialize some variables set by options. +ac_init_help= +ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. -build=NONE -cache_file=./config.cache +cache_file=/dev/null exec_prefix=NONE -host=NONE no_create= -nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE @@ -74,10 +328,15 @@ silent= site= srcdir= -target=NONE verbose= x_includes=NONE x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' @@ -91,17 +350,9 @@ infodir='${prefix}/info' mandir='${prefix}/man' -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - ac_prev= for ac_option do - # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" @@ -109,59 +360,59 @@ continue fi - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. - case "$ac_option" in + case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; + bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) - ac_prev=build ;; + ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; + build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) - datadir="$ac_optarg" ;; + datadir=$ac_optarg ;; -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac - eval "enable_${ac_feature}='$ac_optarg'" ;; + eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -170,95 +421,47 @@ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; + exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; -host | --host | --hos | --ho) - ac_prev=host ;; + ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; + host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; + includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; + infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; + libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; + libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ @@ -267,19 +470,19 @@ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; + localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; + mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) + | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ @@ -293,26 +496,26 @@ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; + oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; + prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; + program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; + program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ @@ -329,7 +532,7 @@ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; + program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) @@ -339,7 +542,7 @@ ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; + sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ @@ -350,58 +553,57 @@ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; + sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; + site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; + srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; + sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; + ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; + target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac - eval "with_${ac_package}='$ac_optarg'" ;; + eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. @@ -412,99 +614,110 @@ ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; + x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; + x_libraries=$ac_optarg ;; - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } fi -exec 5>./config.log -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; esac done -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=ircd/ircd.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. @@ -514,13 +727,458 @@ fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } fi fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-poll Force poll to be used regardless of whether or not + it is a system call + --enable-debug Turn on debugging mode + --disable-asserts Disable assertion checking + --disable-symbols Disable debugging symbols (remove -g from CFLAGS) + --enable-profile Enable profiling support (add -pg to CFLAGS) + --enable-pedantic Enable pedantic warnings (add -pedantic to CFLAGS) + --enable-warnings Enable warnings (add -Wall to CFLAGS) + --disable-inlines Disable inlining for a few critical functions + --disable-devpoll Disable the /dev/poll-based engine + --disable-kqueue Disable the kqueue-based engine + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-symlink=name Name to give the symlink; if name is "no," no + symlink will be created. + --with-mode=mode Permissions (in octal) to give the binary + --with-owner=owner Specify owner of the installed binary + --with-group=group Specify group owner of the installed binary + --with-domain=domain Domain name to use in local statistics gathering + --with-chroot=dir Specify that the server will be operated under + a different root directory given by dir. See + doc/readme.chroot for more information. + --with-dpath=dir Directory for all server data files + --with-cpath=file Set server configuration file + --with-lpath=file Set the debugging log file + --with-maxcon=maxcon Maximum number of connections server will accept + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have + headers in a nonstandard directory <include dir> + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then @@ -531,47 +1189,111 @@ fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi else - echo "creating cache $cache_file" - > $cache_file + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } fi ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says gh...@ca.... - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi -echo $ac_n "checking for installation prefix""... $ac_c" 1>&6 -echo "configure:573: checking for installation prefix" >&5 -if eval "test \"`echo '$''{'unet_cv_prefix'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 + +echo "$as_me:$LINENO: checking for installation prefix" >&5 +echo $ECHO_N "checking for installation prefix... $ECHO_C" >&6 +if test "${unet_cv_prefix+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else unet_cv_prefix=$HOME fi @@ -579,9 +1301,11 @@ if test x"$prefix" != xNONE; then unet_cv_prefix=$prefix fi -echo "$ac_t""$unet_cv_prefix" 1>&6 +echo "$as_me:$LINENO: result: $unet_cv_prefix" >&5 +echo "${ECHO_T}$unet_cv_prefix" >&6 ac_default_prefix=$unet_cv_prefix + ac_config_headers="$ac_config_headers config.h" @@ -596,251 +1320,713 @@ ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break fi done if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Make sure we can run config.sub. -if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:616: checking host system type" >&5 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:640: che... [truncated message content] |
From: Toni G. <zo...@us...> - 2003-02-13 19:27:30
|
CVSROOT : /cvsroot/irc-dev Module : ircdh Commit time: 2003-02-13 19:27:29 UTC Modified files: doc/en/readme.www Log message: Documentacion: {en|es}/readme.www Documento con las direcciones. {en|es}/rfc1459.orig Documento del RFC original de IRC con su respectiva traduccion al castellano. es/rfc1459.unet Documento del RFC modificado traducido al castellano. ---------------------- diff included ---------------------- Index: ircdh/doc/en/readme.www diff -u ircdh/doc/en/readme.www:1.1 ircdh/doc/en/readme.www:1.2 --- ircdh/doc/en/readme.www:1.1 Sat Jan 18 15:45:13 2003 +++ ircdh/doc/en/readme.www Thu Feb 13 11:27:19 2003 @@ -1,23 +1,23 @@ More, and up to date, information can be retrieved from the following world wide web pages: -* Undernet Documents Project: - http://www.user-com.undernet.org/documents/ +* IRC-Dev Website: + http://www.irc-dev.net -* Release Notes & Patch Repository: - http://coder-com.undernet.org/ +* IRC-Dev Documents Project: + http://www.irc-dev.net/ircd/docs.php -* ircII scripts to support the undernet extentions: - http://coder-com.undernet.org/ircii/ +* Release Notes & Patch Repository: + http://www.irc-dev.net/ircd/ -* Undernet Use Policy: - http://www.user-com.undernet.org/documents/aup.html +* Access to the CVS repository: + http://cvs.irc-dev.net/cvs/ -* Operator Etiquette: - http://www.user-com.undernet.org/documents/operman.html +* HTTP interface to the CVS repository: + http://cvs.irc-dev.net/cgi-bin/viewcvs.cgi/irc-dev/ircdh -* New server links & Routing info: - http://routing-com.undernet.org/ +* Sourceforge Project page: + http://sourceforge.net/projects/irc-dev * Information about large number of file descriptors per process: linux: http://www.linux.org.za/oskar/patches/kernel/filehandle/ ----------------------- End of diff ----------------------- |
From: Toni G. <zo...@us...> - 2003-02-13 19:28:55
|
CVSROOT : /cvsroot/irc-dev Module : ircdh Commit time: 2003-02-13 19:28:53 UTC Added files: doc/en/rfc1459.orig Log message: Documentacion: {en|es}/readme.www Documento con las direcciones. {en|es}/rfc1459.orig Documento del RFC original de IRC con su respectiva traduccion al castellano. es/rfc1459.unet Documento del RFC modificado traducido al castellano. ---------------------- diff included ---------------------- Index: ircdh/doc/en/rfc1459.orig diff -u /dev/null ircdh/doc/en/rfc1459.orig:1.1 --- /dev/null Thu Feb 13 11:28:53 2003 +++ ircdh/doc/en/rfc1459.orig Thu Feb 13 11:28:43 2003 @@ -0,0 +1,3643 @@ + + + + + + +Network Working Group J. Oikarinen +Request for Comments: 1459 D. Reed + May 1993 + + + Internet Relay Chat Protocol + +Status of This Memo + + This memo defines an Experimental Protocol for the Internet + community. Discussion and suggestions for improvement are requested. + Please refer to the current edition of the "IAB Official Protocol + Standards" for the standardization state and status of this protocol. + Distribution of this memo is unlimited. + +Abstract + + The IRC protocol was developed over the last 4 years since it was + first implemented as a means for users on a BBS to chat amongst + themselves. Now it supports a world-wide network of servers and + clients, and is stringing to cope with growth. Over the past 2 years, + the average number of users connected to the main IRC network has + grown by a factor of 10. + + The IRC protocol is a text-based protocol, with the simplest client + being any socket program capable of connecting to the server. + +Table of Contents + + 1. INTRODUCTION ............................................... 4 + 1.1 Servers ................................................ 4 + 1.2 Clients ................................................ 5 + 1.2.1 Operators .......................................... 5 + 1.3 Channels ................................................ 5 + 1.3.1 Channel Operators .................................... 6 + 2. THE IRC SPECIFICATION ....................................... 7 + 2.1 Overview ................................................ 7 + 2.2 Character codes ......................................... 7 + 2.3 Messages ................................................ 7 + 2.3.1 Message format in 'pseudo' BNF .................... 8 + 2.4 Numeric replies ......................................... 10 + 3. IRC Concepts ................................................ 10 + 3.1 One-to-one communication ................................ 10 + 3.2 One-to-many ............................................. 11 + 3.2.1 To a list .......................................... 11 + 3.2.2 To a group (channel) ............................... 11 + 3.2.3 To a host/server mask .............................. 12 + 3.3 One to all .............................................. 12 + + + +Oikarinen & Reed [Page 1] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + 3.3.1 Client to Client ................................... 12 + 3.3.2 Clients to Server .................................. 12 + 3.3.3 Server to Server ................................... 12 + 4. MESSAGE DETAILS ............................................. 13 + 4.1 Connection Registration ................................. 13 + 4.1.1 Password message ................................... 14 + 4.1.2 Nickname message ................................... 14 + 4.1.3 User message ....................................... 15 + 4.1.4 Server message ..................................... 16 + 4.1.5 Operator message ................................... 17 + 4.1.6 Quit message ....................................... 17 + 4.1.7 Server Quit message ................................ 18 + 4.2 Channel operations ...................................... 19 + 4.2.1 Join message ....................................... 19 + 4.2.2 Part message ....................................... 20 + 4.2.3 Mode message ....................................... 21 + 4.2.3.1 Channel modes ................................. 21 + 4.2.3.2 User modes .................................... 22 + 4.2.4 Topic message ...................................... 23 + 4.2.5 Names message ...................................... 24 + 4.2.6 List message ....................................... 24 + 4.2.7 Invite message ..................................... 25 + 4.2.8 Kick message ....................................... 25 + 4.3 Server queries and commands ............................. 26 + 4.3.1 Version message .................................... 26 + 4.3.2 Stats message ...................................... 27 + 4.3.3 Links message ...................................... 28 + 4.3.4 Time message ....................................... 29 + 4.3.5 Connect message .................................... 29 + 4.3.6 Trace message ...................................... 30 + 4.3.7 Admin message ...................................... 31 + 4.3.8 Info message ....................................... 31 + 4.4 Sending messages ........................................ 32 + 4.4.1 Private messages ................................... 32 + 4.4.2 Notice messages .................................... 33 + 4.5 User-based queries ...................................... 33 + 4.5.1 Who query .......................................... 33 + 4.5.2 Whois query ........................................ 34 + 4.5.3 Whowas message ..................................... 35 + 4.6 Miscellaneous messages .................................. 35 + 4.6.1 Kill message ....................................... 36 + 4.6.2 Ping message ....................................... 37 + 4.6.3 Pong message ....................................... 37 + 4.6.4 Error message ...................................... 38 + 5. OPTIONAL MESSAGES ........................................... 38 + 5.1 Away message ............................................ 38 + 5.2 Rehash command .......................................... 39 + 5.3 Restart command ......................................... 39 + + + +Oikarinen & Reed [Page 2] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + 5.4 Summon message .......................................... 40 + 5.5 Users message ........................................... 40 + 5.6 Operwall command ........................................ 41 + 5.7 Userhost message ........................................ 42 + 5.8 Ison message ............................................ 42 + 6. REPLIES ..................................................... 43 + 6.1 Error Replies ........................................... 43 + 6.2 Command responses ....................................... 48 + 6.3 Reserved numerics ....................................... 56 + 7. Client and server authentication ............................ 56 + 8. Current Implementations Details ............................. 56 + 8.1 Network protocol: TCP ................................... 57 + 8.1.1 Support of Unix sockets ............................ 57 + 8.2 Command Parsing ......................................... 57 + 8.3 Message delivery ........................................ 57 + 8.4 Connection 'Liveness' ................................... 58 + 8.5 Establishing a server-client connection ................. 58 + 8.6 Establishing a server-server connection ................. 58 + 8.6.1 State information exchange when connecting ......... 59 + 8.7 Terminating server-client connections ................... 59 + 8.8 Terminating server-server connections ................... 59 + 8.9 Tracking nickname changes ............................... 60 + 8.10 Flood control of clients ............................... 60 + 8.11 Non-blocking lookups ................................... 61 + 8.11.1 Hostname (DNS) lookups ............................ 61 + 8.11.2 Username (Ident) lookups .......................... 61 + 8.12 Configuration file ..................................... 61 + 8.12.1 Allowing clients to connect ....................... 62 + 8.12.2 Operators ......................................... 62 + 8.12.3 Allowing servers to connect ....................... 62 + 8.12.4 Administrivia ..................................... 63 + 8.13 Channel membership ..................................... 63 + 9. Current problems ............................................ 63 + 9.1 Scalability ............................................. 63 + 9.2 Labels .................................................. 63 + 9.2.1 Nicknames .......................................... 63 + 9.2.2 Channels ........................................... 64 + 9.2.3 Servers ............................................ 64 + 9.3 Algorithms .............................................. 64 + 10. Support and availability ................................... 64 + 11. Security Considerations .................................... 65 + 12. Authors' Addresses ......................................... 65 + + + + + + + + + +Oikarinen & Reed [Page 3] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + +1. INTRODUCTION + + The IRC (Internet Relay Chat) protocol has been designed over a + number of years for use with text based conferencing. This document + describes the current IRC protocol. + + The IRC protocol has been developed on systems using the TCP/IP + network protocol, although there is no requirement that this remain + the only sphere in which it operates. + + IRC itself is a teleconferencing system, which (through the use of + the client-server model) is well-suited to running on many machines + in a distributed fashion. A typical setup involves a single process + (the server) forming a central point for clients (or other servers) + to connect to, performing the required message delivery/multiplexing + and other functions. + +1.1 Servers + + The server forms the backbone of IRC, providing a point to which + clients may connect to to talk to each other, and a point for other + servers to connect to, forming an IRC network. The only network + configuration allowed for IRC servers is that of a spanning tree [see + Fig. 1] where each server acts as a central node for the rest of the + net it sees. + + + [ Server 15 ] [ Server 13 ] [ Server 14] + / \ / + / \ / + [ Server 11 ] ------ [ Server 1 ] [ Server 12] + / \ / + / \ / + [ Server 2 ] [ Server 3 ] + / \ \ + / \ \ + [ Server 4 ] [ Server 5 ] [ Server 6 ] + / | \ / + / | \ / + / | \____ / + / | \ / + [ Server 7 ] [ Server 8 ] [ Server 9 ] [ Server 10 ] + + : + [ etc. ] + : + + [ Fig. 1. Format of IRC server network ] + + + +Oikarinen & Reed [Page 4] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + +1.2 Clients + + A client is anything connecting to a server that is not another + server. Each client is distinguished from other clients by a unique + nickname having a maximum length of nine (9) characters. See the + protocol grammar rules for what may and may not be used in a + nickname. In addition to the nickname, all servers must have the + following information about all clients: the real name of the host + that the client is running on, the username of the client on that + host, and the server to which the client is connected. + +1.2.1 Operators + + To allow a reasonable amount of order to be kept within the IRC + network, a special class of clients (operators) is allowed to perform + general maintenance functions on the network. Although the powers + granted to an operator can be considered as 'dangerous', they are + nonetheless required. Operators should be able to perform basic + network tasks such as disconnecting and reconnecting servers as + needed to prevent long-term use of bad network routing. In + recognition of this need, the protocol discussed herein provides for + operators only to be able to perform such functions. See sections + 4.1.7 (SQUIT) and 4.3.5 (CONNECT). + + A more controversial power of operators is the ability to remove a + user from the connected network by 'force', i.e. operators are able + to close the connection between any client and server. The + justification for this is delicate since its abuse is both + destructive and annoying. For further details on this type of + action, see section 4.6.1 (KILL). + +1.3 Channels + + A channel is a named group of one or more clients which will all + receive messages addressed to that channel. The channel is created + implicitly when the first client joins it, and the channel ceases to + exist when the last client leaves it. While channel exists, any + client can reference the channel using the name of the channel. + + Channels names are strings (beginning with a '&' or '#' character) of + length up to 200 characters. Apart from the the requirement that the + first character being either '&' or '#'; the only restriction on a + channel name is that it may not contain any spaces (' '), a control G + (^G or ASCII 7), or a comma (',' which is used as a list item + separator by the protocol). + + There are two types of channels allowed by this protocol. One is a + distributed channel which is known to all the servers that are + + + +Oikarinen & Reed [Page 5] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + connected to the network. These channels are marked by the first + character being a only clients on the server where it exists may join + it. These are distinguished by a leading '&' character. On top of + these two types, there are the various channel modes available to + alter the characteristics of individual channels. See section 4.2.3 + (MODE command) for more details on this. + + To create a new channel or become part of an existing channel, a user + is required to JOIN the channel. If the channel doesn't exist prior + to joining, the channel is created and the creating user becomes a + channel operator. If the channel already exists, whether or not your + request to JOIN that channel is honoured depends on the current modes + of the channel. For example, if the channel is invite-only, (+i), + then you may only join if invited. As part of the protocol, a user + may be a part of several channels at once, but a limit of ten (10) + channels is recommended as being ample for both experienced and + novice users. See section 8.13 for more information on this. + + If the IRC network becomes disjoint because of a split between two + servers, the channel on each side is only composed of those clients + which are connected to servers on the respective sides of the split, + possibly ceasing to exist on one side of the split. When the split + is healed, the connecting servers announce to each other who they + think is in each channel and the mode of that channel. If the + channel exists on both sides, the JOINs and MODEs are interpreted in + an inclusive manner so that both sides of the new connection will + agree about which clients are in the channel and what modes the + channel has. + +1.3.1 Channel Operators + + The channel operator (also referred to as a "chop" or "chanop") on a + given channel is considered to 'own' that channel. In recognition of + this status, channel operators are endowed with certain powers which + enable them to keep control and some sort of sanity in their channel. + As an owner of a channel, a channel operator is not required to have + reasons for their actions, although if their actions are generally + antisocial or otherwise abusive, it might be reasonable to ask an IRC + operator to intervene, or for the usersjust leave and go elsewhere + and form their own channel. + + The commands which may only be used by channel operators are: + + KICK - Eject a client from the channel + MODE - Change the channel's mode + INVITE - Invite a client to an invite-only channel (mode +i) + TOPIC - Change the channel topic in a mode +t channel + + + + +Oikarinen & Reed [Page 6] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + A channel operator is identified by the '@' symbol next to their + nickname whenever it is associated with a channel (ie replies to the + NAMES, WHO and WHOIS commands). + +2. The IRC Specification + +2.1 Overview + + The protocol as described herein is for use both with server to + server and client to server connections. There are, however, more + restrictions on client connections (which are considered to be + untrustworthy) than on server connections. + +2.2 Character codes + + No specific character set is specified. The protocol is based on a a + set of codes which are composed of eight (8) bits, making up an + octet. Each message may be composed of any number of these octets; + however, some octet values are used for control codes which act as + message delimiters. + + Regardless of being an 8-bit protocol, the delimiters and keywords + are such that protocol is mostly usable from USASCII terminal and a + telnet connection. + + Because of IRC's scandanavian origin, the characters {}| are + considered to be the lower case equivalents of the characters []\, + respectively. This is a critical issue when determining the + equivalence of two nicknames. + +2.3 Messages + + Servers and clients send eachother messages which may or may not + generate a reply. If the message contains a valid command, as + described in later sections, the client should expect a reply as + specified but it is not advised to wait forever for the reply; client + to server and server to server communication is essentially + asynchronous in nature. + + Each IRC message may consist of up to three main parts: the prefix + (optional), the command, and the command parameters (of which there + may be up to 15). The prefix, command, and all parameters are + separated by one (or more) ASCII space character(s) (0x20). + + The presence of a prefix is indicated with a single leading ASCII + colon character (':', 0x3b), which must be the first character of the + message itself. There must be no gap (whitespace) between the colon + and the prefix. The prefix is used by servers to indicate the true + + + +Oikarinen & Reed [Page 7] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + origin of the message. If the prefix is missing from the message, it + is assumed to have originated from the connection from which it was + received. Clients should not use prefix when sending a message from + themselves; if they use a prefix, the only valid prefix is the + registered nickname associated with the client. If the source + identified by the prefix cannot be found from the server's internal + database, or if the source is registered from a different link than + from which the message arrived, the server must ignore the message + silently. + + The command must either be a valid IRC command or a three (3) digit + number represented in ASCII text. + + IRC messages are always lines of characters terminated with a CR-LF + (Carriage Return - Line Feed) pair, and these messages shall not + exceed 512 characters in length, counting all characters including + the trailing CR-LF. Thus, there are 510 characters maximum allowed + for the command and its parameters. There is no provision for + continuation message lines. See section 7 for more details about + current implementations. + +2.3.1 Message format in 'pseudo' BNF + + The protocol messages must be extracted from the contiguous stream of + octets. The current solution is to designate two characters, CR and + LF, as message separators. Empty messages are silently ignored, + which permits use of the sequence CR-LF between messages + without extra problems. + + The extracted message is parsed into the components <prefix>, + <command> and list of parameters matched either by <middle> or + <trailing> components. + + The BNF representation for this is: + + +<message> ::= [':' <prefix> <SPACE> ] <command> <params> <crlf> +<prefix> ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ] +<command> ::= <letter> { <letter> } | <number> <number> <number> +<SPACE> ::= ' ' { ' ' } +<params> ::= <SPACE> [ ':' <trailing> | <middle> <params> ] + +<middle> ::= <Any *non-empty* sequence of octets not including SPACE + or NUL or CR or LF, the first of which may not be ':'> +<trailing> ::= <Any, possibly *empty*, sequence of octets not including + NUL or CR or LF> + +<crlf> ::= CR LF + + + +Oikarinen & Reed [Page 8] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + +NOTES: + + 1) <SPACE> is consists only of SPACE character(s) (0x20). + Specially notice that TABULATION, and all other control + characters are considered NON-WHITE-SPACE. + + 2) After extracting the parameter list, all parameters are equal, + whether matched by <middle> or <trailing>. <Trailing> is just + a syntactic trick to allow SPACE within parameter. + + 3) The fact that CR and LF cannot appear in parameter strings is + just artifact of the message framing. This might change later. + + 4) The NUL character is not special in message framing, and + basically could end up inside a parameter, but as it would + cause extra complexities in normal C string handling. Therefore + NUL is not allowed within messages. + + 5) The last parameter may be an empty string. + + 6) Use of the extended prefix (['!' <user> ] ['@' <host> ]) must + not be used in server to server communications and is only + intended for server to client messages in order to provide + clients with more useful information about who a message is + from without the need for additional queries. + + Most protocol messages specify additional semantics and syntax for + the extracted parameter strings dictated by their position in the + list. For example, many server commands will assume that the first + parameter after the command is the list of targets, which can be + described with: + + <target> ::= <to> [ "," <target> ] + <to> ::= <channel> | <user> '@' <servername> | <nick> | <mask> + <channel> ::= ('#' | '&') <chstring> + <servername> ::= <host> + <host> ::= see RFC 952 [DNS:4] for details on allowed hostnames + <nick> ::= <letter> { <letter> | <number> | <special> } + <mask> ::= ('#' | '$') <chstring> + <chstring> ::= <any 8bit code except SPACE, BELL, NUL, CR, LF and + comma (',')> + + Other parameter syntaxes are: + + <user> ::= <nonwhite> { <nonwhite> } + <letter> ::= 'a' ... 'z' | 'A' ... 'Z' + <number> ::= '0' ... '9' + <special> ::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}' + + + +Oikarinen & Reed [Page 9] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + <nonwhite> ::= <any 8bit code except SPACE (0x20), NUL (0x0), CR + (0xd), and LF (0xa)> + +2.4 Numeric replies + + Most of the messages sent to the server generate a reply of some + sort. The most common reply is the numeric reply, used for both + errors and normal replies. The numeric reply must be sent as one + message consisting of the sender prefix, the three digit numeric, and + the target of the reply. A numeric reply is not allowed to originate + from a client; any such messages received by a server are silently + dropped. In all other respects, a numeric reply is just like a normal + message, except that the keyword is made up of 3 numeric digits + rather than a string of letters. A list of different replies is + supplied in section 6. + +3. IRC Concepts. + + This section is devoted to describing the actual concepts behind the + organization of the IRC protocol and how the current + implementations deliver different classes of messages. + + + + 1--\ + A D---4 + 2--/ \ / + B----C + / \ + 3 E + + Servers: A, B, C, D, E Clients: 1, 2, 3, 4 + + [ Fig. 2. Sample small IRC network ] + +3.1 One-to-one communication + + Communication on a one-to-one basis is usually only performed by + clients, since most server-server traffic is not a result of servers + talking only to each other. To provide a secure means for clients to + talk to each other, it is required that all servers be able to send a + message in exactly one direction along the spanning tree in order to + reach any client. The path of a message being delivered is the + shortest path between any two points on the spanning tree. + + The following examples all refer to Figure 2 above. + + + + + +Oikarinen & Reed [Page 10] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + +Example 1: + A message between clients 1 and 2 is only seen by server A, which + sends it straight to client 2. + +Example 2: + A message between clients 1 and 3 is seen by servers A & B, and + client 3. No other clients or servers are allowed see the message. + +Example 3: + A message between clients 2 and 4 is seen by servers A, B, C & D + and client 4 only. + +3.2 One-to-many + + The main goal of IRC is to provide a forum which allows easy and + efficient conferencing (one to many conversations). IRC offers + several means to achieve this, each serving its own purpose. + +3.2.1 To a list + + The least efficient style of one-to-many conversation is through + clients talking to a 'list' of users. How this is done is almost + self explanatory: the client gives a list of destinations to which + the message is to be delivered and the server breaks it up and + dispatches a separate copy of the message to each given destination. + This isn't as efficient as using a group since the destination list + is broken up and the dispatch sent without checking to make sure + duplicates aren't sent down each path. + +3.2.2 To a group (channel) + + In IRC the channel has a role equivalent to that of the multicast + group; their existence is dynamic (coming and going as people join + and leave channels) and the actual conversation carried out on a + channel is only sent to servers which are supporting users on a given + channel. If there are multiple users on a server in the same + channel, the message text is sent only once to that server and then + sent to each client on the channel. This action is then repeated for + each client-server combination until the original message has fanned + out and reached each member of the channel. + + The following examples all refer to Figure 2. + +Example 4: + Any channel with 1 client in it. Messages to the channel go to the + server and then nowhere else. + + + + + +Oikarinen & Reed [Page 11] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + +Example 5: + 2 clients in a channel. All messages traverse a path as if they + were private messages between the two clients outside a channel. + +Example 6: + Clients 1, 2 and 3 in a channel. All messages to the channel are + sent to all clients and only those servers which must be traversed + by the message if it were a private message to a single client. If + client 1 sends a message, it goes back to client 2 and then via + server B to client 3. + +3.2.3 To a host/server mask + + To provide IRC operators with some mechanism to send messages to a + large body of related users, host and server mask messages are + provided. These messages are sent to users whose host or server + information match that of the mask. The messages are only sent to + locations where users are, in a fashion similar to that of channels. + +3.3 One-to-all + + The one-to-all type of message is better described as a broadcast + message, sent to all clients or servers or both. On a large network + of users and servers, a single message can result in a lot of traffic + being sent over the network in an effort to reach all of the desired + destinations. + + For some messages, there is no option but to broadcast it to all + servers so that the state information held by each server is + reasonably consistent between servers. + +3.3.1 Client-to-Client + + There is no class of message which, from a single message, results in + a message being sent to every other client. + +3.3.2 Client-to-Server + + Most of the commands which result in a change of state information + (such as channel membership, channel mode, user status, etc) must be + sent to all servers by default, and this distribution may not be + changed by the client. + +3.3.3 Server-to-Server. + + While most messages between servers are distributed to all 'other' + servers, this is only required for any message that affects either a + user, channel or server. Since these are the basic items found in + + + +Oikarinen & Reed [Page 12] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + IRC, nearly all messages originating from a server are broadcast to + all other connected servers. + +4. Message details + + On the following pages are descriptions of each message recognized by + the IRC server and client. All commands described in this section + must be implemented by any server for this protocol. + + Where the reply ERR_NOSUCHSERVER is listed, it means that the + <server> parameter could not be found. The server must not send any + other replies after this for that command. + + The server to which a client is connected is required to parse the + complete message, returning any appropriate errors. If the server + encounters a fatal error while parsing a message, an error must be + sent back to the client and the parsing terminated. A fatal error + may be considered to be incorrect command, a destination which is + otherwise unknown to the server (server, nick or channel names fit + this category), not enough parameters or incorrect privileges. + + If a full set of parameters is presented, then each must be checked + for validity and appropriate responses sent back to the client. In + the case of messages which use parameter lists using the comma as an + item separator, a reply must be sent for each item. + + In the examples below, some messages appear using the full format: + + :Name COMMAND parameter list + + Such examples represent a message from "Name" in transit between + servers, where it is essential to include the name of the original + sender of the message so remote servers may send back a reply along + the correct path. + +4.1 Connection Registration + + The commands described here are used to register a connection with an + IRC server as either a user or a server as well as correctly + disconnect. + + A "PASS" command is not required for either client or server + connection to be registered, but it must precede the server message + or the latter of the NICK/USER combination. It is strongly + recommended that all server connections have a password in order to + give some level of security to the actual connections. The + recommended order for a client to register is as follows: + + + + +Oikarinen & Reed [Page 13] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + 1. Pass message + 2. Nick message + 3. User message + +4.1.1 Password message + + + Command: PASS + Parameters: <password> + + The PASS command is used to set a 'connection password'. The + password can and must be set before any attempt to register the + connection is made. Currently this requires that clients send a PASS + command before sending the NICK/USER combination and servers *must* + send a PASS command before any SERVER command. The password supplied + must match the one contained in the C/N lines (for servers) or I + lines (for clients). It is possible to send multiple PASS commands + before registering but only the last one sent is used for + verification and it may not be changed once registered. Numeric + Replies: + + ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED + + Example: + + PASS secretpasswordhere + +4.1.2 Nick message + + Command: NICK + Parameters: <nickname> [ <hopcount> ] + + NICK message is used to give user a nickname or change the previous + one. The <hopcount> parameter is only used by servers to indicate + how far away a nick is from its home server. A local connection has + a hopcount of 0. If supplied by a client, it must be ignored. + + If a NICK message arrives at a server which already knows about an + identical nickname for another client, a nickname collision occurs. + As a result of a nickname collision, all instances of the nickname + are removed from the server's database, and a KILL command is issued + to remove the nickname from all other server's database. If the NICK + message causing the collision was a nickname change, then the + original (old) nick must be removed as well. + + If the server recieves an identical NICK from a client which is + directly connected, it may issue an ERR_NICKCOLLISION to the local + client, drop the NICK command, and not generate any kills. + + + +Oikarinen & Reed [Page 14] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + Numeric Replies: + + ERR_NONICKNAMEGIVEN ERR_ERRONEUSNICKNAME + ERR_NICKNAMEINUSE ERR_NICKCOLLISION + + Example: + + NICK Wiz ; Introducing new nick "Wiz". + + :WiZ NICK Kilroy ; WiZ changed his nickname to Kilroy. + +4.1.3 User message + + Command: USER + Parameters: <username> <hostname> <servername> <realname> + + The USER message is used at the beginning of connection to specify + the username, hostname, servername and realname of s new user. It is + also used in communication between servers to indicate new user + arriving on IRC, since only after both USER and NICK have been + received from a client does a user become registered. + + Between servers USER must to be prefixed with client's NICKname. + Note that hostname and servername are normally ignored by the IRC + server when the USER command comes from a directly connected client + (for security reasons), but they are used in server to server + communication. This means that a NICK must always be sent to a + remote server when a new user is being introduced to the rest of the + network before the accompanying USER is sent. + + It must be noted that realname parameter must be the last parameter, + because it may contain space characters and must be prefixed with a + colon (':') to make sure this is recognised as such. + + Since it is easy for a client to lie about its username by relying + solely on the USER message, the use of an "Identity Server" is + recommended. If the host which a user connects from has such a + server enabled the username is set to that as in the reply from the + "Identity Server". + + Numeric Replies: + + ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED + + Examples: + + + USER guest tolmoon tolsun :Ronnie Reagan + + + +Oikarinen & Reed [Page 15] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + ; User registering themselves with a + username of "guest" and real name + "Ronnie Reagan". + + + :testnick USER guest tolmoon tolsun :Ronnie Reagan + ; message between servers with the + nickname for which the USER command + belongs to + +4.1.4 Server message + + Command: SERVER + Parameters: <servername> <hopcount> <info> + + The server message is used to tell a server that the other end of a + new connection is a server. This message is also used to pass server + data over whole net. When a new server is connected to net, + information about it be broadcast to the whole network. <hopcount> + is used to give all servers some internal information on how far away + all servers are. With a full server list, it would be possible to + construct a map of the entire server tree, but hostmasks prevent this + from being done. + + The SERVER message must only be accepted from either (a) a connection + which is yet to be registered and is attempting to register as a + server, or (b) an existing connection to another server, in which + case the SERVER message is introducing a new server behind that + server. + + Most errors that occur with the receipt of a SERVER command result in + the connection being terminated by the destination host (target + SERVER). Error replies are usually sent using the "ERROR" command + rather than the numeric since the ERROR command has several useful + properties which make it useful here. + + If a SERVER message is parsed and attempts to introduce a server + which is already known to the receiving server, the connection from + which that message must be closed (following the correct procedures), + since a duplicate route to a server has formed and the acyclic nature + of the IRC tree broken. + + Numeric Replies: + + ERR_ALREADYREGISTRED + + Example: + + + + +Oikarinen & Reed [Page 16] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + +SERVER test.oulu.fi 1 :[tolsun.oulu.fi] Experimental server + ; New server test.oulu.fi introducing + itself and attempting to register. The + name in []'s is the hostname for the + host running test.oulu.fi. + + +:tolsun.oulu.fi SERVER csd.bu.edu 5 :BU Central Server + ; Server tolsun.oulu.fi is our uplink + for csd.bu.edu which is 5 hops away. + +4.1.5 Oper + + Command: OPER + Parameters: <user> <password> + + OPER message is used by a normal user to obtain operator privileges. + The combination of <user> and <password> are required to gain + Operator privileges. + + If the client sending the OPER command supplies the correct password + for the given user, the server then informs the rest of the network + of the new operator by issuing a "MODE +o" for the clients nickname. + + The OPER message is client-server only. + + Numeric Replies: + + ERR_NEEDMOREPARAMS RPL_YOUREOPER + ERR_NOOPERHOST ERR_PASSWDMISMATCH + + Example: + + OPER foo bar ; Attempt to register as an operator + using a username of "foo" and "bar" as + the password. + +4.1.6 Quit + + Command: QUIT + Parameters: [<Quit message>] + + A client session is ended with a quit message. The server must close + the connection to a client which sends a QUIT message. If a "Quit + Message" is given, this will be sent instead of the default message, + the nickname. + + When netsplits (disconnecting of two servers) occur, the quit message + + + +Oikarinen & Reed [Page 17] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + is composed of the names of two servers involved, separated by a + space. The first name is that of the server which is still connected + and the second name is that of the server that has become + disconnected. + + If, for some other reason, a client connection is closed without the + client issuing a QUIT command (e.g. client dies and EOF occurs + on socket), the server is required to fill in the quit message with + some sort of message reflecting the nature of the event which + caused it to happen. + + Numeric Replies: + + None. + + Examples: + + QUIT :Gone to have lunch ; Preferred message format. + +4.1.7 Server quit message + + Command: SQUIT + Parameters: <server> <comment> + + The SQUIT message is needed to tell about quitting or dead servers. + If a server wishes to break the connection to another server it must + send a SQUIT message to the other server, using the the name of the + other server as the server parameter, which then closes its + connection to the quitting server. + + This command is also available operators to help keep a network of + IRC servers connected in an orderly fashion. Operators may also + issue an SQUIT message for a remote server connection. In this case, + the SQUIT must be parsed by each server inbetween the operator and + the remote server, updating the view of the network held by each + server as explained below. + + The <comment> should be supplied by all operators who execute a SQUIT + for a remote server (that is not connected to the server they are + currently on) so that other operators are aware for the reason of + this action. The <comment> is also filled in by servers which may + place an error or similar message here. + + Both of the servers which are on either side of the connection being + closed are required to to send out a SQUIT message (to all its other + server connections) for all other servers which are considered to be + behind that link. + + + + +Oikarinen & Reed [Page 18] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + Similarly, a QUIT message must be sent to the other connected servers + rest of the network on behalf of all clients behind that link. In + addition to this, all channel members of a channel which lost a + member due to the split must be sent a QUIT message. + + If a server connection is terminated prematurely (e.g. the server on + the other end of the link died), the server which detects + this disconnection is required to inform the rest of the network + that the connection has closed and fill in the comment field + with something appropriate. + + Numeric replies: + + ERR_NOPRIVILEGES ERR_NOSUCHSERVER + + Example: + + SQUIT tolsun.oulu.fi :Bad Link ? ; the server link tolson.oulu.fi has + been terminated because of "Bad Link". + + :Trillian SQUIT cm22.eng.umd.edu :Server out of control + ; message from Trillian to disconnect + "cm22.eng.umd.edu" from the net + because "Server out of control". + +4.2 Channel operations + + This group of messages is concerned with manipulating channels, their + properties (channel modes), and their contents (typically clients). + In implementing these, a number of race conditions are inevitable + when clients at opposing ends of a network send commands which will + ultimately clash. It is also required that servers keep a nickname + history to ensure that wherever a <nick> parameter is given, the + server check its history in case it has recently been changed. + +4.2.1 Join message + + Command: JOIN + Parameters: <channel>{,<channel>} [<key>{,<key>}] + + The JOIN command is used by client to start listening a specific + channel. Whether or not a client is allowed to join a channel is + checked only by the server the client is connected to; all other + servers automatically add the user to the channel when it is received + from other servers. The conditions which affect this are as follows: + + 1. the user must be invited if the channel is invite-only; + + + + +Oikarinen & Reed [Page 19] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + 2. the user's nick/username/hostname must not match any + active bans; + + 3. the correct key (password) must be given if it is set. + + These are discussed in more detail under the MODE command (see + section 4.2.3 for more details). + + Once a user has joined a channel, they receive notice about all + commands their server receives which affect the channel. This + includes MODE, KICK, PART, QUIT and of course PRIVMSG/NOTICE. The + JOIN command needs to be broadcast to all servers so that each server + knows where to find the users who are on the channel. This allows + optimal delivery of PRIVMSG/NOTICE messages to the channel. + + If a JOIN is successful, the user is then sent the channel's topic + (using RPL_TOPIC) and the list of users who are on the channel (using + RPL_NAMREPLY), which must include the user joining. + + Numeric Replies: + + ERR_NEEDMOREPARAMS ERR_BANNEDFROMCHAN + ERR_INVITEONLYCHAN ERR_BADCHANNELKEY + ERR_CHANNELISFULL ERR_BADCHANMASK + ERR_NOSUCHCHANNEL ERR_TOOMANYCHANNELS + RPL_TOPIC + + Examples: + + JOIN #foobar ; join channel #foobar. + + JOIN &foo fubar ; join channel &foo using key "fubar". + + JOIN #foo,&bar fubar ; join channel #foo using key "fubar" + and &bar using no key. + + JOIN #foo,#bar fubar,foobar ; join channel #foo using key "fubar". + and channel #bar using key "foobar". + + JOIN #foo,#bar ; join channels #foo and #bar. + + :WiZ JOIN #Twilight_zone ; JOIN message from WiZ + +4.2.2 Part message + + Command: PART + Parameters: <channel>{,<channel>} + + + + +Oikarinen & Reed [Page 20] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + The PART message causes the client sending the message to be removed + from the list of active users for all given channels listed in the + parameter string. + + Numeric Replies: + + ERR_NEEDMOREPARAMS ERR_NOSUCHCHANNEL + ERR_NOTONCHANNEL + + Examples: + + PART #twilight_zone ; leave channel "#twilight_zone" + + PART #oz-ops,&group5 ; leave both channels "&group5" and + "#oz-ops". + +4.2.3 Mode message + + Command: MODE + + The MODE command is a dual-purpose command in IRC. It allows both + usernames and channels to have their mode changed. The rationale for + this choice is that one day nicknames will be obsolete and the + equivalent property will be the channel. + + When parsing MODE messages, it is recommended that the entire message + be parsed first and then the changes which resulted then passed on. + +4.2.3.1 Channel modes + + Parameters: <channel> {[+|-]|o|p|s|i|t|n|b|v} [<limit>] [<user>] + [<ban mask>] + + The MODE command is provided so that channel operators may change the + characteristics of `their' channel. It is also required that servers + be able to change channel modes so that channel operators may be + created. + + The various modes available for channels are as follows: + + o - give/take channel operator privileges; + p - private channel flag; + s - secret channel flag; + i - invite-only channel flag; + t - topic settable by channel operator only flag; + n - no messages to channel from clients on the outside; + m - moderated channel; + l - set the user limit to channel; + + + +Oikarinen & Reed [Page 21] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + b - set a ban mask to keep users out; + v - give/take the ability to speak on a moderated channel; + k - set a channel key (password). + + When using the 'o' and 'b' options, a restriction on a total of three + per mode command has been imposed. That is, any combination of 'o' + and + +4.2.3.2 User modes + + Parameters: <nickname> {[+|-]|i|w|s|o} + + The user MODEs are typically changes which affect either how the + client is seen by others or what 'extra' messages the client is sent. + A user MODE command may only be accepted if both the sender of the + message and the nickname given as a parameter are both the same. + + The available modes are as follows: + + i - marks a users as invisible; + s - marks a user for receipt of server notices; + w - user receives wallops; + o - operator flag. + + Additional modes may be available later on. + + If a user attempts to make themselves an operator using the "+o" + flag, the attempt should be ignored. There is no restriction, + however, on anyone `deopping' themselves (using "-o"). Numeric + Replies: + + ERR_NEEDMOREPARAMS RPL_CHANNELMODEIS + ERR_CHANOPRIVSNEEDED ERR_NOSUCHNICK + ERR_NOTONCHANNEL ERR_KEYSET + RPL_BANLIST RPL_ENDOFBANLIST + ERR_UNKNOWNMODE ERR_NOSUCHCHANNEL + + ERR_USERSDONTMATCH RPL_UMODEIS + ERR_UMODEUNKNOWNFLAG + + Examples: + + Use of Channel Modes: + +MODE #Finnish +im ; Makes #Finnish channel moderated and + 'invite-only'. + +MODE #Finnish +o Kilroy ; Gives 'chanop' privileges to Kilroy on + + + +Oikarinen & Reed [Page 22] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + channel #Finnish. + +MODE #Finnish +v Wiz ; Allow WiZ to speak on #Finnish. + +MODE #Fins -s ; Removes 'secret' flag from channel + #Fins. + +MODE #42 +k oulu ; Set the channel key to "oulu". + +MODE #eu-opers +l 10 ; Set the limit for the number of users + on channel to 10. + +MODE &oulu +b ; list ban masks set for channel. + +MODE &oulu +b *!*@* ; prevent all users from joining. + +MODE &oulu +b *!*@*.edu ; prevent any user from a hostname + matching *.edu from joining. + + Use of user Modes: + +:MODE WiZ -w ; turns reception of WALLOPS messages + off for WiZ. + +:Angel MODE Angel +i ; Message from Angel to make themselves + invisible. + +MODE WiZ -o ; WiZ 'deopping' (removing operator + status). The plain reverse of this + command ("MODE WiZ +o") must not be + allowed from users since would bypass + the OPER command. + +4.2.4 Topic message + + Command: TOPIC + Parameters: <channel> [<topic>] + + The TOPIC message is used to change or view the topic of a channel. + The topic for channel <channel> is returned if there is no <topic> + given. If the <topic> parameter is present, the topic for that + channel will be changed, if the channel modes permit this action. + + Numeric Replies: + + ERR_NEEDMOREPARAMS ERR_NOTONCHANNEL + RPL_NOTOPIC RPL_TOPIC + ERR_CHANOPRIVSNEEDED + + + +Oikarinen & Reed [Page 23] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + Examples: + + :Wiz TOPIC #test :New topic ;User Wiz setting the topic. + + TOPIC #test :another topic ;set the topic on #test to "another + topic". + + TOPIC #test ; check the topic for #test. + +4.2.5 Names message + + Command: NAMES + Parameters: [<channel>{,<channel>}] + + By using the NAMES command, a user can list all nicknames that are + visible to them on any channel that they can see. Channel names + which they can see are those which aren't private (+p) or secret (+s) + or those which they are actually on. The <channel> parameter + specifies which channel(s) to return information about if valid. + There is no error reply for bad channel names. + + If no <channel> parameter is given, a list of all channels and their + occupants is returned. At the end of this list, a list of users who + are visible but either not on any channel or not on a visible channel + are listed as being on `channel' "*". + + Numerics: + + RPL_NAMREPLY RPL_ENDOFNAMES + + Examples: + + NAMES #twilight_zone,#42 ; list visible users on #twilight_zone + and #42 if the channels are visible to + you. + + NAMES ; list all visible channels and users + +4.2.6 List message + + Command: LIST + Parameters: [<channel>{,<channel>} [<server>]] + + The list message is used to list channels and their topics. If the + <channel> parameter is used, only the status of that channel + is displayed. Private channels are listed (without their + topics) as channel "Prv" unless the client generating the query is + actually on that channel. Likewise, secret channels are not listed + + + +Oikarinen & Reed [Page 24] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + at all unless the client is a member of the channel in question. + + Numeric Replies: + + ERR_NOSUCHSERVER RPL_LISTSTART + RPL_LIST RPL_LISTEND + + Examples: + + LIST ; List all channels. + + LIST #twilight_zone,#42 ; List channels #twilight_zone and #42 + +4.2.7 Invite message + + Command: INVITE + Parameters: <nickname> <channel> + + The INVITE message is used to invite users to a channel. The + parameter <nickname> is the nickname of the person to be invited to + the target channel <channel>. There is no requirement that the + channel the target user is being invited to must exist or be a valid + channel. To invite a user to a channel which is invite only (MODE + +i), the client sending the invite must be recognised as being a + channel operator on the given channel. + + Numeric Replies: + + ERR_NEEDMOREPARAMS ERR_NOSUCHNICK + ERR_NOTONCHANNEL ERR_USERONCHANNEL + ERR_CHANOPRIVSNEEDED + RPL_INVITING RPL_AWAY + + Examples: + + :Angel INVITE Wiz #Dust ; User Angel inviting WiZ to channel + #Dust + + INVITE Wiz #Twilight_Zone ; Command to invite WiZ to + #Twilight_zone + +4.2.8 Kick command + + Command: KICK + Parameters: <channel> <user> [<comment>] + + The KICK command can be used to forcibly remove a user from a + channel. It 'kicks them out' of the channel (forced PART). + + + +Oikarinen & Reed [Page 25] + +RFC 1459 Internet Relay Chat Protocol May 1993 + + + Only a channel operator may kick another user out of a channel. + Each server that receives a KICK message checks that it is valid + (ie the sender is actually a channel operator) before removing + the victim from the channel. + + Numeric Replies: + + ERR_NEEDMOREPARAMS ERR_NOSUCHCHANNEL + ERR_BADCHANMASK ERR_CHANOPRIVSNEEDED + ERR_NOTONCHANNEL + + Examples: + +KICK &Melbourne Matthew ; Kick Matthew from &Melbourne + +KICK #Finnish John :Speaking English + ; Kick John from #Finnish using + "Speaking English" as the reason + (comment). + +:WiZ KICK #Finnish John ; KICK message from WiZ to remove John + from channel #Finnish + +NOTE: + It is possible to extend the KICK command parameters to the +following: + +<channel>{,<channel>} <user>{,<user>} [<comment>] + +4.3 Server queries and commands + + The server query group of commands has been designed to return + information about any server which is connected to the network. All + servers connected must respond to these queries and respond + correctly. Any invalid response (or lack thereof) must be considered + a sign of a broken server and it must be disconnected/disabled as + soon as possible until the situation is remedied. + + In these queries, where a parameter appears as "<server>", it will + usually mean it can be a nickname or a server or a wildcard name of + some sort. For each parameter, however, only one query and set of + replies is to be generated. + +4.3.1 Version message + + Command: VERSION + Parameters: [<server>] + + + + +Oikarinen & Reed ... [truncated message content] |
From: Toni G. <zo...@us...> - 2003-02-13 19:29:31
|
CVSROOT : /cvsroot/irc-dev Module : ircdh Commit time: 2003-02-13 19:29:29 UTC Added files: doc/es/readme.www doc/es/rfc1459.orig doc/es/rfc1459.unet Log message: Documentacion: {en|es}/readme.www Documento con las direcciones. {en|es}/rfc1459.orig Documento del RFC original de IRC con su respectiva traduccion al castellano. es/rfc1459.unet Documento del RFC modificado traducido al castellano. ---------------------- diff included ---------------------- Index: ircdh/doc/es/readme.www diff -u /dev/null ircdh/doc/es/readme.www:1.1 --- /dev/null Thu Feb 13 11:29:29 2003 +++ ircdh/doc/es/readme.www Thu Feb 13 11:29:19 2003 @@ -0,0 +1,23 @@ +Además, y de forma actualizada, se puede encontrar información en las +siguientes páginas webs: + +* Web de IRC-Dev: + http://www.irc-dev.net + +* Documentos de IRC-Dev: + http://www.irc-dev.net/ircd/docs.php + +* Noticias de actualización y repositorio de parches: + http://www.irc-dev.net/ircd/ + +* Acceso al repositorio CVS: + http://cvs.irc-dev.net/cvs/ + +* Interfaz HTTP dek repositorio CVS: + http://cvs.irc-dev.net/cgi-bin/viewcvs.cgi/irc-dev/ircdh + +* Pagina del proyecto en Sourceforge: + http://sourceforge.net/projects/irc-dev + +* Información sobre aumentar los descriptores de fichero por proceso: + linux: http://www.linux.org.za/oskar/patches/kernel/filehandle/ Index: ircdh/doc/es/rfc1459.orig diff -u /dev/null ircdh/doc/es/rfc1459.orig:1.1 --- /dev/null Thu Feb 13 11:29:30 2003 +++ ircdh/doc/es/rfc1459.orig Thu Feb 13 11:29:19 2003 @@ -0,0 +1,3712 @@ + + + +Network Working Group J. Oikarinen +RFC: 1459 D. Reed + Mayo 1993 + Traducción al castellano: Octubre 1999 + Carlos García Argos (cg...@ya...) + + + + Protocolo de Charla Basado en Internet (Internet Relay Chat, IRC) + + +Prefacio + + Este documento especifica un protocolo experimental para la + comunidad de Internet. Se piden comentarios y sugerencias para + mejoras. Se ruega referirse a la edición actual de los "Estándares + de Protocolo Oficiales del IAB" para el estado actual de la + estandarización y el protocolo. La distribución de este documento + es ilimitada. + +Resumen + + El Protocolo IRC se desarrolló durante los 4 últimos años desde que + se implementó por primera vez como un medio de comunicación + instantánea entre usuarios de BBS. Actualmente soporta una red + global de servidores y clientes, y se está extendiendo para + contrarrestar el crecimiento. Durante los 2 últimos años, la media + de usuarios conectados a la red de IRC se ha multiplicado por 10. + + El protocolo IRC está basado en texto, siendo el cliente más simple + un programa capaz de conectarse a un servidor a través de un socket. + +Índice + + 1. INTRODUCCIÓN ............................................... 4 + 1.1 Servidores.............................................. 4 + 1.2 Clientes ............................................... 5 + 1.2.1 Operadores ......................................... 5 + 1.3 Canales ................................................. 5 + 1.3.1 Operadores de canal .................................. 6 + 2. LA ESPECIFICACIÓN DEL IRC ................................... 7 + 2.1 Discusión ............................................... 7 + 2.2 Códigos de caracteres ................................... 7 + 2.3 Mensajes ................................................ 7 + 2.3.1 Formato de mensajes en pseudo BNF ................. 8 + 2.4 Respuestas numéricas..................................... 10 + 3. Conceptos sobre IRC ......................................... 10 + 3.1 Comunicación uno-a-uno .................................. 10 + 3.2 Uno-a-muchos ............................................ 11 + 3.2.1 A una lista ........................................ 11 + 3.2.2 A un grupo (canal) ................................. 11 + 3.2.3 A una máscara de host o servidor ................... 12 + 3.3 Uno a todos ............................................. 12 + +Oikarinen & Reed [Pág. 1] + + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + 3.3.1 Cliente a cliente .................................. 12 + 3.3.2 Clientes a servidor ................................ 12 + 3.3.3 Servidor a servidor ................................ 12 + 4. DETALLES DE MENSAJES......................................... 13 + 4.1 Registro de conexión .................................... 13 + 4.1.1 Mensaje de clave ................................... 14 + 4.1.2 Mensaje de nick .................................... 14 + 4.1.3 Mensaje de usuario ................................. 15 + 4.1.4 Mensaje de servidor ................................ 16 + 4.1.5 Mensaje de Operador ................................ 17 + 4.1.6 Mensaje de salida .................................. 17 + 4.1.7 Mensaje de salida del servidor ..................... 18 + 4.2 Operaciones en un canal ................................. 19 + 4.2.1 Mensaje de entrada al canal (JOIN) ................. 19 + 4.2.2 Mensaje de salida del canal (PART) ................. 20 + 4.2.3 Mensaje de modos ................................... 21 + 4.2.3.1 Modos de canal ................................ 21 + 4.2.3.2 Modos de usuario .............................. 22 + 4.2.4 Mensaje de tópico .................................. 23 + 4.2.5 Mensaje de nombres ................................. 24 + 4.2.6 Mensaje de lista de canales ........................ 24 + 4.2.7 Mensaje de invitación a un canal ................... 25 + 4.2.8 Mensaje de expulsión temporal ...................... 25 + 4.3 Peticiones y comandos del servidor ...................... 26 + 4.3.1 Mensaje de versión ................................. 26 + 4.3.2 Mensaje de estadísticas ............................ 27 + 4.3.3 Mensaje de enlaces de servidores ................... 28 + 4.3.4 Mensaje de hora local del servidor ................. 29 + 4.3.5 Mensaje de conexión servidor-servidor .............. 29 + 4.3.6 Mensaje de trazado de ruta ......................... 30 + 4.3.7 Mensaje de nombre del administrador del servidor ... 31 + 4.3.8 Mensaje de información sobre el servidor ........... 31 + 4.4 Enviando mensajes ....................................... 32 + 4.4.1 Mensajes privados .................................. 32 + 4.4.2 Mensajes de aviso .................................. 33 + 4.5 Peticiones de usuario ................................... 33 + 4.5.1 Petición de "WHO" .................................. 33 + 4.5.2 Petición de "WHOIS" ................................ 34 + 4.5.3 Petición de "WHOWAS" ............................... 35 + 4.6 Otros mensajes .......................................... 35 + 4.6.1 Mensaje de "KILL" .................................. 35 + 4.6.2 Mensaje de "PING" .................................. 36 + 4.6.3 Mensaje de "PONG" .................................. 37 + 4.6.4 Mensajes de error .................................. 38 + 5. MENSAJES OPCIONALES ......................................... 38 + 5.1 Mensaje de ausencia (AWAY) .............................. 38 + 5.2 Comando de reconfiguración del servidor ................. 39 + 5.3 Comando de reinicio del servidor ........................ 39 + + + + +Oikarinen & Reed [Pág. 2] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + 5.4 Mensaje de invocación (SUMMON) .......................... 40 + 5.5 Mensaje de lista de usuarios ............................ 40 + 5.6 Comando de mensaje a los Operadores ..................... 41 + 5.7 Comando USERHOST ........................................ 41 + 5.8 Comando ISON ............................................ 41 + 6. RESPUESTAS .................................................. 42 + 6.1 Respuestas de error ..................................... 42 + 6.2 Respuestas a comandos ................................... 47 + 6.3 Respuestas reservadas ................................... 54 + 7. AUTENTICACIÓN DE CLIENTE Y SERVIDOR ......................... 54 + 8. DETALLES DE IMPLEMENTACIÓN .................................. 54 + 8.1 Protocolo de red: TCP ................................... 56 + 8.1.1 Soporte de sockets UNIX ............................ 56 + 8.2 Análisis de comandos .................................... 56 + 8.3 Envío de mensajes ....................................... 56 + 8.4 Vida de una conexión .................................... 57 + 8.5 Estableciendo una conexión cliente-servidor ............. 57 + 8.6 Estableciendo una conexión servidor-servidor ............ 57 + 8.6.1 Intercambio de información de estado al conectar ... 58 + 8.7 Finalización de conexiones cliente-servidor ............. 58 + 8.8 Finalización de conexiones servidor-servidor ............ 58 + 8.9 Seguimiento de cambios de nick .......................... 59 + 8.10 Control de flood de clientes ........................... 59 + 8.11 Búsquedas sin bloqueos ................................. 60 + 8.11.1 Resolución de nombre de host (DNS) ................ 60 + 8.11.2 Búsqueda de nombre de usuario (Ident) ............. 60 + 8.12 Archivo de configuración ............................... 60 + 8.12.1 Permitir la conexión de clientes .................. 61 + 8.12.2 Operadores ........................................ 61 + 8.12.3 Perimitir la conexión de servidores ............... 61 + 8.12.4 Administración .................................... 62 + 8.13 Miembros de canales .................................... 62 + 9. PROBLEMAS ACTUALES .......................................... 62 + 9.1 Escalabilidad ........................................... 62 + 9.2 Etiquetas ............................................... 62 + 9.2.1 Nicks .............................................. 62 + 9.2.2 Canales ............................................ 63 + 9.2.3 Servidores ......................................... 63 + 9.3 Algoritmos .............................................. 63 + 10. SOPORTE Y DISPONIBILIDAD ................................... 63 + 11. ASUNTOS DE SEGURIDAD ....................................... 63 + 12. DIRECCIONES DE LOS AUTORES ................................. 64 + + + + + + + + + + + +Oikarinen & Reed [Pág. 3] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +1. INTRODUCCIÓN + + El protocolo IRC (Internet Relay Chat) se ha diseñado durante unos + años para usarse como conferencia basada en texto. Este documento + describe el protocolo IRC actual. + + El protocolo IRC se ha desarrollado en sistemas que usan el + protocolo de red TCP/IP, aunque no es imperativo que esta sea la + única forma en que funcione. + + El IRC es en sí mismo un sistema de teleconferencia que (a través + del modelo cliente-servidor) es adecuado para funcionar en muchas + máquinas en una forma distribuida. Una configuración típìca incluye + un único proceso (el servidor) que conforma un punto central para + que los clientes (u otros servidores) se conecten a él, realizando + los envíos y multiplexado de mensajes requeridos, así como otras + funciones. + +1.1 Servidores + + El servidor forma la espina dorsal del IRC, proporcionando un punto + al que los clientes pueden conectar para hablar unos con otros, y un + punto para que otros servidores se conecten a él, formando una red + IRC. La única configuración de red permitida para los servidores de + IRC es una con forma de árbol extendido [ver figura 1], donde cada + servidor hace de nodo central para el resto de la red que dicho + servidor "ve". + + + [ Servidor 15 ] [ Servidor 13 ] [ Servidor 14] + / \ / + / \ / + [ Servidor 11 ] ------ [ Servidor 1 ] [ Servidor 12] + / \ / + / \ / + [ Servidor 2 ] [ Servidor 3 ] + / \ \ + / \ \ + [ Servidor 4 ] [ Servidor 5 ] [ Servidor 6 ] + / | \ / + / | \ / + / | \________ / + / | \ / + [ Servidor 7 ] [ Servidor 8 ] [ Servidor 9 ] [ Servidor 10 ] + + : + [ etc. ] + : + + [ Figura. 1. Formato de una red de servidores de IRC ] + + + +Oikarinen & Reed [Pág. 4] + + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +1.2 Clientes + + Un cliente es cualquier cosa que se conecta a un servidor que no sea + otro servidor. Cada cliente se distingue de otros clientes por un + único nick de 9 caracteres de longitud máxima. Ver las reglas de + gramática de protocolo para ver lo que se puede y lo que no se puede + usar en un nick. Además del nick, todos los servidores deben tener + la siguiente información sobre todos los clientes: nombre real del + host desde el que conecta el cliente, el nombre de usuario del + cliente en ese host, y el servidor al que está conectado el cliente. + +1.2.1 Operadores + + Para mantener un cierto orden en la red de IRC, existe una clase de + clientes especial (Operadores) que realizan funciones generales de + mantenimiento en la red. Aunque los "poderes" concedidos a un + un Operador pueden considerarse "peligrosos", son necesarios. Los + Operadores deben ser capaces de realizar tareas básicas de red como + desconectar y reconectar servidores para prevenir un uso prolongado + de mal rutado de red. Como reconocimiento de esta necesidad, el + protocolo explicado aquí sólo permite a los Operadores realizar + dichas funciones. Ver secciones 4.1.7 (SQUIT) y 4.3.5 (CONNECT). + + Un poder con mayor controversia es la posibilidad de que un Operador + elimine un usuario de la red por la "fuerza". Por ejemplo, los + Operadores son capaces de cerrar la conexión entre cualquier cliente + y servidor. La justificación de esto es delicada ya que su abuso es + a la vez destructivo y molesto. Para más detalles sobre esta acción + ver sección 4.6.1 (KILL). + +1.3 Canales + + Un canal es un grupo (con nombre) de uno o más clientes que reciben + mensajes dirigidos a ese canal. El canal se crea implícitamente al + unirse el primer cliente, y deja de existir cuando el último cliente + lo deja. Mientras el canal exista, cualquier cliente puede dirigirse + al canal usando el nombre de dicho canal. + + Los nombres de canales son cadenas (que empiezan con '&' o '#') de + hasta 200 caracteres. Aparte del requisito de que el primer carácter + sea un '&' o un '#', la única restricción es que no puede contener + espacios en blanco (' '), control G (^G o ASCII 7), o una coma (',', + que se usa como separador de listas de parámetros). + + Hay dos tipos de canales permitidos por el protocolo. Uno es un + canal distribuido que es conocido por todos los servidores de la + red. Estos canales se marcan con el primer carácter '#'. Otro tipo + de canales se caracteriza por ser sólo para clientes conectados al + + + + +Oikarinen & Reed [Pág. 5] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + servidor en el que se encuentra el canal. Se distinguen porque su + primer carácter es '&'. Por encima de estos tipos, hay modos de + canal que varían las características de los canales. Para más + detalles, ver la sección 4.2.3 (comando MODE). + + Para crear un nuevo canal o formar parte de uno existente, un + usuario debe UNIRSE (JOIN) al canal. Si el canal no existe antes de + unirse, se crea y el creador del canal pasa a ser operador de canal. + Si el canal existe, la petición de unirse a él será aceptada o no en + función de los modos actuales del canal. Por ejemplo, si el canal es + sólo para invitados (+i), sólo podrá unirse si es invitado. Como + parte del protocolo, un usuario puede formar parte de varios canales + simultáneamente, pero se recomienda un límite de 10 canales como + suficiente para usuarios experimentados y novatos. Ver la sección + 8.13 para más información. + + Si la red de IRC se separa a causa de una ruptura de conexión entre + dos servidores, el canal en cada lado está compuesto por los + clientes que están conectados a los servidores a cada lado de la + ruptura. Cuando se rehace la conexión, los servidores que reconectan + anuncian al otro quién cree que está en cada canal y los modos de + dicho canal. Si el canal existe en ambas partes, las uniones (JOINs) + y modos (MODEs) se interpretan de forma inclusiva de forma que ambos + lados de la nueva conexión coincidan en los clientes que forman el + canal y los modos del mismo. + +1.3.1 Operadores de canal + + El operador de canal (también llamado "chop" o "chanop") se le + considera el "dueño" de dicho canal. Como reconocimiento a ese + estatus, los operadores de canal poseen ciertos "poderes" que les + permiten mantener el control y cierto orden en su canal. Como dueño + del canal, el operador de canal no tiene que dar justificaciones por + sus actos, aunque si sus acciones son antisociales o abusivas, puede + ser razonable pedirle a un Operador de IRC que intervenga, o por el + bien de los usuarios, irse y crear su propio canal. + + Los comandos que sólo pueden usar los operadores de canal son: + + KICK - Expulsar a un cliente del canal, de forma que puede + volver a entrar + MODE - Cambiar los modos del canal + INVITE - Invitar a un usuario a un canal + TOPIC - Cambiar el topic en un canal con modo +t + + Un operador de canal se identifica por el símbolo '@' (arroba) que + precede a su nick, cuando se le asocia con un canal (respuestas a + los comandos NAMES, WHO y WHOIS). + + + + + +Oikarinen & Reed [Pág. 6] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + +2. LA ESPECIFICACIÓN DEL IRC + +2.1 Discusión + + El protocolo tal y como se describe aquí se usa tanto para + conexiones servidor-servidor como cliente-servidor. Hay, sin + embargo, más restricciones en las conexiones cliente (que se + consideran poco fiables) que en las conexiones de servidores. + +2.2 Códigos de caracteres + + No hay un conjunto de caracteres especificado. El protocolo está + basado en un conjunto de caracteres compuesto de 8 bits, formando un + octeto. Cada mensaje puede estar compuesto de cualquier número de + estos octetos; sin embargo, algunos valores de estos octetos se usan + para formar códigos de control que actúan como delimitadores de + mensajes. + + A pesar de ser un protocolo de 8 bits, los delimitadores y palabras + clave son tales que el protocolo se puede usar desde un terminal + USASCII y una conexión telnet. + + Debido al origen escandinavo del IRC, los caracteres {, } y | se + consideran las "minúsculas" de los caracteres [, ] y \, + respectivamente. Esto es crítico a la hora de determinar la + equivalencia de dos nicks. + +2.3 Mensajes + + Servidores y clientes se envían mensajes unos a otros que pueden + generar o no una respuesta. Si el mensaje contiene un comando válido + de una de las formas descritas en secciones posteriores, el cliente + debería esperar una respuesta como se especifica, pero no tiene + porqué esperar para siempre a esa respuesta; la comunicación + cliente-servidor y servidor-servidor es esencialmente asíncrona. + + Cada mensaje de IRC puede consistir en 3 partes principales: el + prefijo (opcional), el comando y los parámetros del comando (hasta + un total de 15). El prefijo, comando y parámetros deben estar + separados entre sí por uno (o más) caracteres ASCII espacio en + blanco (0x20). + + La presencia de un prefijo se indica con el carácter dos puntos + (':', 0x3b), que debe ser el primer carácter del propio mensaje. No + debe haber espacio en blanco entre los dos puntos y el mensaje. El + prefijo lo usan los servidores para indicar el verdadero origen del + mensaje. Si el prefijo no aparece en el mensaje, se supone que + + + + + +Oikarinen & Reed [Pág. 7] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + proviene de la conexión desde la cual se recibió. Los clientes no + deberían usar prefijos al enviar mensajes; si usan un prefijo, el + único válido es el nick registrado asociado con el cliente. Si la + fuente identificada por el prefijo no se encuentra en la base de + datos interna del servidor o si la fuente está registrada desde un + enlace diferente a aquel desde el cual llegó el mensaje, el servidor + debe ignorar el mensaje de forma silenciosa. + + El comando debe ser bien un comando de IRC válido o un número de 3 + dígitos representado en texto ASCII. + + Los mensajes de IRC siempre son líneas de caracteres acabadas en un + par CR-LF (Carriage Return-Line Feed = Retorno de Carro-Salto de + Línea), y los mensajes no deben exceder los 512 caracteres de + longitud, incluido el par CR-LF. Por tanto, hay un máximo de 510 + caracteres permitidos para el comando y sus parámetros. No hay + provisiones para líneas de continuación de mensajes. Para más + detalles sobre la implementación ver la sección 7. + +2.3.1 Formato de mensajes en 'pseudo' BNF + + Los mensajes de protocolo deben extraerse de la cadena contigua de + octetos. La solución es asignar dos caracteres, CR y LF como + separadores de mensajes. Los mensajes vacíos se ignoran de forma + silenciosa, lo que permite el uso de la secuencia CR-LF entre + mensajes sin problemas. + + El mensaje extraído se divide en las componentes <prefijo>, + <comando> y lista de parámetros formada por componentes <parámetro + intermedio> o <parámetro final> + + La representación BNF para esto es: + + +<mensaje> ::= [':' <prefijo> <ESPACIO> ] <comando> <parámetro> <crlf> +<prefijo> ::= <nombre de servidor> | <nick> [ '!' <usuario> ] [ '@' <host> ] +<comando> ::= <letra> { <letra> } | <número> <número> <número> +<ESPACIO> ::= ' ' { ' ' } +<parámetro> ::= <ESPACIO> [ ':' <parámetro final> | + <parámetro intermedio> <parámetro> ] + +<parámetro intermedio> ::= <Cualquier secuencia de octetos *no vacía* + que no incluya ESPACIO, NUL, CR o LF, el + primero del cual no puede ser ':'> +<parámetro final> ::= <Cualquier secuencia, posiblemente *vacía* que no + incluya NUL, CR o LF> + +<crlf> ::= CR LF + + + + + +Oikarinen & Reed [Pág. 8] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +NOTAS: + + 1) <ESPACIO> consiste únicamente de caracteres espacio (0x20). + Nótese especialmente que la TABULACIÓN y otros caracteres de + control no se consideran espacios en blanco. + + 2) Después de extraer la lista de parámetros, todos son iguales, + ya sean <parámetro intermedio> o <parámetro final>. Este último + es simplemente un truco sintáctico para permitir ESPACIO en un + parámetro. + + 3) La razón por la cual CR y LF no pueden aparecer en parámetros + es un artefacto de la estructura del mensaje. Esto podría + cambiar más adelante. + + 4) El carácter NUL no es especial en la estructuración del mensaje + y básicamente podría acabar en un parámetro, pero esto + causaría complejidades adicionales en el manejo normal de + cadenas de C. Por tanto, NUL no se permite en los mensajes. + + 5) El último parámetro debe ser una cadena vacía. + + 6) El uso del prefijo extendido (['!' <usuario> ] ['@' <host> ]) + no debe usarse en comunicaciones servidor-servidor y sólo está + orientado a mensajes servidor-cliente para proporcionar a los + clientes información más útil sobre de quién proviene un + mensaje sin realizar peticiones adicionales. + + La mayoría de los protocolos de mensajes especifican una semántica y + sintaxis adicionales para los parámetros, dictados por su posición + en la lista de parámetros. Por ejemplo, muchos comandos de + servidores supondrán que el primer parámetro después del comando es + la lista de objetivos, que puede describirse como: + + <objetivo> ::= <a> [ "," <objetivo> ] + <a> ::= <canal> | <usuario> '@' <nombre de servidor> | + <nick> | <máscara> + <canal> ::= ('#' | '&') <cadena de caracteres> + <nombre de servidor> ::= <host> + <host> ::= ver RFC 952 [DNS:4] para detalles sobre nombres de + host válidos + <nick> ::= <letra> { <letra> | <número> | <especial> } + <máscara> ::= ('#' | '$') <cadena de caracteres> + <cadena de caracteres> ::= <cualquier código de 8 bits excepto + ESPACIO, BELL, NUL, CR, LF y coma (',')> + + Otras sintaxis de parámetros son: + + <usuario> ::= <NO-ESPACIO> { <NO-ESPACIO> } + <letra> ::= 'a' ... 'z' | 'A' ... 'Z' + <número> ::= '0' ... '9' + <especial> ::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}' + +Oikarinen & Reed [Pág. 9] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + <NO-ESPACIO> ::= <cualquier código de 8 bits excepto ESPACIO + (0x20), NUL (0x00), CR (0x0d) o LF (0x0a)> + +2.4 Respuestas numéricas + + La mayoría de los mensajes enviados al servidor generan una + respuesta de alguna clase. La respuesta más común es la numérica, + empleada tanto para repuestas de error como para las normales. La + respuesta numérica debe enviarse como un mensaje compuesto por el + prefijo del que lo envía, el número de 3 dígitos, y el objetivo de + la respuesta. No se permiten respuestas numéricas provenientes de un + cliente; cualquier mensaje de ese tipo recibido por el servidor se + descartan de forma silenciosa. Una respuesta numérica es como un + mensaje normal, salvo que la palabra clave se crea a partir de 3 + dígitos numéricos en lugar de una cadena de letras. Hay una lista de + respuestas en la sección 6. + +3. Conceptos sobre IRC. + + Esta sección está dedicada a describir los conceptos actuales que + están tras la organización del protocolo IRC y cómo las actuales + implementaciones envían diferentes clases de mensajes. + + + + 1--\ + A D---4 + 2--/ \ / + B----C + / \ + 3 E + + Servidores: A, B, C, D, E Clientes: 1, 2, 3, 4 + + [ Figura 2. Pequeña red IRC de ejemplo ] + +3.1 Comunicación uno-a-uno + + La comunicación uno-a-uno normalmente sólo la realizan los clientes, + ya que la mayoría del tráfico servidor-servidor no es resultado de + los servidores comunicándose únicamente entre ellos. Para + proporcionar una forma segura de comunicación entre clientes, es + necesario que todos los servidores sean capaces de enviar un mensaje + exactamente en una dirección a través del árbol de expansión para + que llegue a cualquier cliente. El camino de un mensaje es el más + corto entre dos puntos cualesquiera del árbol. + + Los siguientes ejemplos se refieren todos a la Figura 2 de arriba. + + + + + +Oikarinen & Reed [Pág. 10] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +Ejemplo 1: + Un mensaje entre los clientes 1 y 2 sólo lo ve el servidor A, que + lo envía directamente al cliente 2. + +Ejemplo 2: + Un mensaje entre los clientes 1 y 3 lo ven los servidores A y B. + Ningún otro servidor o cliente puede verlo. + +Ejemplo 3: + Un mensaje entre los clientes 2 y 4 lo ven los servidores A, B, C + y D y el cliente 4. + +3.2 Uno-a-muchos + + El propósito principal del IRC es proporcionar un forum que permita + realizar conferencias de forma sencilla y eficiente. El IRC ofrece + varias maneras de conseguir esto, cada una con su propósito. + +3.2.1 A una lista + + La forma menos eficiente de comunicación uno-a-muchos se realiza a + través de clientes que se comunican con una "lista" de usuarios. La + forma en que esto se realiza es casi autoexplicatoria: el cliente da + una lista de destinos para un mensaje y el servidor divide la lista + y distribuye una copia separada del mensaje a cada destino. No es + tan eficiente como emplear un grupo ya que la lista de destino es + separada y el mensaje se envía sin asegurarse de que no se mandan + duplicados cada vez. + +3.2.2 A un grupo (canal) + + En el IRC el canal tiene un papel equivalente al de un foro. Su + existencia es dinámica (llendo y viniendo igual que la gente + entrando y saliendo de los canales), y la conversación se envía + únicamente a los servidores que tienen usuarios en el canal. Si hay + múltiples usuarios en un servidor en el mismo canal, el mensaje sólo + se envía una vez a ese servidor y desde él a cada cliente del canal. + Esto se repite para cada combinación cliente-servidor hasta que el + mensaje original se ha enviado a cada miembro del canal. + + Los siguientes ejemplos se refieren a la Figura 2. + +Ejemplo 4: + Un canal con un cliente en él. Los mensajes al canal van al + servidor y a ninguna parte más. + +Ejemplo 5: + 2 clientes en un canal. Todos los mensajes atraviesan un camino + igual que si fuesen mensajes privados entre dos clientes fuera de + un canal. + + + +Oikarinen & Reed [Pág. 11] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +Ejemplo 6: + Los clientes 1, 2 y 3 en un canal. Todos los mensajes se envían a + todos los clientes y sólo a los servidores que tienen que + recorrerse si fuese un mensaje privado a un único cliente. Si el + cliente 1 envía un mensaje, va al cliente 2 y, via el servidor B + al cliente 3. + +3.2.3 A una máscara de host o servidor + + Para proveer a los Operadores de IRC de mecanismos para enviar + mensajes a muchos usuarios relacionados, se proporcionan mensajes a + host y máscara de servidor. Estos mensajes se envían a usuarios cuya + información de host o servidor coincide con la de la máscara. Los + mensajes se envían únicamente a los sitios en los que están esos + usuarios, de forma similar a los canales. + +3.3 Uno-a-todos + + El tipo de mensaje uno-a-todos se describe como un mensaje de + emisión, enviado a todos los clientes, servidores o ambos. En una + red grande, un solo mensaje puede resultar en mucho tráfico a través + de la red en un intento de hacerlo llegar a todos los destinos. + + Para algunos mensajes no hay otra opción que enviarla a todos los + servidores para que la información manejada por cada servidor sea + razonablemente consistente entre servidores. + +3.3.1 Cliente-a-cliente + + No existe una clase de mensaje que, a partir de un mensaje único, + resulte en que el mensaje se envíe a todos los demás clientes. + +3.3.2 Cliente-a-servidor + + La mayoría de los comandos que resultan en un cambio en la + información sobre el estado (miembros de canal, modos de canal, + estado de usuario, etc) deben ser enviados a todos los servidores, y + esta distribución no puede ser cambiada por el cliente. + +3.3.3 Servidor-a-servidor. + + Mientras la mayoría de los mensajes entre servidores se distribuyen + a todos "los demás" servidores, esto sólo es necesario para un + mensaje que afecte bien a un usuario, un canal o un servidor. Dado + que estos son partes necesarias del IRC, casi todos los mensajes + originados de un servidor se envían a todos los demás servidores + conectados. + + + + + + +Oikarinen & Reed [Pág. 12] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +4. DETALLES DE MENSAJES + + En las páginas siguientes hay descripciones sobre cada mensaje que + reconocen el servidor y el cliente IRC. Todos los comandos descritos + en esta sección deben implementarse en cualquier servidor que siga + el protocolo. + + Cuando se liste la respuesta ERR_NOSUCHSERVER (error, no existe el + servidor), significa que el parámetro <servidor> no se encontró. El + servidor no debe enviar ninguna otra respuesta para ese comando. + + El servidor al que se conecta el cliente debe analizar el mensaje + completo, devolviendo los errores oportunos. Si el servidor + encuentra algún error fatal en el análisis de un mensaje, debe + enviarse un mensaje de error y finalizar el análisis. Un error fatal + puede ser un comando incorrecto, un destino que sea desconocido para + el servidor (en esta categoría entran servidores, nicks o canales), + parámetros que falten o privilegios incorrectos. + + Si se presenta un conjunto completo de parámetros, cada uno debe + comprobarse que es válido y se enviarán las respuestas apropiadas al + cliente. En caso de mensajes que usan listas de parámetros separados + por comas tienen que enviarse respuestas para cada uno por separado. + + En los ejemplos de abajo, algunos mensajes aparecen en formato + completo: + + :Nombre COMANDO lista de parámetros + + Estos ejemplos representan un mensaje, proveniente de "Nombre", + entre servidores, donde es fundamental incluir el nombre del emisor + original del mensaje para que los servidores remotos puedan enviar + una respuesta a través del camino correcto. + +4.1 Registro de conexión + + Los comandos descritos aquí se usan para registrar una conexión con + un servidor de IRC tanto si se trata de un usuario como si es otro + servidor, además de las desconexiones. + + No se requiere un comando "PASS" (de password) para que se registre + cada conexión de un cliente o servidor, pero debe preceder el + mensaje del servidor o lo último de la combinación NICK/USUARIO. Se + recomienda encarecidamente que las conexiones de servidor tengan una + clave de acceso para dar un grado de seguridad a las conexiones. El + orden recomendado para el registro de un cliente es el siguiente: + + 1. Mensaje de Password + 2. Mensaje de Nick + 3. Mensaje de Usuario + + + +Oikarinen & Reed [Pág. 13] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +4.1.1 Mensaje de Password + + + Comando: PASS + Parámetros: <password> + + El comando PASS se usa para establecer una "clave de conexión". La + clave puede y debe establecerse antes de cualquier intento de + realizar la conexión. Esto requiere que los clientes envíen el + comando PASS antes de la combinación NICK/USUARIO, y los servidores + *deben* enviar el comando PASS antes de cualquier comando SERVER. La + clave debe coincidir con una de las líneas C/N (para servidores) o + las I (para clientes). Es posible enviar múltiples comandos PASS + antes del registro pero sólo la última que se envía se verifica y no + puede cambiarse una vez hecho el registro. Respuestas numéricas: + + ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED + + Ejemplo: + + PASS clavesecretaaquí + +4.1.2 Mensaje de Nick + + Comando: NICK + Parámetros: <nick> [ <contadordesalto> ] + + El mensaje de NICK se usa para darle al usuario un nick o cambiar el + anterior. El parámetro <contadordesalto> se usa únicamente por los + servidores para indicar cómo de lejos está el nick del servidor. Una + conexión local tiene un contador de salto igual a 0. Si lo envía un + cliente, se ignora. + + Si llega un mensaje NICK a un servidor que ya tiene un nick idéntico + para otro cliente, ocurre una colisión de nick. Como resultado de + esto, se eliminan todas las referencias del nick de la base de datos + del servidor, y se ejecuta un comando KILL para eliminar el nick de + las bases de datos de los demás servidores. Si el mensaje NICK que + causó la colisión fue un cambio de nick, el nick original (antiguo) + también debe eliminarse. + + Si el servidor recibe un nick idéntifo de un cliente que está + conectado directamente, puede enviar un mensaje ERR_NICKCOLLISION al + cliente local, ignorar el comando NICK y no ejecutar ningún comando + KILL. + + Respuestas numéricas: + + ERR_NONICKNAMEGIVEN ERR_ERRONEUSNICKNAME + ERR_NICKNAMEINUSE ERR_NICKCOLLISION + + + +Oikarinen & Reed [Pág. 14] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + Ejemplo: + + NICK Wiz ; Introduciendo nuevo nick "Wiz". + + :WiZ NICK Kilroy ; WiZ cambia su nick a Kilroy. + +4.1.3 Mensaje de Usuario + + Comando: USER + Parámetros: <nombre de usuario> <nombre de host> + <nombre de servidor> <nombre real> + + El mensaje USER se usa al principio de cada conexión para indicar + el nombre de usuario, de host y servidor y el nombre real del nuevo + usuario. Se usa también en la comunicación entre servidores para + indicar que un nuevo usuario llega a la red de IRC, ya que sólo + tras recibirse los mensajes USER y NICK del cliente queda registrado + el usuario. + + Entre servidores el nick del cliente debe preceder al mensaje de + USER. Nótese que el nombre de host y servidor normalmente se ignoran + por el servidor cuando el comando USER viene desde un cliente + conectado directamente (por razones de seguridad), pero se usan en + comunicaciones servidor a servidor. Esto quiere decir que un nick + debe enviarse siempre a un servidor remoto cuando entra un nuevo + usuario a la red antes de enviarse el mensaje USER. + + El parámetro <nombre real> debe ser el último, ya que puede contener + espacios en blanco y debe ir precedido por dos puntos (":") para + asegurarse de que se reconoce como tal. + + Dado que es fácil para un cliente mentir sobre el nombre de usuario + apoyado únicamente en el mensaje USER, se recomienda el empleo de un + "Servidor de Identidad". Si el host desde el que conecta un usuario + tiene ese servidor activado, el nombre de usuario es el que + proporciona dicho servidor. + + Respuestas numéricas: + + ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED + + Ejemplos: + + + USER guest tolmoon tolsun :Ronnie Reagan + ;El usuario se registra con nombre + de usuario "guest" y nombre real + "Ronnie Reagan". + + + + + +Oikarinen & Reed [Pág. 15] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + + :testnick USER guest tolmoon tolsun :Ronnie Reagan + ;mensaje entre servidores con el + nick al que pertenece el comando + USER + +4.1.4 Mensaje de Servidor + + Comando: SERVER + Parámetros: <nombre de servidor> <contador de salto> <información> + + El mensaje de servidor se usa para indicar a un servidor que el otro + lado de la conexión es un servidor. También se emplea para enviar + datos sobre servidores a través de toda la red. Cuando se conecta un + nuevo servidor a la red, debe enviarse información sobre él al resto + de la red. El <contador de salto> se usa para dar a los servidores + información interna sobre cómo de lejos están todos los servidores. + Con una lista completa de los servidores, sería posible construir un + mapa completo del árbol de servidores, pero las máscaras de host lo + evitan. + + El mensaje SERVER sólo debe aceptarse desde (a) una conexión + pendiente de ser registrada y que se intenta registrar como servidor + o (b) una conexión existente a otro servidor, en cuyo caso el + mensaje SERVER introduce un nuevo servidor tras ese servidor. + + La mayoría de los errores que ocurren al recibirse el comando SERVER + acaban en una finalizacion de la conexión por parte del host de + destino (servidor objetivo). Las respuestas de error se envían + normalmente usando el comando "ERROR" en lugar de una respuesta + numérica ya que el comando ERROR tiene propiedades que le hacen + útil en este caso. + + Si un mensaje de SERVER se analiza e intenta introducir un servidor + que ya es conocido por el servidor destino, la conexión de la que + vino el mensaje debe cerrarse (siguiendo los procedimientos + adecuados), ya que se forma una ruta doble a un servidor y por tanto + la naturaleza acíclica del árbol de la red IRC. + + Respuestas numéricas: + + ERR_ALREADYREGISTRED + + Ejemplo: + +SERVER test.oulu.fi 1 :[tolsun.oulu.fi] Servidor experimental + ; El nuevo servidor test.oulu.fi se + presenta e intenta registrarse. El + nombre entre corchetes es el nombre de + host que lleva test.oulu.fi. + + + +Oikarinen & Reed [Pág. 16] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + + +:tolsun.oulu.fi SERVER csd.bu.edu 5 :BU Servidor central + ; Servidor tolsun.oulu.fi es el enlace + superior de csd.bu.edu, que está a 5 + saltos. + +4.1.5 Oper + + Comando: OPER + Parámetros: <usuario> <password> + + El comando OPER se usa para que un usuario normal obtenga + privilegios de Operador. La combinación <usuario> y <password> es + necesaria para conseguir los privilegios de Operador. + + Si el cliente que envía el comando de OPER da un password correcto + para el usuario dado, el servidor informa al resto de la red del + nuevo Operador ejecutando un comando "MODE +O" para el nick del + cliente. + + El mensaje OPER es exclusivamente cliente-servidor. + + Respuestas numéricas: + + ERR_NEEDMOREPARAMS RPL_YOUREOPER + ERR_NOOPERHOST ERR_PASSWDMISMATCH + + Ejemplo: + + OPER foo bar ; Intenta registrarse como Operador + usando el nombre de usuario "foo" y + la clave "bar" + +4.1.6 Mensaje de salida + + Comando: QUIT + Parámetros: [<Mensaje de salida>] + + Una sesión de un cliente se finaliza con un mensaje de salida. El + servidor debe cerrar la conexión con un cliente que envía un mensaje + de salida. Si se da un <Mensaje de salida>, éste se enviará en lugar + del mensaje por defecto, el nick. + + Cuando hay netsplits (desconexión de dos servidores), el mensaje de + salida está formado por los nombres de los servidores involucrados, + separados por un espacio. El primer nombre es el servidor que aún + está conectado, el segundo el que ha desconectado. + + + + + +Oikarinen & Reed [Pág. 17] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + Si, por cualquier otra razón, se cierra la conexión con un cliente + sin que el cliente envíe el comando QUIT (ej: el cliente muere y hay + un EOF - End Of File - en el socket), el servidor debe rellenar el + mensaje de salida con un mensaje que refleje la naturaleza de la + causa que ha hecho que ocurra. + + Respuestas numéricas: + + Ninguna. + + Ejemplos: + + QUIT :Me voy a comer ; Formato de mensaje + +4.1.7 Mensaje de salida del servidor + + Comando: SQUIT + Parámetros: <servidor> <comentario> + + + El mensaje SQUIT se necesita para tratar los servidores que + desconectan. Si un servidor quiere terminar la conexión con otro + servidor, debe enviar un mensaje SQUIT al otro servidor, con el + nombre del otro servidor como parámetro, lo que cierra su conexión + con el servidor que desconecta. + + Este comando está disponible a los Operadores para ayudar a mantener + una red de IRC conectada de forma ordenada. Los Operadores también + pueden ejecutar un comando SQUIT para una conexión remota entre + servidores. En este caso, el SQUIT debe analizarse por cada servidor + entre el Operador y el servidor remoto, actualizando el esquema de + la red mantenida por cada servidor de la forma que se explica más + abajo. + + El <comentario> debe ser indicado por los Operadores que ejecuten un + SQUIT para un servidor remoto (esto es, uno que no está conectado al + servidor en el que se encuentre el Operador), de forma que los demás + Operadores sepan la causa de la desconexión. El <comentario> también + lo rellenan los servidores, pudiendo incluir mensajes de error. + + Se requiere que los dos servidores a cada lado de la conexión que + finaliza envíen un mensaje SQUIT (a todas sus conexiones con otro + servidor), para que lo reciban todos los servidores detrás de ese + enlace. + + De la misma forma, un mensaje QUIT debe enviarse a los demás + servidores conectados a la red en representación de todos los + clientes tras ese enlace. Además, todos los miembros de un canal que + pierdan un miembro debido al split deben recibir un mensaje de + QUIT. + + + +Oikarinen & Reed [Pág. 18] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + Si una conexión con un servidor finaliza prematuramente (ej: se cae + el servidor en el otro lado del enlace), el servidor que detecte la + desconexión debe informar al resto de la red que la conexión se ha + cerrado y rellenar el campo de comentario con algo apropiado. + + Respuestas numéricas: + + ERR_NOPRIVILEGES ERR_NOSUCHSERVER + + Ejemplo: + + SQUIT tolsun.oulu.fi :¿Enlace erróneo? ;El enlace del servidor + tolson.oulu.fi ha finalizado + por "Enlace erróneo" + + :Trillian SQUIT cm22.eng.umd.edu : Servidor fuera de control + ; Mensaje de servidor fuera de + control de Trillian para que + desconecte "cm22.eng.umd.edu" por + "Servidor fuera de control" + +4.2 Operaciones en un canal + + Este grupo de mensajes se refiere a la manipulación de canales, sus + propiedades (modos de canal) y sus contenidos (normalmente clientes). + Al implementarlos, son inevitables unas condiciones de "carrera", + cuando clientes en lados opuestos de una red envíen comandos que + acabarán colisionando. También se requiere que el servidor mantenga + un historial para verificar, cuando se de un parámetro <nick> si + éste ha cambiado. + +4.2.1 Mensaje de entrada al canal (JOIN) + + Comando: JOIN + Parámetros: <canal>{,<canal>} [<clave>{,<clave>}] + + El comando JOIN lo usa el cliente para empezar a escuchar un canal + específico. El que se permita a un cliente entrar al canal o no lo + verifica solamente el servidor al que está conectado el cliente; los + demás servidores automáticamente añaden el usuario al canal cuando + reciben el mensaje de otros servidores. Las condiciones que debe + cumplir el cliente son: + + 1. el usuario debe ser invitado si el canal está en modo + sólo invitados; + + 2. el <nick>/<nombre de usuario>/<nombre de host> del usuario + no debe cumplir ninguno de los bans activos; + + 3. debe pasarse la clave correcta si está activa en el canal. + + + +Oikarinen & Reed [Pág. 19] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + Esto se discute con mayor detalle bajo el comando MODE (ver sevvión + 4.2.3 para más información). + + Una vez que el usuario ha entrado al canal, recibe anuncios sobre + todos los comandos que su servidor recibe que afecten al canal. Esto + incluye MODE, KICK, PART, QUIT y por supuesto PRIVMSG/NOTICE. El + comando JOIN debe enviarse a todos los servidores para que cada + servidor sepa dónde encontrar los usuarios de un canal. Esto permite + un envío óptimo de mensajes PRIVMSG/NOTICE al canal. + + Si se consigue entrar al canal, se envía al usuario el "topic" del + canal (usando RPL_TOPIC) y la lista de usuarios que están en el + canal (usando RPL_NAMREPLY), que debe incluir el usuario recién + entrado. + + Respuestas numéricas: + + ERR_NEEDMOREPARAMS ERR_BANNEDFROMCHAN + ERR_INVITEONLYCHAN ERR_BADCHANNELKEY + ERR_CHANNELISFULL ERR_BADCHANMASK + ERR_NOSUCHCHANNEL ERR_TOOMANYCHANNELS + RPL_TOPIC + + Ejemplos: + + JOIN #foobar ; unirse al canal #foobar. + + JOIN &foo fubar ; unirse al canal &foo usando como + clave "fubar". + + JOIN #foo,&bar fubar ; unirse al canal #foo usando la + clave "fubar" y &bar sin clave. + + JOIN #foo,#bar fubar,foobar ; unirse al canal #foo con la clave + "fubar" y el canal #bar clave + "foobar". + + JOIN #foo,#bar ; unirse a los canales #foo and #bar + + :WiZ JOIN #Twilight_zone ; mensaje JOIN de WiZ + +4.2.2 Mensaje de salida del canal (PART) + + Comando: PART + Parámetros: <canal>{,<canal>} + + El mensaje de salida provoca el borrado de la lista de usuarios + activos de todos los canales dados en la lista de parámetros. + + + + + +Oikarinen & Reed [Pág. 20] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + Respuestas numéricas: + + ERR_NEEDMOREPARAMS ERR_NOSUCHCHANNEL + ERR_NOTONCHANNEL + + Ejemplos: + + PART #twilight_zone ; abandonar el canal "#twilight_zone" + + PART #oz-ops,&group5 ; abandonar canales "&group5" y + "#oz-ops". + +4.2.3 Mensaje de modos + + Comando: MODE + + El comando MODE es un comando de doble propósito en el IRC. Permite + cambiar los modos tanto a los usuarios como a los canales. La razón + de ser de esta elección es que algún día los nicks serán obsoletos y + la propiedad equivalente será el canal.N. del T.:Realmente no sé qué + quieren decir aquí, ya que si uno no accede con un nick... ¿Cómo lo + hace? + + Al analizar mensajes MODE, se recomienda analizar primero el mensaje + completo y pasar los cambios después. + +4.2.3.1 Modos de canal + + Parámetros: <canal> {[+|-]|o|p|s|i|t|n|b|v} [<límite>] [<usuario>] + [<máscara de ban>] + + El comando MODE se proporciona para que los operadores de canal + puedan cambiar las características de su canal. Se necesita también + que los servidores puedan cambiar los modos de canal para poderse + crear operadores de canal. + + Los modos disponibles para canales son: + + o - dar/quitar privilegios de operador de canal + p - modo de canal privado + s - canal secreto + i - canal sólo invitados + t - sólo los operadores de canal pueden cambiar el topic + n - no se permiten mensajes al canal desde clientes de fuera + m - canal moderado + l - establecer un límite de usuarios en el canal + b - poner una máscara de ban para mantener usuarios fuera + v - dar/quitar voz en un canal moderado + k - poner clave al canal + + + + +Oikarinen & Reed [Pág. 21] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + Al usar las opciones 'o' y 'b', hay una restricción de un total de 3 + por comando MODE. Esto quiere decir que cualquier combinación de 'o' + y 'b' no debe exceder de 3 en número de parámetros. + +4.2.3.2 Modos de usuario + + Parámetros: <nick> {[+|-]|i|w|s|o} + + Los modos de usuario son cambios que afectan a cómo ven los demás al + cliente o los mensajes "extra" que puede recibir. Un comando MODE + sólo se acepta si tanto el que lo envía como el nick dado como + parámetro coinciden. + + Los modos disponibles son: + + i - marca el usuario como invisible + s - marca al usuario para que reciba los mensajes del + servidor + w - el usuario recibe wallops (ver 5.6) + o - modo de Operador + + Puede haber modos adicionales disponibles más adelante. + + Si un usuario intenta hacerse operador usando la opción "+o", debe + ignorarse. En cambio, no hay restricción en que uno se "deopee" (con + "-o"). + + Respuestas numéricas: + + ERR_NEEDMOREPARAMS RPL_CHANNELMODEIS + ERR_CHANOPRIVSNEEDED ERR_NOSUCHNICK + ERR_NOTONCHANNEL ERR_KEYSET + RPL_BANLIST RPL_ENDOFBANLIST + ERR_UNKNOWNMODE ERR_NOSUCHCHANNEL + + ERR_USERSDONTMATCH RPL_UMODEIS + ERR_UMODEUNKNOWNFLAG + + Ejemplos: + + Uso de los modos de canal: + +MODE #Finnish +im ; El canal #Finnish es ahora moderado y + sólo para invitados + +MODE #Finnish +o Kilroy ; Da privilegios de "chanop" a Kilroy + en el canal #Finnish. + +MODE #Finnish +v Wiz ; Permite hablar a WiZ en #Finnish. + +MODE #Fins -s ; El canal #Fins deja de ser "secreto" + + +Oikarinen & Reed [Pág. 22] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + +MODE #42 +k oulu ; Poner como clave del canal "oulu" + +MODE #eu-opers +l 10 ; Poner un límite de 10 usuarios en el + canal + +MODE &oulu +b ; Lista de máscaras de ban del canal + +MODE &oulu +b *!*@* ; Prohibe la entrada a todos los + usuarios + +MODE &oulu +b *!*@*.edu ; Prohíbe la entrada a cualquier + usuario con máscara de host *.edu + + Uso de los modos de usuario: + +:MODE WiZ -w ; Desactiva la recepción de mensajes + WALLOPS para WiZ + +:Angel MODE Angel +i ; Mensaje de Angel para hacerse + invisible + +MODE WiZ -o ; WiZ "deopeándose" (quitar estatus de + operador. El inverso no debe permitirse + a los usuarios ya que se saltaría el + comando OPER. + +4.2.4 Mensaje de tópico + + Comando: TOPIC + Parámetros: <canal> [<tópico>] + + El mensaje TOPIC se usa para cambiar o ver el tópico de un canal. El + tópico para el canal <canal> se devuelve si no se especifica. Si el + parámetro <tópico> está presente, se cambiará el tópico, si los + modos del canal lo permiten. + + Respuestas numéricas: + + ERR_NEEDMOREPARAMS ERR_NOTONCHANNEL + RPL_NOTOPIC RPL_TOPIC + ERR_CHANOPRIVSNEEDED + + Ejemplos: + + :Wiz TOPIC #test :Nuevo tópico ;El usuario WiZ pone un tópico + + TOPIC #test :otro tópico ;Pone el tópico "otro tópico" en + #test + + TOPIC #test ;Mirar el tópico de #test + + +Oikarinen & Reed [Pág. 23] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + +4.2.5 Mensaje de nombres + + Comando: NAMES + Parámetros: [<canal>{,<canal>}] + + Con el comando NAMES, un usuario puede listar todos los nicks que + sean visibles en cualquier canal que puedan ver. Los nombres de + canal que pueden ver son los que no son privados (+p) o secretos + (+s), o aquellos en los que se encuentran. El parámetro <canal> + especifica el (los) canal(es) de los cuales hay que devolver la + información si es posible. No hay mensaje de error si el nombre del + canal es incorrecto. + + Si no se especifica un parámetro <canal>, se da una lista de todos + los canales y sus ocupantes. Al final de la lista, aparecen los + usuarios que son visibles pero o bien no están en ningún canal o en + un canal visible, y se marcan como si estuviesen en el "canal" '*'. + + Respuestas numéricas: + + RPL_NAMREPLY RPL_ENDOFNAMES + + Ejemplos: + + NAMES #twilight_zone,#42 ;listar usuarios visibles en #42 y + #twilight_zone si puedes ver los + canales + + NAMES ;listar todos los canales y usuarios + visibles + +4.2.6 Mensaje de lista de canales + + Comando: LIST + Parámetros: [<canal>{,<canal>} [<servidor>]] + + El mensaje LIST se usa para listar los canales y sus tópicos. Si se + da el parámetro <canal>, solo se visualiza el estatus de ese canal. + Los canales privados se listan (sin el tópico) como canal "Prv" a no + ser que el cliente que genere la petición se encuentre en el canal. + De la misma forma, los canales secretos no se listan a menos que el + cliente sea miembro del canal en cuestión. + + Respuestas numéricas: + + ERR_NOSUCHSERVER RPL_LISTSTART + RPL_LIST RPL_LISTEND + + + + + + +Oikarinen & Reed [Pág. 24] + +RFC 1459 Protocolo de Charla Basada en Internet Mayo 1993 + + + Ejemplos: + + LIST ;Listar todos los canales + + LIST #twilight_zone,#42 ;Listar canales #twilight_zone y #42 + + +4.2.7 Mensaje de invitación a un canal + + Comando: INVITE + Parámetros: <nick> <canal> + + El mensaje INVITE se usa para invitar a otros usuarios a un canal. + El parámetro <nick> es el nick de la persona a invitar al canal + <canal>. No se requiere que el canal al que se invita al usuario + exista o sea un canal válido. Para invitar a alguien a un canal sólo + para invitados (+i), el cliente que envíe el mensaje INVITE debe ser + operador de canal en dicho canal. + + Respuest... [truncated message content] |