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

sub registrar {
      open (REG, "+<accesos.log");
      flock(REG, LOCK_EX);
      $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;
      flock(REG, LOCK_UN);
      close REG;
}
                                  
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 = shift;
      $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;
      print "[Conexión finalizada desde $ip]\n";
}

1;
