/* BKG_CLOSE -- Close a bkg job. Called after determining that the job has * terminated. */ static void bkg_close ( int job, /* job ordinal */ int pmsg /* print termination message */ ) { register struct _bkgjob *bk = &jobtable[job-1]; bk->b_clock = c_clktime (bk->b_clock); bk->b_exitcode = c_prcldpr (bk->b_jobno); bk->b_flags &= ~(J_RUNNING|J_SERVICE); if (bk->b_verbose && (pmsg > 1 || (pmsg == 1 && !notify()))) { if (bk->b_exitcode != OK) eprintf ("[%d] exit %d\n", job, bk->b_exitcode); else eprintf ("[%d] done\n", job); } /* Make a logfile entry, saying the background job ended. */ if (keeplog() && log_background()) { char buf[SZ_LINE]; sprintf (buf, "Stop [%d]", job); putlog (0, buf); } }
/* PUTLOG -- Format and write a message to the logfile. This is called by * the putlog builtin (clputlog() in builtin.c) and in some places in the * CL (e.g., exec.c). */ void putlog ( struct task *tp, /* pointer to task or NULL */ char *usermsg ) { register char *ip, *op, *otop; register int n; char msg[SZ_LOGBUF], job[5]; char *pkg, *tname, *today(); extern int bkgno; /* job number if bkg job */ if (!keeplog()) return; /* If background job, format job number, but only if background * logging is enabled. */ if (firstask->t_flags & T_BATCH) { if (log_background()) sprintf (job, "[%d] ", bkgno); else return; } else job[0] = EOS; /* If a valid task pointer is given, get the package and task name. * Otherwise, assume it's an internal (cl) logging message. */ if (tp) { pkg = tp->t_ltp->lt_pkp->pk_name; tname = tp->t_ltp->lt_lname; } else { pkg = "cl"; tname = ""; } /* Format the message. Only use time, no day and date. Break long * messages into several lines. */ sprintf (msg, "# %8.8s %s%s%s %s- ", (today() + 4), pkg, (tp ? "." : ""), tname, job); otop = &msg[SZ_LOGBUF]; for (op=msg, n=0; *op && op < otop; op++) n++; for (ip=usermsg; (*op++ = *ip++) && op < otop; n++) if (n + 2 >= MAXCOL) { *op++ = '\\'; *op++ = '\n'; n = 0; } *(op-1) = '\n'; *op = EOS; put_logfile (msg); }
/* BKG_SPAWN -- Spawn a new background job. Called by main() when we have * seen an '&'. */ void bkg_spawn ( char *cmd /* command entered by user to spawn job */ ) { register struct _bkgjob *bk; register int jobno, stat; char clprocess[SZ_PATHNAME]; char *wbkgfile(); char *bkgfile; /* Find first unused slot in a circular search. */ bkg_update (1); jobno = (lastjobno == NBKG) ? 1 : lastjobno + 1; while (jobno != lastjobno) { if (!busy (jobno)) break; if (jobno++ >= NBKG) jobno = 1; } if (jobno == lastjobno) cl_error (E_UERR, "no more background job slots"); /* Write bkgfile. Delete any dreg bkg communication files. */ bkg_delfiles (jobno); bkgfile = wbkgfile (jobno, cmd, NULL); /* Spawn bkg job. */ sprintf (clprocess, "%s%s", CLDIR, CLPROCESS); intr_disable(); jobtable[jobno-1].b_jobno = stat = c_propdpr (findexe (firstask->t_curpack, clprocess), bkgfile, bkgmsg); if (stat == NULL) { c_delete (bkgfile); intr_enable(); cl_error (E_IERR, "cannot spawn background CL"); } else { bk = &jobtable[jobno-1]; bk->b_flags = J_RUNNING; bk->b_clock = c_clktime (0L); bk->b_verbose = 2; strncpy (bk->b_cmd, cmd, SZ_CMD); *(bk->b_cmd+SZ_CMD) = EOS; intr_enable(); } eprintf ("[%d]\n", lastjobno = jobno); /* Make a logfile entry, saying we started the background job. */ if (keeplog() && log_background()) { char buf[SZ_LINE]; sprintf (buf, "Start [%d]", jobno); putlog (0, buf); } }