diff options
Diffstat (limited to 'remote-cstms.c')
-rw-r--r-- | remote-cstms.c | 73 |
1 files changed, 55 insertions, 18 deletions
diff --git a/remote-cstms.c b/remote-cstms.c index 6aa2c96..e1d63a3 100644 --- a/remote-cstms.c +++ b/remote-cstms.c @@ -21,15 +21,15 @@ along with GNU Make; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "make.h" +#include "job.h" +#include "filedef.h" #include "commands.h" #include "job.h" #include <sys/time.h> #include <netdb.h> -#define __STRICT_BSD__ /* Don't make conflicting declarations. */ #include "customs.h" - char *remote_description = "Customs"; /* File name of the Customs `export' client command. @@ -42,25 +42,47 @@ static ExportPermit permit; /* Normalized path name of the current directory. */ static char *normalized_cwd; +/* Call once at startup even if no commands are run. */ + +void +remote_setup () +{ +} + +/* Called before exit. */ + +void +remote_cleanup () +{ +} + /* Return nonzero if the next job should be done remotely. */ int -start_remote_job_p () +start_remote_job_p (first_p) + int first_p; { static int inited = 0; int status; - - /* Allow the user to turn off job exportation - (useful while he is debugging Customs, for example). */ - if (getenv ("GNU_MAKE_NO_CUSTOMS") != 0) - return 0; + int njobs; if (!inited) { + /* Allow the user to turn off job exportation (useful while he is + debugging Customs, for example). */ + if (getenv ("GNU_MAKE_NO_CUSTOMS") != 0) + { + inited = -1; + return 0; + } + /* For secure Customs, make is installed setuid root and Customs requires a privileged source port be used. */ make_access (); + if (debug_flag) + Rpc_Debug(1); + /* Ping the daemon once to see if it is there. */ inited = Customs_Ping () == RPC_SUCCESS ? 1 : -1; @@ -87,6 +109,15 @@ start_remote_job_p () if (inited < 0) return 0; + njobs = job_slots_used; + if (!first_p) + njobs -= 1; /* correction for being called from reap_children() */ + + /* the first job should run locally, or, if the -l flag is given, we use + that as clue as to how many local jobs should be scheduled locally */ + if (max_load_average < 0 && njobs == 0 || njobs < max_load_average) + return 0; + status = Customs_Host (EXPORT_SAME, &permit); if (status != RPC_SUCCESS) { @@ -113,8 +144,8 @@ start_remote_job (argv, envp, stdin_fd, is_remote, id_ptr, used_stdin) int *id_ptr; int *used_stdin; { - extern int vfork (), execve (); char waybill[MAX_DATA_SIZE], msg[128]; + struct hostent *host; struct timeval timeout; struct sockaddr_in sin; int len; @@ -150,8 +181,8 @@ start_remote_job (argv, envp, stdin_fd, is_remote, id_ptr, used_stdin) /* Modify the waybill as if the remote child had done `child_access ()'. */ { WayBill *wb = (WayBill *) waybill; - wb->euid = wb->ruid; - wb->rgid = wb->rgid; + wb->ruid = wb->euid; + wb->rgid = wb->egid; } /* Send the request to the server, timing out in 20 seconds. */ @@ -164,26 +195,31 @@ start_remote_job (argv, envp, stdin_fd, is_remote, id_ptr, used_stdin) len, (Rpc_Opaque) waybill, sizeof(msg), (Rpc_Opaque) msg, 1, &timeout); + + host = gethostbyaddr((char *)&permit.addr, sizeof(permit.addr), AF_INET); + if (status != RPC_SUCCESS) { (void) close (retsock); (void) close (sock); - error ("exporting: %s", Rpc_ErrorMessage (status)); + error ("exporting to %s: %s", + host ? host->h_name : inet_ntoa (permit.addr), + Rpc_ErrorMessage (status)); return 1; } else if (msg[0] != 'O' || msg[1] != 'k' || msg[2] != '\0') { (void) close (retsock); (void) close (sock); - error ("CUSTOMS_IMPORT: %s", msg); + error ("exporting to %s: %s", + host ? host->h_name : inet_ntoa (permit.addr), + msg); return 1; } - else if (debug_flag) + else { - struct hostent *host = gethostbyaddr (&permit.addr, sizeof (permit.addr), - AF_INET); - printf ("Job exported to %s ID %u\n", - host == 0 ? inet_ntoa (permit.addr) : host->h_name, + error ("*** exported to %s (id %u)", + host ? host->h_name : inet_ntoa (permit.addr), permit.id); } @@ -225,6 +261,7 @@ start_remote_job (argv, envp, stdin_fd, is_remote, id_ptr, used_stdin) (void) close (sock); *is_remote = 0; *id_ptr = pid; + *used_stdin = 1; return 0; } |