#include #include #ifndef UNIX #include #endif #include #include #include #include // static unsigned gg; // Retourne 1 si OS2EXEC run int is_os2exec_run() { unsigned ret=1; int fh = open ("/pipe/os2exec.em", O_RDWR | O_BINARY, S_IREAD | S_IWRITE); if (fh < 0 ) ret= 0; else close(fh); return ret; } // Retourne 1 si OS/2 int is_os2() { #ifdef UNIX return 0; #else unsigned ret; _AX = 0x4010; geninterrupt(0x2f); ret = _AX; return ret != 0x4010; #endif } static int near send (char cmd, const char *src, int fh) { char buf[4096+2]; int len = strlen(src); // buf[0] = ((len + 1) & 0xff); buf[0] = ((len + 1) % 256); buf[1] = ((len + 1) / 256); buf[2] = cmd; memmove (buf+3, src, len); return (write (fh, buf, len+3) == len+3) ? 0 : -1; } /* Patente pour executer des programmes OS/2 a partir d'une application windows. On utilise les services d'un serveur, programme OS/2, qui attend les requetes des clients par un 'named pipe'. C'est le serveur qui execute la commande, et retourne le resultat a travers le meme pipe. Le serveur est apelle OS2EXECD par Eberhard Mattes. Voir le freeware 'OS2EXEC'. */ int os2_system ( const char *std_in, const char *std_out, // Fichier qui contiendra stdout ou NULL const char *std_err, // Fichier qui contiendra stderr ou NULL // std_err peut ˆtre le mˆme que std_out const char *buf) // Commande … ex‚cuter { char cwd[128], header[2]; int ret = 0; assert(std_in == NULL && std_out == std_err); int fh = open ("/pipe/os2exec.em", O_RDWR | O_BINARY, S_IREAD | S_IWRITE); int fo = creat (std_out, S_IREAD | S_IWRITE); if (fh < 0 || fo < 0) { if (fh >= 0) close(fh); if (fo >= 0) close(fo); return -1; } send ('O', "", fh); getcwd (cwd, sizeof (cwd)); send ('W', cwd, fh); send ('X', buf, fh); for (;;) { char buf[4096+2]; if (read (fh, header, 2) != 2) return -1; int i = header[0] + 256 * header[1]; if (read (fh, buf, i) != i) return -1; if (buf[0] == 'O') write (fo, buf+1, i-1); else if (buf[0] != 'R') return -1; else { buf[i] = 0; ret = atoi (buf+1); send ('A', " ", fh); break; } } close (fh); close(fo); return ret; }