#include #include #include #include #include // @doc EXTERNAL // @mfunc Esegue il processo // // @rdesc Ritorna il codice di uscita del processo (-1 in caso di errore). word TExternal_app::run( bool async, // @parm Per eseguire il processo in parallelo byte utente, // @parm Permette di inserire il nome dell'utente nella riga di comando bool iconize, // @parm Iconizza il programma chiamante bool show) // @parm Mostra o nascondi il programma chiamato // @comm Se

e' FALSE aspetta che termini il processo in esecuzione prima di iniziare il nuovo { TFilename path(_path); TFilename comm_name(_path); const int p = comm_name.find(' '); if (p >= 0) comm_name.cut(p); TString name(comm_name.name()); if (utente == TRUE) // utente puo' essere 0 = No, 1 = Si, 3 = Forzatura { bool our_app = name.len() > 2; if (our_app && atoi(name) < 70) { our_app = isalpha(name[0]) && isalpha(name[1]) && isdigit(name[2]); } if (!our_app) utente = FALSE; } if (utente) path << " /u" << user(); _exitcode = 0; // save cwd xvt_fsys_save_dir(); const TFilename dir(comm_name.path()); if (dir.not_empty()) { DIRECTORY d; if (xvt_fsys_convert_str_to_dir((char *) (const char *) dir, &d)) xvt_fsys_set_dir(&d); } if (!async) safely_close_closeable_isamfiles(); if (dongle().local()) dongle().logout(); iconize &= !async && show; _exitcode = os_execute(path, !async, iconize, show); // restore cwd xvt_fsys_restore_dir(); // Ignora volutamente il return code da HL_LOGIN(). Se va bene riprende il posto // altrimenti fa lo stesso. Infatti puo' capitare con una chiave di rete, che // nel lasso di tempo trascorso dalla HL_LOGOUT() dell'applicazione chiamata, // a questa HL_LOGIN() [approssimativamente qualche decimo di secondo], qualche altro // programma si inserisca, occupando magari anche l'ultimo posto disponibile. // Quindi se si verificasse tale sfigatissima condizione, sicuramente // non ci saranno piu' posti liberi nell'HL_server: il programma comunque non // puo' interrompersi a meta'; ecco perche il valore di ritorno di HL_LOGIN viene // ignorato. if (dongle().local()) dongle().login(); return _exitcode; } bool TExternal_app::can_run() const { TRecord_cache users(LF_USER); TToken_string perm(4096, '\n'), row(80); for (TString16 u = user(); u.not_empty() && !users.already_loaded(u); u = users.get(u, "GROUPNAME")) { perm = users.get(u, "PERMISSION"); if (!perm.blank()) { FOR_EACH_TOKEN(perm, tok) { row = tok; if (_path == row.get(0)) // Il nome corrisponde { if (*row.get(1) == 'N') return FALSE; } } } } return TRUE; } TExternal_app::TExternal_app(const char* p) : _path(p), _exitcode(0) { }