[IRC-DEV] Re: Raw 401 en ocasiones no devuelve el nick (no me refiero a nosuch server)

Óscar García red_star23 at yahoo.es
Wed Sep 11 13:36:10 CEST 2002


 --- Ruben Cardenal <rubenc at arrakis.es> escribió: > 
> ... puuuuuuf ... mucho royo informático sobre programación ;)
>
>   f) Ahora, llegamos a la parte interesante, la que dice eso de...
> 
>        else if (MyUser(sptr) || Protocol(cptr) < 10)
>          sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], nick);
>        else
>          sendto_one(sptr,
>              ":%s %d %s * :Target left IRC. Failed to deliver: [%.50s]",
>              me.name, ERR_NOSUCHNICK, sptr->name, parv[parc - 1]);
>        continue;
> 
> ... puuuuuuuuuuuuuf ... otro tocho de cosas de programación ;)

En castellano, que se envía un "*" en el lugar donde debería aparecer el nick. He capturado unas
tramas con mi bonito analizador de protocolos (publicidad offtopic incluida ;) y he aquí una
muestra de lo que ocurre:

(Siento si el correo corta las columnas)

Cliente -> Servidor
[0000047] (20 bytes)11/09/02 13:24:35
50 52 49 56 4D 53 47 20 73 65 65 65 67 20 3A 68 6F 6C 61 0A              -  PRIVMSG seeeg :hola.

Servidor -> Cliente
[0000048] (127 bytes)11/09/02 13:24:35
3A 73 65 65 65 67 21 6C 61 6E 69 6E 69 61 40 44 43 50 72 4C 54 2E 43 34  - 
:seeeg!laninia at DCPrLT.C4
7A 44 43 46 2E 76 69 72 74 75 61 6C 20 51 55 49 54 20 3A 0D 0A 3A 70 6C  -  zDCF.virtual QUIT
:..:pl
75 74 6F 6E 2E 69 72 63 2D 68 69 73 70 61 6E 6F 2E 6F 72 67 20 34 30 31  -  uton.irc-hispano.org
401
20 69 72 69 73 32 35 20 2A 20 3A 54 61 72 67 65 74 20 6C 65 66 74 20 49  -   iris25 * :Target left
I
52 43 2E 20 46 61 69 6C 65 64 20 74 6F 20 64 65 6C 69 76 65 72 3A 20 5B  -  RC. Failed to deliver:
[
68 6F 6C 61 5D 0D 0A                                                     -  hola]..

Demuestra que envía un "*" donde debería aparecer el nick al que ha fallado la entrega del
mensaje.

¿Cómo solucionarlo? pues añadiendo un %s en el lugar del * y añadiendo nick a la lista de
parámetros quedando algo parecido a esto:

        else if (MyUser(sptr) || Protocol(cptr) < 10)
          sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], nick);
        else
          sendto_one(sptr,
              ":%s %d %s %s :Target left IRC. Failed to deliver: [%.50s]",
              me.name, ERR_NOSUCHNICK, sptr->name, nick, parv[parc - 1]);
        continue;

Si alguien quiere probar si funciona que lo haga (debería hacerlo perfectamente). El único
problema es que obviamos el motivo por el que el autor del original ircd decidió no indicar el
nick. Posiblemente sea debido a que no debemos notificar nicks ya no existentes en la red (para
evitar duplicados por retardos en la propagación de nicks en el caso de que simultáneamente entre
el mismo nick por otro servidor) o por algún motivo justificado. Creo que sería una buena opción
preguntar al autor porqué decidió no notificarlo.

Un saludo a todos.


--------------------------------------------------------------------------------
Remember: Un*x _IS_ user friendly... It's just selective about who it's friends are
http://redstar.linaresdigital.com/

_______________________________________________________________
Yahoo! Messenger
Nueva versión: Webcam, voz, y mucho más ¡Gratis! 
Descárgalo ya desde http://messenger.yahoo.es



More information about the IRC-Dev mailing list