<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-27316063</id><updated>2011-11-08T15:41:02.836+01:00</updated><category term='Internet'/><category term='Bienvenida'/><category term='C'/><title type='text'>Diarios de mi ordenador</title><subtitle type='html'>Recetas técnicas descubiertas en un momento dado, apaños, trucos y curiosidades que no quiero que desaparezcan en el tiempo como lágrimas en la lluvia.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pesso.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pesso.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Pesso</name><uri>http://www.blogger.com/profile/12212800076215082111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27316063.post-114858755733756473</id><published>2006-05-25T22:05:00.000+02:00</published><updated>2007-02-24T15:14:19.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Los problemas de la IP dinamica en la Internet actual</title><content type='html'>Esta muy bien tener tus servidores en casa y poder usarlos desde cualquier lado. El CVS, un apache, SSH, ... vamos cosas utiles. El problema viene cuando tienes IP dinamica. Hay que hacer algún apaño para que eso no nos impida acceder a nuestros servidores cuando queramos y aqui es donde entra el tema de hoy.&lt;br /&gt;&lt;h4&gt;¿Como encontrar nuestra IP dinamica en Internet?&lt;/h4&gt;&lt;br /&gt;Reflexionando un poco sobre como llevar esto a cabo se llega rapidamente a la conclusión de que hace falta un "punto fijo". Tiene que haber algo que se pueda encontrar siempre. Una idea que no llegue a desarrollar fue usar por ejemplo una dirección de correo. Pensar en como quedaría la bandeja de entrada fue suficiente para aparcar la idea.&lt;br /&gt;&lt;br /&gt;La primera intentona que puse en práctica fue usar uno de esos servicios gratuitos que ofrecen DNS dinamico como &lt;a href="http://www.dyndns.org/"&gt;DynDns&lt;/a&gt; o &lt;a href="http://www.no-ip.com/"&gt;No-IP&lt;/a&gt;. Los resultados no fueron buenos. Cada vez que necesitaba acceder a mis archivos desde remoto tenía la duda de si podría hacerlo, y a menudo la respuesta era un no rotundo. Unas veces el programa cliente que se ejecuta en mi maquina no se habia arrancado como estaba programado, otras se había muerto de repente, otras era incapaz de contactar. Pero lo más sorprendente me lo encontre cuando el sistema fallaba en la parte del servidor, la configuración de mi cuenta desaparecia. No quiero dar mala imagen a estos servicios, es posible que fuera yo mismo, realizando excesivas peticiones de actualización en poco tiempo el que provocase este efecto. El resultado sin embargo es el mismo, estos servicios no me valian.&lt;br /&gt;&lt;br /&gt;Me dió por el bricolaje y me monté un sistema propio. La solución consistia en dos partes al igual que los metodos de DNS dinanicos, una dirección bien conocida y un programa cliente.&lt;br /&gt;&lt;br /&gt;Como dirección conocida use una página web que me regalaron con la conexión y que hasta ese momento tenia muerta de risa. Dicha página es todo un logro minimalista, consiste en cuatro números separados por puntos. Esos números son mi dirección IP actual.&lt;br /&gt;&lt;br /&gt;Eso nos lleva a la parte cliente, que es el responsable de que la dirección IP que aparece en la página sea, efectivamente, mi dirección. Desgraciadamente, la web de regalo que tengo no admite php lo que complica mucho el tema.  Así pues, una vez más he de recurrir a terceros para continuar.&lt;br /&gt;&lt;br /&gt;Existen multitud de páginas web que te informan de la IP desde la que te conectas. Una simple &lt;a href="http://www.google.es/search?hl=es&amp;q=ip+mi&amp;amp;btnG=B%C3%BAsqueda&amp;meta="&gt;búsqueda en Google&lt;/a&gt; ofrece un gran abanico para elegir. Nuestro programita cliente puede usar cualquiera de ellas para obtener la información que búscamos. Una vez que conoce ese dato crea la página web oportuna y la sube al servidor.&lt;br /&gt;&lt;br /&gt;Ahora bien, al ser la IP dinamica puede cambiar con el tiempo así que es necesario ejecutar el programa de vez en vez. Si esto se hace a mano posiblemente cuando nos haga falta que este actualizado sera la vez que se nos olvido actualizar, aparte de lo incomodo que resultaría. Pero aquí es donde cron viene en nuestro rescate. Para los que no lo sepan cron es un demonio que corre en todos los Linux y se encarga de ejecutar tareas en momentos concretos. Basta con crear una tarea que invoque a nuestro programilla tres o cuatro veces al día para completar el último vertice de la solución.&lt;br /&gt;&lt;br /&gt;Si se aloja la página en un servidor que admita php, la consulta para hallar la IP la podemos realizar contra una página nuestra y convertir este esquema en uno del tipo Juan Palomo.&lt;br /&gt;&lt;br /&gt;En efecto, esto es un metodo rebuscado y cicatero de poder conectar con tu ordenador en cualquier momento. Los dominios son baratos y los servicios de DNS dinamicos suelen funcionar. Pero como ya he dicho, hoy tengo el día Bricomanía.&lt;br /&gt;&lt;br /&gt;Para terminar os pongo el codigo fuente (en C) del programita. Mirandolo con calma, se ve que un shell script podria hacer lo mismo usando programas ya existentes y manejo de expresiones regulares. Hay dos motivos por los que no sea un script. La primera:  Sería muy complicado hacer un script multiplataforma. En este blog hablo de mi ordenador, el cual usa GNU/Linux casi todo el tiempo, pero aun así tengo cierto afan de universalidad. Si puedo evitarlo prefiero no discriminar a nadie por el sistema operativo que use. La segunda: Me apetecía trastear un poco con los protocolos de internet.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;netdb.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;strings.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;sys/stat.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#include &amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define SERVER_IP &amp;lt;servidor web&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define MAX_COM  2048&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define CMD_USER "USER &amp;lt;usuario&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define CMD_PASSWD "PASS &amp;lt;password&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define CMD_TYPE "TYPE I"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define CMD_PASV "PASV"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define CMD_STOR "STOR /&amp;lt;pagina web&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define CR  13&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define LF  10&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define HTTP_IP  &amp;lt;servidor dice IP&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define GET  "GET &amp;lt;pagina dice IP&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define HD_HOST  "Host: &amp;lt;servidor dice IP&amp;gt;:80"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define HD_CLOSE "Connection: close"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#define HD_CACHE "Cache-Control: No-cache"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; puerto_datos;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; conectar_ftp( &lt;/span&gt;&lt;span style="color: #800000;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; puerto );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; comunicar( &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; comando( &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd, &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* cmd, &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;** respuesta );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; obtener_puerto( &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* buffer );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; determinar_ip( &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd, &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;** ip );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; encontrar_ip( &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; bruto[], &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;** ip );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; actualizar_ip( &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* ip, &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd_datos );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; conectar( &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* nombre, &lt;/span&gt;&lt;span style="color: #800000;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; puerto );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; main() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; error = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* ip;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd_control;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd_datos;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd_http;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; fin;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; ip = (&lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; *)malloc( &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; fd_http = conectar( HTTP_IP, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;80&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( fd_http &amp;lt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;  ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No se puede conectar &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    mediante http\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  exit( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; determinar_ip( fd_http, &amp;amp;ip );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; close( fd_http );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( strlen( ip ) &amp;gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;6&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  fd_control = conectar( SERVER_IP, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;21&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( fd_control &amp;lt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;  ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No se puede conectar al &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     ftp (control)\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   exit( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  error = comunicar( fd_control );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( error &amp;lt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Fallo en la comunicacion &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     con FTP\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  fd_datos = conectar( SERVER_IP, puerto_datos );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( fd_datos &amp;lt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;  ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No se puede conectar al &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     ftp (datos)\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   exit( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  error = send( fd_datos, ip, strlen( ip ), &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( error &amp;lt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;  ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No se puede escribir en el &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     ftp (datos)\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   exit( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-style: italic;color: #808080;"&gt;/* cerramos fds */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  close( fd_datos );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  close( fd_control );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( error &amp;lt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No se ha podido actualizar la ip&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; } &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( strlen( ip ) &amp;gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;6&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Se ha actualizado la ip&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  } &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Se ha mantenido la ip &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     anterior\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; exit( error );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; comunicar( &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; buffer[MAX_COM];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; numbytes;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; resultado;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; error = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* res;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; res = (&lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; *)malloc( MAX_COM );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; numbytes = recv( fd, buffer, MAX_COM, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( numbytes == -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Error en recv() &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( buffer[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;] !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'2'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No se puede conectar&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; resultado = comando( fd, CMD_USER, &amp;amp;res  );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( resultado !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'3'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Nombre de usuario no valido&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; resultado = comando( fd, CMD_PASSWD, &amp;amp;res );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( resultado !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'2'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Contraseña incorrecta&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; resultado = comando( fd, CMD_TYPE, &amp;amp;res );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( resultado !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'2'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; resultado = comando( fd, CMD_PASV, &amp;amp;res );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( resultado !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'2'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No admite modo pasivo&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; obtener_puerto( res );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; resultado = comando( fd, CMD_STOR, &amp;amp;res );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( resultado ==&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'4'&lt;/span&gt;&lt;span style="color: #000000;"&gt; || resultado == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'5'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"No se puede subir el fichero&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;( -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; comando( &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd, &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* cmd, &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;** respuesta ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; buffer[MAX_COM];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; numbytes;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; bzero( buffer, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;( buffer) );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; strcpy( buffer, cmd );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; buffer[strlen( cmd )] = CR;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; buffer[strlen( cmd ) + &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;] = LF;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; numbytes = send( fd, &amp;amp;buffer, strlen( cmd ) + &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( numbytes == -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Error en send() &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( strcmp( cmd , CMD_STOR ) != &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; numbytes = recv( fd, buffer, MAX_COM, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( numbytes == -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Error en recv() &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; strcpy( *respuesta, buffer );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; buffer[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; obtener_puerto( &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* buffer ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; c;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; acumulado;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; puerto_g;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; puerto_p;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; i = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( c !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'('&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( c !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;','&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  c = buffer[i];   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( c !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;','&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  c = buffer[i];   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( c !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;','&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  c = buffer[i];   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( c !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;','&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  c = buffer[i];   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; acumulado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( c !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;','&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  acumulado = (acumulado * &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;) + ( c - &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'0'&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  c = buffer[i];   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; puerto_g = acumulado;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; c = buffer[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; acumulado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( c !=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;')'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  acumulado = (acumulado * &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;) + ( c - &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'0'&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  ++i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  c = buffer[i];   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; puerto_p = acumulado;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; puerto_datos = ((puerto_g * &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;256&lt;/span&gt;&lt;span style="color: #000000;"&gt;) + puerto_p);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; conectar( &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;* nombre, &lt;/span&gt;&lt;span style="color: #800000;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; puerto ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; sockaddr* addr;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;color: #808080;"&gt;/* estructura que recibir�informaci� sobre el nodo remoto */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; hostent *he;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;color: #808080;"&gt;/* informaci� sobre la direcci� del servidor */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; sockaddr_in server;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; error = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; he = gethostbyname( nombre );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( he == NULL ) { &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-style: italic;color: #808080;"&gt;/* llamada a gethostbyname() */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"gethostbyname() error&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; fd = socket(AF_INET, SOCK_STREAM, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( fd == -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"socket() error&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; server.sin_family = AF_INET;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; server.sin_port = htons(puerto);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;color: #808080;"&gt;/*he-&amp;gt;h_addr pasa la informaci� de ``*he'' a "h_addr" */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; server.sin_addr = *((&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; in_addr *)he-&amp;gt;h_addr);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; bzero(&amp;amp;(server.sin_zero),&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(connect(fd, (&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; sockaddr *)&amp;amp;server, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; sockaddr))==-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;){ &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"connect() error&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; determinar_ip( &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; fd, &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;** ip ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; buffer[MAX_COM];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; numbytes;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; bzero( buffer, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;( buffer) );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; sprintf( buffer, &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"%s%c%c%s%c%c%s%c%c%s%c%c%c%c"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, GET, CR, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   LF, HD_HOST, CR, LF, HD_CLOSE, CR, LF, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   HD_CACHE, CR, LF,CR, LF );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; numbytes = send( fd, &amp;amp;buffer, strlen( buffer ), &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( numbytes == -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Error en send() &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; numbytes = recv( fd, buffer, MAX_COM, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( numbytes == -&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  printf(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"Error en recv() &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;\n&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;(-&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; encontrar_ip( buffer, ip );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #800000;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; encontrar_ip( &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; bruto[], &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;** ip ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; estado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="font-style: italic;color: #808080;"&gt;//No se ha encontrado nada&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; str_ip[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; indice = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; indice_ip = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; actual;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; actual = bruto[indice];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( estado != &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;amp;&amp;amp; actual != &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt;( estado ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( actual == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'I'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     estado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( actual == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'P'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     estado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    } &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     estado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( actual == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;':'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     estado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    } &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     estado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( actual == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'.'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     str_ip[indice_ip] = actual;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     indice_ip++;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( actual &amp;gt;= &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'0'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;amp;&amp;amp; actual &amp;lt;= &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'9'&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     str_ip[indice_ip] = actual;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     indice_ip++;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( actual == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;' '&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;     &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    estado = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  indice++;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  actual = bruto[indice];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; str_ip[indice_ip] = &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt; memcpy( *ip, str_ip, strlen( str_ip ) + &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27316063-114858755733756473?l=pesso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pesso.blogspot.com/feeds/114858755733756473/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27316063&amp;postID=114858755733756473&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114858755733756473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114858755733756473'/><link rel='alternate' type='text/html' href='http://pesso.blogspot.com/2006/05/los-problemas-de-la-ip-dinamica-en-la.html' title='Los problemas de la IP dinamica en la Internet actual'/><author><name>Pesso</name><uri>http://www.blogger.com/profile/12212800076215082111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27316063.post-114840756383164650</id><published>2006-05-23T20:05:00.000+02:00</published><updated>2006-05-29T22:35:15.563+02:00</updated><title type='text'>Control de versiones para documentos III: Usando docbook</title><content type='html'>Hoy toca la tercera y última entrega de este tema. Voy a escribir muy poco ya que el &lt;a href="fortran.blogspot.com"&gt;Tito Fortran&lt;/a&gt; ha escrito un &lt;strong&gt;extenso&lt;/strong&gt; &lt;a href="http://fortran.blogspot.com/2006/05/cojo-gestin-de-configuracin.html"&gt;artículo&lt;/A&gt; al respecto.&lt;br /&gt;&lt;br /&gt;El trabajo colaborativo en un documento, que es lo que comentamos aquí, es un objetivo muy interesante pero Fortran ha ido más lejos. Su intención es realizar una documentación inteligente de las fases de análisis y diseño de un producto software, lo cual requiere algo más. El método que él explica consiste en separar el contenido de la estructura. ¿Cuantos requisitos habrán desparecido (o se han colocado de forma que son difíciles de encontrar que es casi lo mismo) por no renumerar los ya existentes?&lt;br /&gt;&lt;br /&gt;El articulo es muy completo y, sobre todo, práctico. Alguno puede sentirse intimidado ya que es largo y tarata temas muy diferentes: &lt;a href="http://www.it.uc3m.es/%7Epedmume/asignaturas/2006/LAO/Lab_2/index_es.html"&gt;Makefiles&lt;/a&gt;, scripts de &lt;A href="http://es.tldp.org/Tutoriales/Python/Tutorial-Python/"&gt;python&lt;/A&gt;, hojas de cálculo y &lt;A href="http://vex.sourceforge.net/"&gt;editores&lt;/A&gt; extraños. Tranquilidad que no pasa nada, no es necesario meterse con todo de golpe. Esta escrito de tal modo que cada tema es medianamente independiente, de modo que cada uno puede sacar lo que necesite. Lo básico para el tema que tratamos aquí es &lt;A href="http://es.tldp.org/Tutoriales/DOCBOOK/doctut/"&gt;saber manejar Docbook&lt;/A&gt;, ver que editores hay disponibles (mi elección es &lt;A href="http://www.jedit.org/"&gt;Jedit&lt;/A&gt;) y el uso del CVS. A partir de los ejemplos dados no resulta complicado realizar un documento maestro, dividir el contenido en diferentes archivos y usar un Makefile para unirlo todo mediante xmllint. &lt;br /&gt;&lt;br /&gt;Una vez que se empiezan a hacer bien las cosas, es difícil volver a los métodos antiguos. La curva de aprendizaje puede ser un poco empinada para aquellos que no han tenido contacto con ninguna de estas tecnologías pero en poco tiempo las ventajas se harán evidentes por si mismas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27316063-114840756383164650?l=pesso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pesso.blogspot.com/feeds/114840756383164650/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27316063&amp;postID=114840756383164650&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114840756383164650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114840756383164650'/><link rel='alternate' type='text/html' href='http://pesso.blogspot.com/2006/05/control-de-versiones-para-documentos_23.html' title='Control de versiones para documentos III: Usando docbook'/><author><name>Pesso</name><uri>http://www.blogger.com/profile/12212800076215082111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27316063.post-114725893108597206</id><published>2006-05-10T12:59:00.000+02:00</published><updated>2006-05-17T20:20:50.496+02:00</updated><title type='text'>Control de versiones para documentos II: Usando un programa WYSIWYG</title><content type='html'>&lt;b&gt;Ingredientes necesarios:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Procesador de textos que soporte el formato Oasis (por ejemplo &lt;a href="http://download.openoffice.org/index.html"&gt;OpenOffice.org&lt;/a&gt;).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Un script para convertir un .odt en un sistema de directorios.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Un script para convertir un sistema de directorios en un .odt&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Si tienes más de un documento puede ser recomendable (no es necesario) un Makefile o archivo de procesamiento por lotes.&lt;/li&gt;&lt;/ul&gt;Como ya adelanté en &lt;a href="http://pesso.blogspot.com/2006/05/control-de-versiones-para-documentos-i.html"&gt;este artículo&lt;/a&gt;, se pueden combinar las ventajas de usar un procesador de textos WYSIWYG con las de un CVS.&lt;br /&gt;&lt;br /&gt;El truco consista en elegir el formato del documento juiciosamente. En mi caso me decante por el &lt;a href="http://es.wikipedia.org/wiki/OpenDocument"&gt;estandar Oasis&lt;/a&gt;, que consiste en un conjunto de ficheros en &lt;a href="http://www.w3.org/XML/"&gt;XML&lt;/a&gt;. Lamentablemente el estándar solo obliga a implementar soporte para la versión comprimida que es el fichero resultado de comprimir los diferentes archivos que componen el documento. De hecho la mayoría solo soporta este modo de almacenarlo y entre estos se encuentra el &lt;a href="http://www.openoffice.org"&gt;Openoffice.org&lt;/a&gt;, que es el procesador de textos que yo uso.&lt;br /&gt;&lt;br /&gt;Razonable. Resulta incomodo que para copiar un documento de una localización a otra tener que copiar varios archivos. Pero lo que es una ventaja para el uso normal es una desventaja para realizar un control de versiones correcto ya que el fichero comprimido deja de ser texto plano, con lo cual volvemos al principio.&lt;br /&gt;&lt;br /&gt;Bueno, según la &lt;a href="http://www.oasis-open.org/committees/download.php/12572/OpenDocument-v1.0-os.pdf"&gt;documentación&lt;/a&gt; un fichero .odt no es más que un archivo de tipo zip que contiene los ficheros que componen el documento. Por tanto, basta con descomprimir el .odt y subirlo al CVS para almacenarlo y comprimir los ficheros que se descargan. Cierto, pero hay que tener cuidado con los directorios para que no haya pegas. Si se usa &lt;a href="http://es.wikipedia.org/wiki/Ark"&gt;Ark&lt;/a&gt;, &lt;a href="http://www.winzip.com/"&gt;winzip&lt;/a&gt; o algún programa del estilo para descomprimir y volver a comprimir lo más probable es que se acabe con un fichero corrupto que no sirve para nada.&lt;br /&gt;&lt;br /&gt;La solución vino de la mano de Edward Holness quien en &lt;a href="http://www.oooforum.org/forum/viewtopic.phtml?t=27452"&gt;este artículo&lt;/a&gt; indicaba (de forma indirecta) como realizar la descompresión y posterior compresión del fichero de tal modo que no se corrompiera. A partir de ese artículo he creado dos scripts de shell para realizar esta tarea. Se podría realizar igualmente mediante archivos de proceso por lotes de DOS pero actualmente no tengo mucho interés en ello. Si a alguien le apetece pegarse con ello puede ponerlos en los comentarios.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recapitulando,&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Se &lt;a href="http://www.tldp.org/LDP/LDP-Author-Guide/html/cvs.html"&gt;crea, configura, etc&lt;/a&gt; un repositorio CVS.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Se crea un fichero opendocument.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El documento se añade al cvsignore.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Se aplica el script Oasis2Dir.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La estructura resultante se añade al control de versiones.&lt;/li&gt;&lt;/ol&gt;A partir de este punto, nuestro documento esta disponible para compartir con el resto del equipo. Los conflictos en el contenido se deben poder resolver facilmente, pero cuidado con los conflictos en las definiciones de estilos.&lt;br /&gt;&lt;br /&gt;Para obtener la versión más actual se realiza un update y luego aplicar Dir2Oasis.&lt;br /&gt;&lt;br /&gt;Para actualizar el repositorio se aplica el script Oasis2Dir seguido de un commit.&lt;br /&gt;&lt;br /&gt;Por cierto, que el método aquí descrito vale para cualquier fichero de la familia Opendocument. Eso incluye textos, gráficos, presentaciones, hojas de calculo y bases de datos. Solo que resolver conflictos a mano de estos tipos de fichero puede ser más duro.&lt;br /&gt;&lt;br /&gt;Los scripts los pongo a continuación:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Oasis2Dir&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#!/bin/bash &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Este script transforma un documento oasis representado por una estructura&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# de directorios en el mismo documento en forma de un único fichero &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# comprimido.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se puede repartir, modificar y hacer lo que se quiera con este script siempre&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# y cuando no cobreis por ello.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se obtienen el fichero origen y el directorio destino de los parámetros&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; [&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$#&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -ne 2&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;echo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Uso: &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$0&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt; &amp;lt;fichero oasis&amp;gt; &amp;lt;directorio&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;exit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;dir=$2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;fich=$1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# El fichero origen tiene que existir&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; [&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ! -f &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$fich&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;then&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;echo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"No existe el fichero &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$fich&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;exit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Si el directorio ya existe se elimina para evitar posibles problemas&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; [&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -d &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$dir&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 204);"&gt;rm&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -rf &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$dir&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se descomprime el fichero en el directorio especificado&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 204);"&gt;unzip&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -oq &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$fich&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -d &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$dir&lt;span style="font-family: Georgia,serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;b&gt;&lt;i&gt;Dir2Oasis&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#!/bin/bash &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Este script transforma un documento oasis representado por una estructura&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# de directorios en el mismo documento en forma de un único fichero &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# comprimido.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se puede repartir, modificar y hacer lo que se quiera con este script siempre&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# y cuando no cobreis por ello.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se guarda el directorio actual para poder volver a él.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;base=$PWD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Crear un fichero temporal es una chapuza que espero eliminar pronto.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;temp=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'/tmp/tmp.dir2odt.$$'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se obtienen el directorio origen y el fichero destino de los parámetros&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; [&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$#&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -ne 2&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;echo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Uso: &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$0&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt; &amp;lt;directorio&amp;gt; &amp;lt;fichero oasis&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;exit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;dir=$1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;fich=$2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# El directorio tiene que existir&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; [&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ! -d &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$dir&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;echo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"No se encuentra el directorio &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$dir&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;exit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Si el fichero ya existe se elimina para evitar posibles problemas&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; [&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -f &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$fich&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt; ]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;then&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 204);"&gt;rm&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$fich&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se crea el fichero en una ubicaciÃ³n temporal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;cd&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$dir&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 204);"&gt;zip&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; -rq9 &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$temp&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Se vuelve al directorio de partida&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(136, 0, 136);"&gt;cd&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$base&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# El fichero temporal se mueve a donde corresponde&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 204);"&gt;mv&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$temp&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;$fich&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27316063-114725893108597206?l=pesso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pesso.blogspot.com/feeds/114725893108597206/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27316063&amp;postID=114725893108597206&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114725893108597206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114725893108597206'/><link rel='alternate' type='text/html' href='http://pesso.blogspot.com/2006/05/control-de-versiones-para-documentos.html' title='Control de versiones para documentos II: Usando un programa WYSIWYG'/><author><name>Pesso</name><uri>http://www.blogger.com/profile/12212800076215082111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27316063.post-114648548637421917</id><published>2006-05-01T13:44:00.000+02:00</published><updated>2006-05-10T13:33:12.036+02:00</updated><title type='text'>Control de versiones para documentos I: Planteando el problema</title><content type='html'>Los sistemas de control de versiones son increíblemente cómodos. Producir código en equipo con ellos tiene muchas ventajas:  tienes siempre localizable la última versión, se pueden realizar cambios  en diferentes partes por diferentes personas y la integración resulta trivial, incluso, si los cambios son en la misma parte te ofrece ayuda para mezclar las dos versiones.&lt;br /&gt;&lt;br /&gt;        El problema viene cuando en vez de producir código fuente se quiere crear un documento. Antes de escribir una sola linea de código hay que producir una cantidad de documentos que depende de la metodología seguida. En el caso más extremo se trata de tan solo un documento, algo que recoja las necesidades del cliente o los objetivos marcados. En los documentos que se crean probablemente se quieran añadir tablas y gráficos aclaratorios. Así pues, o eres muy bueno con el &lt;a href="http://www.ascii-art.de/ascii/"&gt;ASCII Art&lt;/a&gt; o tienes que trabajar con algo más que texto plano.&lt;br /&gt;&lt;br /&gt;        Lo ideal sería poder seguir usando este tipo de programas con la documentación. Un inconveniente es que muchas de las ventajas de los programas de los CVS se pierden cuando en vez de con texto plano se trabaja con binarios. El problema, pues, queda reducido a un modo de hacer documentos que no limiten nuestra expresividad mediante texto plano. Hasta ahora he trabajado con dos técnicas que permiten esto. Una de ellas incluye manejar un procesador de textos &lt;A href="http://es.wikipedia.org/wiki/Wysiwyg"&gt;WYSIWYG&lt;/A&gt; y la otra incluye el uso de &lt;a href="http://docbook.sourceforge.net/"&gt;docbook&lt;/A&gt;. En próximas entregas explicare cada una de esas soluciones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27316063-114648548637421917?l=pesso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pesso.blogspot.com/feeds/114648548637421917/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27316063&amp;postID=114648548637421917&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114648548637421917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114648548637421917'/><link rel='alternate' type='text/html' href='http://pesso.blogspot.com/2006/05/control-de-versiones-para-documentos-i.html' title='Control de versiones para documentos I: Planteando el problema'/><author><name>Pesso</name><uri>http://www.blogger.com/profile/12212800076215082111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27316063.post-114640682586063040</id><published>2006-04-30T15:56:00.000+02:00</published><updated>2007-02-24T12:45:54.650+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bienvenida'/><title type='text'>Leit motiv</title><content type='html'>Las bitácoras, en general, caen en dos variantes típicas: Aquellas que dicen que no son nada sin su público y aquellas que el autor dice que escribe tan solo para si. Como en casi todo, encontrar espécimenes de una raza pura es muy raro y siempre hay textos para agradar a los lectores en los blogs "egocéntricos" y miradas al ombligo en los blogs "comunicativos".&lt;br /&gt;&lt;br /&gt;    Esta bitácora nace con una vocación principalmente egocéntrica, lo escribo para mi. Actualizare cuando me de la gana, si un artículo me parece que ha sobrevivido su utilidad no tendré reparos en eliminarlo, etc. Eso no quiere decir que los visitantes no sean bienvenidos. En absoluto, el estilo y el contenido de los artículos esta pensado para ayudar al mayor número de personas posibles. Pero no nos engañemos, si no es útil para mi no lo publicare.&lt;br /&gt;&lt;br /&gt;    La idea de esta bitácora la he plagiado de uno de los ejemplares más puros de bitácoras "egocéntricas" que he encontrado. Le pondría un enlace pero no me acuerdo de su nombre ni, obviamente, de su URL. Su autor era una persona que, como yo, hace apaños &lt;span style="font-style: italic;"&gt;ad hoc&lt;/span&gt; en su sistema y luego le cuesta mucho recordar que ha hecho. La solución que tomó esta persona fue crear un blog donde apuntar ese tipo de cosas. En eso va a consistir este blog, en anotar cosas que hago y saber donde encontrarlas. Para suavizar un poco el fusilamiento de su idea además voy a incluir esas cosas interesantes que voy encontrando por internet y luego me resulta difícil encontrar: Juegos, artículos, vídeos y lo que se me ocurra.&lt;br /&gt;&lt;br /&gt;    Como decía aquel: "Queda inaugurado este pantano".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27316063-114640682586063040?l=pesso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pesso.blogspot.com/feeds/114640682586063040/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27316063&amp;postID=114640682586063040&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114640682586063040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27316063/posts/default/114640682586063040'/><link rel='alternate' type='text/html' href='http://pesso.blogspot.com/2006/04/leit-motiv.html' title='Leit motiv'/><author><name>Pesso</name><uri>http://www.blogger.com/profile/12212800076215082111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
