- Resumo do processo de portar a versão Unix do Lotus, com 30 anos de idade, para Linux
Contexto
- Como fã do Lotus, ele fez engenharia reversa da versão antiga para DOS e criou um driver de vídeo para o DosEmu para executá-la
- Porém, os antigos add-ins do Lotus não eram possíveis
Foram desenvolvidos em uma linguagem especial chamada LPL, e não havia compilador/SDK
→ Na época, era um produto pago que custava US$ 395, e ele não conseguiu encontrar ninguém que o tivesse
- Então, por meio de um SYSOP que administrava uma BBS nos anos 90, conseguiu uma cópia warez do SDK a partir de um backup em fita
→ ADK (Add-in Development Kit) para Lotus 1-2-3
- Nessa BBS também havia uma versão warez do Lotus 1-2-3 for Unix
→ Um produto esquecido porque vendeu pouco por causa do SCO Professional, um famoso concorrente de escritório para Unix
Lotus 1-2-3 for Unix
- Era composto no formato TD0, um formato de imagem de disco comprimida usado nos anos 80
- Convertido para imagem de disco raw com
samdisk
- Entre o conteúdo dos discos, foi encontrado um arquivo object contendo símbolos do 1-2-3
→ No começo dos anos 90, dlopen() ainda não era muito usado, então isso era necessário
Hacking
- Graças a esse arquivo object, muitas dúvidas que ele tinha sobre a estrutura interna do Lotus 1-2-3 foram resolvidas
- O driver que estava criando passou a poder fazer muito mais coisas
GNU objcopy
- Quando esse arquivo object foi compilado, a primeira versão do Linux ainda nem tinha sido lançada
- Mesmo assim, é possível converter arquivos object COFF para ELF com
objcopy
Problema de portabilidade
Chamadas de sistema
- O primeiro problema era que Linux e UNIX não têm a mesma interface de chamadas de sistema
- Como o UNIX usa a interface
lcall7, a ideia foi localizar open() e fazer a chamada via glibc
→ Se esse símbolo fosse alterado para undefined, será que o linker resolveria isso sozinho?
→ Mas o objcopy não funciona assim, então no fim ele escreveu uma ferramenta chamada coffsyrup para removê-lo à força
- Várias funções incompatíveis foram alteradas com
objcopy + coffsyrup
→ stat(), times(), uname(), fcntl(), ioctl()
Licenciamento
- Claro, esse software não funciona sem licença
- Como ele é o proprietário legítimo de uma caixa do Lotus 1-2-3 e também se trata de abandonware com 32 anos,
acha que talvez nem o próprio Mitch Kapor, o desenvolvedor, se importasse com ignorar essa verificação de licença
→ (Mitch Kapor é famoso por ter desenvolvido o Lotus e também é cofundador da EFF.)
- Na função
lic_init(), ele funciona se o arquivo LICENSE.000 contiver a data e o nome do usuário/sistema, então ele ajustou isso e passou na verificação!
Resultado
- Como resultado, o Lotus 1-2-3 foi portado para um novo sistema operacional (Linux)
- Ainda há algumas partes complicadas, mas ele já está 100% utilizável
4 comentários
Nossa... mas que diabos é isso... pqp
Dizem que, entre os geeks, os melhores são os geeks gringos... e realmente isso parece ser verdade...
Uau... realmente uma paixão impressionante. Eu não usei tanto o Lotus; usava principalmente o Multiplan.
https://en.wikipedia.org/wiki/Multiplan
O Multiplan também teve uma versão em coreano, então, naquela época, este era o único produto com suporte adequado ao coreano.
Embora tenha sido descontinuado em 94, na Coreia ainda havia muitas empresas usando-o, então acho que continuou em uso até por volta de 97.
Descontinuação do Multiplan - o fim da era DOS
https://www.hellomarket.com/item/162929337
Achei um post vendendo um pacote lacrado do Multiplan em coreano.. uau..