
sub inic_reg {
      open (REG, ">accesos.log");
      print REG "0";
      close REG;
}

sub registrar($) {
      $semaforo = shift;
      $semaforo->down;      
      # Si el semaforo se baja luego de abrir el archivo
      # no funciona!
      open (REG, "+<accesos.log");
      $accesos = <REG>;
      $accesos++;
      # Para probar la ejecución concurrente
      # podemos alterar el tiempo de ejecución.
      # sleep(rand(2));
      # print "$accesos\n";
      seek(REG, 0, 0);
      print REG $accesos;
      close REG;
      $semaforo->up;
}
                                  
sub ejecutar($$) {
      ($comando, $conexion) = @_;
      $resultado = '';
      if ($comando eq 'fecha')  { 
              $resultado = localtime() . "\n";
      } elsif ($comando eq 'usuarios')  { 
              $resultado = `who`;   
      }
      if ($resultado) {
              print $conexion "OK\n";
              print $conexion $resultado;
              print $conexion "FIN\n";
      } elsif ($comando eq 'salir') {
              print $conexion "Adios.\n";
      } else {
              print $conexion "ERR\n";
      }
}

sub atender($$) {
      ($conexion, $semaforo) = @_;
      $ip = $conexion->peerhost;
      print "[Conexión establecida desde $ip]\n";
      print $conexion "Bienvenido.\n";
      do {
              if ($comando = <$conexion>) {
                $comando =~ s/\r\n|\n//g;
                ejecutar($comando, $conexion);
              } else {
                $comando = 'salir';
              }
      } until ($comando eq 'salir');
      $conexion->shutdown(2);
      registrar($semaforo);
      print "[Conexión finalizada desde $ip]\n";
}

1;

