Underc0de

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: DtxdF en Noviembre 08, 2020, 04:16:03 AM

Título: Configuración de red, paquetes, programación y mucho más en FreeDOS
Publicado por: DtxdF en Noviembre 08, 2020, 04:16:03 AM
(https://imgur.com/5XS67Me.png)
Calculadora con notación polaca inversa

En la anterior parte (https://underc0de.org/foro/off-topic-122/instalacion-de-freedos-en-qemu-alternativas/) pudimos aprender la instalación de FreeDOS en QEMU, pero hacía falta varias cosas, que más allá de su uso, tienen que ver con el mantenimiento, instalación de paquetes y una de las cosas más esenciales de todo, las redes.

Paquetes necesarios:

(http://wiki.freedos.org/wiki/images/0/0e/04-fdimples.png)
Fuente: Networking FreeDOS - Quick Networking HowTo (http://wiki.freedos.org/wiki/index.php/Networking_FreeDOS_-_Quick_Networking_HowTo)

Esto es simple. Abrimos QEMU con las opciones pre-configuradas en la parte anterior (https://underc0de.org/foro/off-topic-122/instalacion-de-freedos-en-qemu-alternativas/) y ejecutaremos el comando fdimples, el cual nos muestra una interfaz TUI (https://es.wikipedia.org/wiki/Interfaz_de_texto). Los controles pueden ser resumidos como lo siguiente:

*.- 🡡, 🡢, 🡣, 🡠: Moverse entre los diferentes elementos. Ya sea que estés en la lista de grupos de paquetes o de los paquetes mismos, las flechas hacia arriba y hacia abajo te ayudarán a desplazarte; si necesitas moverte entre grupo de paquetes o los paquetes que éstos contengan, las flechas hacia la derecha o la izquierda, son los de utilidad. En caso de que se necesite ver la descripción de un paquete, cuando se le esté apuntando (ver imagen, paquete FDNET) presione la flecha derecha y las flechas hacia arriba y hacia abajo expandirán o disminuirán la descripción y los programas que el paquete contenga.
*.- SPACE o ENTER: Misma funcionalidad. Seleccionar o confirmar una opción. En caso de querer seleccionar todo el grupo completo (ver imagen, grupo de paquete Networking), se necesita apuntar hacia él, y luego presionar ENTER o SPACE para seleccionar/deseleccionar todos los paquetes a instalar/desinstalar, o si simplemente se desea instalar un paquete, es necesario moverse hasta él y realizar el mismo procedimiento.

Así de sencillas son las instrucciones, ahora que se sabe la forma de instalar paquetes desde el CD-ROM (la misma imagen ISO, en nuestro caso) pasemos a instalar los paquetes necesarios para obtener Internet. En nuestro caso deben ser los siguientes:

*.- FDNET: paquete de soporte de red básico para FreeDOS para varias configuraciones de hardware y plataformas de máquinas virtuales.
*.- MTCP: Colección de herramientas TCP/IP para DOS de 16 bits, tales como: DHCP, IRC, FTP, Telnet, Netcat, HTGet, Ping, SNTP.
*.- Opcionalmente, aunque encarecidamente, se recomienda instalar también: curl, wget, ping

Como último paso para esta sección, reiniciamos.

Nota: Es necesario seguir con la siguiente sección para completar este paso.


Configuración de QEMU:

No solo es necesario instalar los paquetes para darle compatibilidad a FreeDOS para las máquinas virtuales y el hardware en sí, además es necesario configurar QEMU (o la máquina virtual que se esté usando) para que las configuraciones automatizadas y demás, pueden hacer efecto.

En nuestro caso ejecutaremos el siguiente comando:


Código (bash) [Seleccionar]
qemu-system-i386 -net nic,model=pcnet -net user -k es -smp $(($(nproc)+1)) -m 32M -drive file=freedos.img,media=disk,format=raw -drive file=FD12CD.iso,media=cdrom -boot order=d

(https://imgur.com/scQwb25.png)
Resultado :D

El gestor de paquetes:

Sí, FreeDOS tiene un gestor de paquetes :D, y muy bueno, el cual nos permite instalar paquetes que no estén incluidos en el CD-ROM (la imagen ISO). En nuestro caso instalaremos los paquetes necesarios para programar en el mismo.

Antes de usar el gestor de paquetes necesario, para no perder tanto tiempo verificamos que no tengamos los paquetes deseados en la imagen ISO, los cuales son: DJGPP, i16butil, i16gcc, i16newli, i16budoc, i16gcdoc

En mi caso el único que tengo en la imagen ISO es DJGPP, por lo que paso a instalarlo usando fdimples:


(https://imgur.com/kqJhio0.png)

Mientras que los demás, usaré fdnpkg para buscarlos y si son encontrados, instalarlos:

(https://imgur.com/s2K7A3s.png)
fdnpkg search i16

Ahora, instalamos:

Código (dos) [Seleccionar]
fdnpkg install i16butil
fdnpkg install i16gcc
fdnpkg install i16newli
fdnpkg install i16budoc
fdnpkg install i16gcdoc


Una vez cuncluímos el proceso de instalación de los paquetes necesarios, necesitamos definir la variable que se mostrará en unos instantes en el archivo AUTOEXEC.BAT (https://es.wikipedia.org/wiki/Autoexec.bat) que se encuentra en C:

Código (dos) [Seleccionar]
set DJGPP=c:\devel\djgpp\djgpp.env

Pese a que tenemos y podríamos usar perfectamente el comando EDIT para editar archivos y hasta programar con él, es recomendable usar otro editor de texto que se adhiera a sus necesidades y preferencias. En mi caso, usaré simplemente pico, aunque fed tampoco está mal, desde luego, es posible ejecutar el siguiente comando y se mostrará todos los editores, o también se puede ingresar a los repositorios (https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/edit/).

Código (dos) [Seleccionar]
fdnpkg search edit

(https://imgur.com/hxN07pm.png)
Editores válidos por el momento

Programación en C:

Para concluir este pequeño artículo, vamos a escribir dos programas en C; uno que imprima 'Hello World!' y otro que será una calculadora con notación polaca inversa (https://es.wikipedia.org/wiki/Notaci%C3%B3n_polaca_inversa).

hello.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
printf("Hello World!\n");
return EXIT_SUCCESS;

}


Código (dos) [Seleccionar]
i16gcc -o hello.exe -O2 hello.c
hello.exe


(https://imgur.com/ZdKnryg.png)

Ya compilamos nuestro hello world, pero ahora vamos a compilar un programa con más funcionalidades.

polish.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <math.h>
#include <stdbool.h>
#include "calculator.h"

#define MAX_NUMBERS 30

int main(int argc, char **argv) {
   long double *array = (long double *)malloc(sizeof(long double)*MAX_NUMBERS);
   long double *result = array;
   long double aux;
   char *endstr = NULL;
   int operator;
   int max_numbers, count;
   bool check = false;

   if (!array) {
  if (errno != 0)
perror("malloc");
  else
fprintf(stderr, "Possibly no memory\n");

  return EXIT_FAILURE;

   }

   max_numbers = MAX_NUMBERS;
   count = 0;
   while (--argc) {
  if (count++ >= max_numbers) {
max_numbers *= 2;
array = (long double *)realloc(array, sizeof(long double)*max_numbers);

if (!array) {
if (errno != 0)
   perror("realloc");
else
   fprintf(stderr, "Possibly no memory\n");

free(array);
return EXIT_FAILURE;

}

  }

  if (isdigit(**++argv)) {
errno = 0;
aux = strtold(*argv, &endstr);

if (errno != 0) {
perror("stdtold");
free(array);
return EXIT_FAILURE;

}

*result++ = aux;

continue;

  }

  if (!check)
check = true;

  result -= 2;
 
  if (isnan(*result) || isnan(*(result+1))) {
fprintf(stderr, "Invalid syntax!\n");
return EXIT_FAILURE;

  }

  operator = *argv[0];
  errno = 0;
  *result = calculate(*result, *(result+1), operator);
  result++;

  if (errno != 0) {
free(array);
return EXIT_FAILURE;

  }

   }

   if (check)
  printf("%Lg\n", *--result);
   else
  fprintf(stderr, "Invalid syntax!\n");

   free(array);

   return EXIT_SUCCESS;

}


calculator.c
#include <stdio.h>
#include <errno.h>

long double calculate(long double n1, long double n2, int operator) {
long double result;

result = 0.0f;
switch (operator) {
case '+':
result = n1 + n2;
break;

case '-':
result = n1 - n2;
break;

case '*':
result = n1 * n2;
break;

case '/':
if (n2 == 0.0f) {
errno = EINVAL;
fputs("Zero divisor!\n", stderr);
} else
result = n1 / n2;
break;

default:
errno = EINVAL;
fprintf(stderr, "Invalid operator: '%c'\n", operator);

}

return result;

}


calculator.h
long double calculate(long double n1, long double n2, int operator);

El proceso de compilación es sumamente sencillo:

Código (dos) [Seleccionar]
i16gcc -o polish.exe -O2 polish.c calculator.c
polish.exe 2 2 +
polish.exe 4 2 *
polish.exe 2.5 2.5 +


(https://imgur.com/jMTz6M8.png)

Reto:

Aquí no acaba. Vamos a realizar una serie de retos para ver si los pueden completar. Básicamente consta de agregar nuevas funcionalidades a la calculadora:


¿Cuántos puedes resolver? 3:)

Notas futuras:

Desde que empecé a hacer estos pequeños artículos no he querido usar QEMU; traté sin éxito de usar FreeDOS (no el pre-configurado) con DosEMU, que me pareció mucho mejor en cuanto a rendimiento y usabilidad, pero luego de error tras error, mejor lo dejaré para otra ocasión.

Material de referencia y altamente recomendada:

*.- www.freebsd.org/cgi/man.cgi?query=qemu&sektion=1&apropos=0
*.- www.freedos.org/books/cprogramming
*.- wiki.freedos.org/wiki/index.php/Networking_FreeDOS_-_Quick_Networking_HowTo
*.- wiki.qemu.org/index.php/Documentation/Networking
*.- wiki.archlinux.org/index.php/QEMU_(Espa%C3%B1ol)
*.- wiki.archlinux.org/index.php/Network_bridge

~ DtxdF
Título: Re:Configuración de red, paquetes, programación y mucho más en FreeDOS
Publicado por: Nomad en Noviembre 12, 2020, 01:00:39 PM
Definitivamente esta serie de post de FreeDOS me han llamado la atención, muy bien explicados, fáciles de implementar pero sobre todo útiles para los que tenemos que montar una maquina virtual cada vez que alguien en la empresa necesita cotejar la contabilidad o la nomina de hace 15 años, muchas gracias DtxdF!!!
Título: Re:Configuración de red, paquetes, programación y mucho más en FreeDOS
Publicado por: DtxdF en Noviembre 12, 2020, 11:10:49 PM
@Nomad (https://underc0de.org/foro/index.php?action=profile;u=58496)

Gracias amigo =D, espero te ayude.

PD: Acabo de leer de nuevo el post y me di cuenta que coloqué el mismo código de polish.c y calculator.c :OOO, aunque ya lo corregí (pero muy tarde :/).

~ DtxdF