- Un repaso del proceso de portar a Linux la versión de Unix de Lotus, de hace 30 años
Antecedentes
- Como era fan de Lotus, hizo ingeniería inversa de la versión existente para DOS, creó un controlador de pantalla para DosEmu y logró ejecutarlo
- Pero los antiguos Add-ins de Lotus no eran posibles
Estaban desarrollados en un lenguaje especial llamado LPL y no había compilador/SDK
→ En esa época era un producto de pago que costaba nada menos que $395, y no pudo encontrar a nadie que lo tuviera
- Luego, a través de un SYSOP que administraba un BBS en los 90, consiguió de una copia de seguridad en cinta una versión warez del SDK
→ ADK (Add-in Development Kit) para Lotus 1-2-3
- En ese BBS también había una versión warez de Lotus 1-2-3 para Unix
→ Un producto olvidado porque vendió poco debido a SCO Professional, un conocido producto competidor de oficina para Unix
Lotus 1-2-3 para Unix
- Estaba compuesto en el formato de imagen de disco comprimida TD0, usado en los años 80
- Lo convirtió a una imagen de disco raw con samdisk
- Entre los contenidos del disco descubrió archivos object que incluían símbolos de 1-2-3
→ A principios de los 90 dlopen() no se usaba mucho, así que dice que esto era necesario
Hacking
- Gracias a este archivo object, se resolvieron muchas dudas que tenía sobre la estructura interna de Lotus 1-2-3
- El controlador que estaba creando pudo hacer más cosas
GNU objcopy
- Cuando se compiló este archivo object, todavía no se había lanzado ni la primera versión de Linux
- Pero con objcopy es posible convertir archivos object COFF a ELF
Problema de portabilidad
Llamadas al sistema
- El primer problema era que Linux y UNIX no tienen la misma interfaz de llamadas al sistema
- Como UNIX usa la interfaz
lcall7, decidió localizar open() y hacer que se invocara a través de glibc
→ ¿Si se cambiaba este símbolo a undefined, el enlazador no se encargaría del resto?
→ Pero objcopy no funcionaba así, así que al final escribió una herramienta llamada coffsyrup para borrarlo a la fuerza
- Cambió de esta forma todas las funciones incompatibles con objcopy + coffsyrup
→ stat(), times(), uname(), fcntl(), ioctl()
Licenciamiento
- Por supuesto, este software no funciona sin licencia
- Como él es propietario legítimo y también posee la caja de Lotus 1-2-3, y además es abandonware de hace 32 años,
cree que probablemente al desarrollador Mitch Kapor no le molestaría que se saltara esta verificación de licencia
→ (Mitch Kapor es famoso por haber desarrollado Lotus y también es cofundador de la EFF.)
- En la función
lic_init(), si el archivo LICENSE.000 contiene una fecha y el nombre del usuario/sistema, funciona, así que lo ajustó así y listo
Resultado
- Como resultado, Lotus 1-2-3 fue portado a un nuevo SO (Linux)
- Aún hay partes enredadas, pero es 100% usable
4 comentarios
Dios mío... ¿qué es esto...? 😱
Dicen que lo mejor entre los fans son los fans extranjeros... y de verdad, esa frase es totalmente cierta...
Vaya... de verdad, qué pasión tan increíble. Yo no usé tanto Lotus; más bien usaba principalmente Multiplan.
https://en.wikipedia.org/wiki/Multiplan
Multiplan incluso tuvo una versión en coreano, así que en esa época este era el único producto que realmente daba un soporte adecuado para el coreano.
Aunque fue descontinuado en 1994, en Corea muchas empresas seguían usándolo, así que creo que se siguió usando hasta alrededor de 1997.
Descontinuación de Multiplan: el fin de la era DOS
https://www.hellomarket.com/item/162929337
Veo que encontraste una publicación donde venden un paquete sin abrir de Multiplan en coreano... uf...