campo-sirio/include/execp.cpp
guy 1855e56994 Patch level :
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Gestione postino e permessi di esecuzione


git-svn-id: svn://10.65.10.50/trunk@7553 c028cbd2-c16b-5b4b-a496-9718f37d4682
1998-12-10 16:25:48 +00:00

114 lines
2.9 KiB
C++
Executable File

#include <dongle.h>
#include <execp.h>
#include <os_dep.h>
#include <prefix.h>
#include <recarray.h>
// @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 <p asyn> 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)
{
}