- Récit du processus de portage vers Linux de la version Unix de Lotus, vieille de 30 ans
Contexte
- Passionné par Lotus, l’auteur avait fait de la rétro-ingénierie de l’ancienne version DOS pour créer un pilote d’affichage pour DosEmu et l’exécuter
- Mais les anciens add-ins de Lotus ne fonctionnaient pas
→ Ils étaient développés dans un langage spécial appelé LPL, et il n’existait ni compilateur ni SDK
→ À l’époque, c’était un produit payant à 395 $, et il n’a trouvé personne qui le possédait
- Puis, via un SYSOP qui exploitait un BBS dans les années 1990, il a récupéré depuis une sauvegarde sur bande une copie warez du SDK
→ ADK (Add-in Development Kit) for Lotus 1-2-3
- Sur ce BBS, il y avait aussi une version warez de Lotus 1-2-3 for Unix
→ Un produit tombé dans l’oubli car il s’était peu vendu face à SCO Professional, un concurrent bureautique Unix bien connu
Lotus 1-2-3 for Unix
- Le tout était constitué d’images disque compressées au format TD0, utilisé dans les années 1980
- Conversion en image disque brute avec
samdisk
- Dans le contenu des disques, découverte de fichiers objet contenant des symboles de 1-2-3
→ Au début des années 1990, dlopen() n’était pas encore très utilisé, donc ce genre de chose était nécessaire
Hacking
- Grâce à ces fichiers objet, de nombreuses questions sur la structure interne de Lotus 1-2-3 ont trouvé une réponse
- Le pilote en cours de développement a alors pu en faire davantage
GNU objcopy
- Quand ces fichiers objet ont été compilés, la première version de Linux n’était même pas encore sortie
- Mais
objcopy permet de convertir des fichiers objet COFF en ELF
Problème de portage
Appels système
- Premier problème : Linux et UNIX n’ont pas la même interface d’appels système
- UNIX utilise l’interface
lcall7, il a donc décidé de repérer open() pour le faire appeler via glibc
→ Et si on remplaçait ce symbole par un symbole indéfini, le linker ne ferait-il pas le reste tout seul ?
→ Mais objcopy ne fonctionne pas ainsi, donc il a fini par écrire un outil appelé coffsyrup pour les supprimer de force
- Toutes les fonctions incompatibles ont été modifiées avec
objcopy + coffsyrup
→ stat(), times(), uname(), fcntl(), ioctl()
Licence
- Bien sûr, ce logiciel ne fonctionne pas sans licence
- L’auteur possède bien légalement la boîte de Lotus 1-2-3 et, comme il s’agit aussi d’un abandonware vieux de 32 ans,
il pense que même son créateur, Mitch Kapor, ne lui reprocherait probablement pas de contourner cette vérification de licence
→ (Mitch Kapor est connu pour avoir créé Lotus et est aussi cofondateur de l’EFF.)
- Dans la fonction
lic_init(), il suffit que le fichier LICENSE.000 contienne une date ainsi qu’un nom d’utilisateur et de système pour que cela fonctionne, donc il a passé l’étape ainsi
Résultat
- Au final, Lotus 1-2-3 a été porté sur un nouvel OS, Linux
- Il reste encore quelques parties bancales, mais c’est utilisable à 100 %
4 commentaires
Mon Dieu… mais qu’est-ce que c’est que ça… 😱
On dit que parmi les passionnés, les passionnés occidentaux sont les plus impressionnants… et franchement, c’est vraiment vrai.
Waouh… une passion vraiment impressionnante. Je n’ai pas tant utilisé Lotus que ça, j’utilisais surtout Multiplan.
https://en.wikipedia.org/wiki/Multiplan
Multiplan a aussi eu une version coréenne, et à l’époque c’était le seul produit à prendre correctement en charge le coréen.
Il a été abandonné en 1994, mais en Corée beaucoup d’entreprises l’utilisaient encore, donc je crois l’avoir vu utilisé jusqu’aux environs de 1997.
Arrêt de Multiplan — la fin de l’ère DOS
https://www.hellomarket.com/item/162929337
J’ai trouvé une annonce qui vend un package Multiplan coréen encore sous blister… Waouh…