Lines Matching refs:j
208 Job *j; in j_exit() local
211 for (j = job_list; j != NULL; j = j->next) { in j_exit()
212 if (j->ppid == procpid && in j_exit()
213 (j->state == PSTOPPED || in j_exit()
214 (j->state == PRUNNING && in j_exit()
215 ((j->flags & JF_FG) || in j_exit()
218 if (j->pgrp == 0) in j_exit()
219 kill_job(j, SIGHUP); in j_exit()
221 mksh_killpg(j->pgrp, SIGHUP); in j_exit()
223 if (j->state == PSTOPPED) { in j_exit()
224 if (j->pgrp == 0) in j_exit()
225 kill_job(j, SIGCONT); in j_exit()
227 mksh_killpg(j->pgrp, SIGCONT); in j_exit()
347 Job *j; in exchild() member
374 pi.j = last_job; in exchild()
379 pi.j = new_job(); /* fills in pi.j->job */ in exchild()
384 pi.j->flags = (flags & XXCOM) ? JF_XXCOM : in exchild()
386 timerclear(&pi.j->usrtime); in exchild()
387 timerclear(&pi.j->systime); in exchild()
388 pi.j->state = PRUNNING; in exchild()
389 pi.j->pgrp = 0; in exchild()
390 pi.j->ppid = procpid; in exchild()
391 pi.j->age = ++njobs; in exchild()
392 pi.j->proc_list = pi.p; in exchild()
393 pi.j->coproc_id = 0; in exchild()
394 last_job = pi.j; in exchild()
396 put_job(pi.j, PJ_PAST_STOPPED); in exchild()
410 kill_job(pi.j, SIGKILL); in exchild()
411 remove_job(pi.j, "fork failed"); in exchild()
427 if (pi.j->pgrp == 0) { /* First process */ in exchild()
428 pi.j->pgrp = pi.p->pid; in exchild()
435 setpgid(pi.p->pid, pi.j->pgrp); in exchild()
437 tcsetpgrp(tty_fd, pi.j->pgrp); in exchild()
483 remove_job(pi.j, "child"); /* in case of $(jobs) command */ in exchild()
507 j_startjob(pi.j); in exchild()
509 pi.j->coproc_id = coproc.id; in exchild()
513 coproc.job = (void *)pi.j; in exchild()
516 j_set_async(pi.j); in exchild()
518 shf_fprintf(shl_out, "[%d]", pi.j->job); in exchild()
519 for (pi.p = pi.j->proc_list; pi.p; in exchild()
527 rv = j_waitj(pi.j, JW_NONE, "jw:last proc"); in exchild()
556 Job *j; in waitlast() local
561 j = last_job; in waitlast()
562 if (!j || !(j->flags & JF_STARTED)) { in waitlast()
563 if (!j) in waitlast()
571 rv = j_waitj(j, JW_NONE, "jw:waitlast"); in waitlast()
583 Job *j; in waitfor() local
597 for (j = job_list; j; j = j->next) in waitfor()
599 if (j->ppid == procpid && j->state == PRUNNING) in waitfor()
601 if (!j) { in waitfor()
605 } else if ((j = j_lookup(cp, &ecode))) { in waitfor()
608 if (j->ppid != procpid) { in waitfor()
620 rv = j_waitj(j, flags, "jw:waitfor"); in waitfor()
634 Job *j; in j_kill() local
641 if ((j = j_lookup(cp, &ecode)) == NULL) { in j_kill()
647 if (j->pgrp == 0) { /* started when !Flag(FMONITOR) */ in j_kill()
648 if (kill_job(j, sig) < 0) { in j_kill()
654 if (j->state == PSTOPPED && (sig == SIGTERM || sig == SIGHUP)) in j_kill()
655 mksh_killpg(j->pgrp, SIGCONT); in j_kill()
657 if (mksh_killpg(j->pgrp, sig) < 0) { in j_kill()
673 Job *j; in j_resume() local
682 if ((j = j_lookup(cp, &ecode)) == NULL) { in j_resume()
688 if (j->pgrp == 0) { in j_resume()
695 shprintf("[%d] ", j->job); in j_resume()
698 for (p = j->proc_list; p != NULL; p = p->next) { in j_resume()
711 j->state = PRUNNING; in j_resume()
713 put_job(j, PJ_PAST_STOPPED); in j_resume()
715 j_set_async(j); in j_resume()
718 if (j->state == PRUNNING) { in j_resume()
719 if (ttypgrp_ok && (j->flags & JF_SAVEDTTY)) in j_resume()
720 tcsetattr(tty_fd, TCSADRAIN, &j->ttystate); in j_resume()
723 tcsetpgrp(tty_fd, (j->flags & JF_SAVEDTTYPGRP) ? in j_resume()
724 j->saved_ttypgrp : j->pgrp) < 0) { in j_resume()
726 if (j->flags & JF_SAVEDTTY) in j_resume()
732 (int)((j->flags & JF_SAVEDTTYPGRP) ? in j_resume()
733 j->saved_ttypgrp : j->pgrp), in j_resume()
738 j->flags |= JF_FG; in j_resume()
739 j->flags &= ~JF_KNOWN; in j_resume()
740 if (j == async_job) in j_resume()
744 if (j->state == PRUNNING && mksh_killpg(j->pgrp, SIGCONT) < 0) { in j_resume()
748 j->flags &= ~JF_FG; in j_resume()
749 if (ttypgrp_ok && (j->flags & JF_SAVEDTTY)) in j_resume()
763 j->flags &= ~(JF_SAVEDTTY | JF_SAVEDTTYPGRP); in j_resume()
765 rv = j_waitj(j, JW_NONE, "jw:resume"); in j_resume()
776 Job *j; in j_stopped_running() local
779 for (j = job_list; j != NULL; j = j->next) { in j_stopped_running()
781 if (j->ppid == procpid && j->state == PSTOPPED) in j_stopped_running()
785 j->ppid == procpid && j->state == PRUNNING) in j_stopped_running()
802 Job *j; in j_njobs() local
807 for (j = job_list; j; j = j->next) in j_njobs()
820 Job *j, *tmp; in j_jobs() local
834 if ((j = j_lookup(cp, &ecode)) == NULL) { in j_jobs()
840 j = job_list; in j_jobs()
842 for (; j; j = j->next) { in j_jobs()
843 if ((!(j->flags & JF_ZOMBIE) || zflag) && in j_jobs()
844 (!nflag || (j->flags & JF_CHANGED))) { in j_jobs()
845 j_print(j, how, shl_stdout); in j_jobs()
846 if (j->state == PEXITED || j->state == PSIGNALLED) in j_jobs()
847 j->flags |= JF_REMOVE; in j_jobs()
853 for (j = job_list; j; j = tmp) { in j_jobs()
854 tmp = j->next; in j_jobs()
855 if (j->flags & JF_REMOVE) in j_jobs()
856 remove_job(j, "jobs"); in j_jobs()
866 Job *j, *tmp; in j_notify() local
870 for (j = job_list; j; j = j->next) { in j_notify()
872 if (Flag(FMONITOR) && (j->flags & JF_CHANGED)) in j_notify()
873 j_print(j, JP_MEDIUM, shl_out); in j_notify()
878 if (j->state == PEXITED || j->state == PSIGNALLED) in j_notify()
879 j->flags |= JF_REMOVE; in j_notify()
881 for (j = job_list; j; j = tmp) { in j_notify()
882 tmp = j->next; in j_notify()
883 if (j->flags & JF_REMOVE) in j_notify()
884 remove_job(j, "notify"); in j_notify()
912 j_set_async(Job *j) in j_set_async() argument
918 if (!(j->flags & JF_STARTED)) { in j_set_async()
922 async_job = j; in j_set_async()
923 async_pid = j->last_proc->pid; in j_set_async()
949 j_startjob(Job *j) in j_startjob() argument
953 j->flags |= JF_STARTED; in j_startjob()
954 for (p = j->proc_list; p->next; p = p->next) in j_startjob()
956 j->last_proc = p; in j_startjob()
971 j_waitj(Job *j, in j_waitj() argument
980 j->flags |= JF_WAITING; in j_waitj()
982 j->flags |= JF_W_ASYNCNOTIFY; in j_waitj()
989 while (j->state == PRUNNING || in j_waitj()
990 ((flags & JW_STOPPEDWAIT) && j->state == PSTOPPED)) { in j_waitj()
993 int oldf = j->flags & (JF_WAITING|JF_W_ASYNCNOTIFY); in j_waitj()
994 j->flags &= ~(JF_WAITING|JF_W_ASYNCNOTIFY); in j_waitj()
996 j->flags |= oldf; /* not reached... */ in j_waitj()
999 j->flags &= ~(JF_WAITING|JF_W_ASYNCNOTIFY); in j_waitj()
1003 j->flags &= ~(JF_WAITING|JF_W_ASYNCNOTIFY); in j_waitj()
1005 if (j->flags & JF_FG) { in j_waitj()
1006 j->flags &= ~JF_FG; in j_waitj()
1008 if (Flag(FMONITOR) && ttypgrp_ok && j->pgrp) { in j_waitj()
1020 if (j->state == PSTOPPED && in j_waitj()
1021 (j->saved_ttypgrp = tcgetpgrp(tty_fd)) >= 0) in j_waitj()
1022 j->flags |= JF_SAVEDTTYPGRP; in j_waitj()
1027 if (j->state == PSTOPPED) { in j_waitj()
1028 j->flags |= JF_SAVEDTTY; in j_waitj()
1029 tcgetattr(tty_fd, &j->ttystate); in j_waitj()
1043 if (j->state == PEXITED && j->status == 0 && in j_waitj()
1044 (j->flags & JF_USETTYMODE)) { in j_waitj()
1060 if (j->state == PSTOPPED) in j_waitj()
1061 j->flags &= ~JF_USETTYMODE; in j_waitj()
1074 status = j->last_proc->status; in j_waitj()
1075 if (Flag(FMONITOR) && j->state == PSIGNALLED && in j_waitj()
1083 j_usrtime = j->usrtime; in j_waitj()
1084 j_systime = j->systime; in j_waitj()
1085 rv = j->status; in j_waitj()
1089 && (!Flag(FMONITOR) || j->state != PSTOPPED) in j_waitj()
1092 j_print(j, JP_SHORT, shl_out); in j_waitj()
1095 if (j->state != PSTOPPED in j_waitj()
1100 remove_job(j, where); in j_waitj()
1116 Job *j; in j_sigchld() local
1128 for (j = job_list; j; j = j->next) in j_sigchld()
1129 if (j->ppid == procpid && !(j->flags & JF_STARTED)) { in j_sigchld()
1148 for (j = job_list; j != NULL; j = j->next) in j_sigchld()
1149 for (p = j->proc_list; p != NULL; p = p->next) in j_sigchld()
1153 if (j == NULL) { in j_sigchld()
1162 timeradd(&j->usrtime, &ru1.ru_utime, &j->usrtime); in j_sigchld()
1163 timersub(&j->usrtime, &ru0.ru_utime, &j->usrtime); in j_sigchld()
1164 timeradd(&j->systime, &ru1.ru_stime, &j->systime); in j_sigchld()
1165 timersub(&j->systime, &ru0.ru_stime, &j->systime); in j_sigchld()
1178 check_job(j); /* check to see if entire job is done */ in j_sigchld()
1191 check_job(Job *j) in check_job() argument
1197 if (!(j->flags & JF_STARTED)) { in check_job()
1199 j->flags); in check_job()
1204 for (p=j->proc_list; p != NULL; p = p->next) { in check_job()
1210 j->state = jstate; in check_job()
1212 switch (j->last_proc->state) { in check_job()
1214 j->status = WEXITSTATUS(j->last_proc->status); in check_job()
1217 j->status = 128 + WTERMSIG(j->last_proc->status); in check_job()
1220 j->status = 0; in check_job()
1229 if (j->state == PEXITED || j->state == PSIGNALLED) { in check_job()
1234 if (coproc.job == j) { in check_job()
1245 if (j->coproc_id && j->coproc_id == coproc.id && in check_job()
1250 j->flags |= JF_CHANGED; in check_job()
1252 if (Flag(FMONITOR) && !(j->flags & JF_XXCOM)) { in check_job()
1257 if (j->state == PSTOPPED) in check_job()
1258 put_job(j, PJ_ON_FRONT); in check_job()
1260 (j->flags & (JF_WAITING|JF_W_ASYNCNOTIFY)) != JF_WAITING) { in check_job()
1276 j_print(j, JP_MEDIUM, shl_j); in check_job()
1278 if (!(j->flags & JF_WAITING) && j->state != PSTOPPED) in check_job()
1279 remove_job(j, "notify"); in check_job()
1287 !(j->flags & (JF_WAITING|JF_FG)) && in check_job()
1288 j->state != PSTOPPED) { in check_job()
1289 if (j == async_job || (j->flags & JF_KNOWN)) { in check_job()
1290 j->flags |= JF_ZOMBIE; in check_job()
1291 j->job = -1; in check_job()
1294 remove_job(j, "checkjob"); in check_job()
1304 j_print(Job *j, int how, struct shf *shf) in j_print() argument
1321 shf_fprintf(shf, "%d\n", (int)(j->pgrp ? j->pgrp : in j_print()
1322 (j->last_proc ? j->last_proc->pid : 0))); in j_print()
1325 j->flags &= ~JF_CHANGED; in j_print()
1326 filler = j->job > 10 ? "\n " : "\n "; in j_print()
1327 if (j == job_list) in j_print()
1329 else if (j == job_list->next) in j_print()
1332 for (p = j->proc_list; p != NULL;) { in j_print()
1371 if (p == j->proc_list) in j_print()
1372 shf_fprintf(shf, "[%d] %c ", j->job, jobchar); in j_print()
1419 Job *j, *last_match; in j_lookup() local
1426 for (j = job_list; j != NULL; j = j->next) in j_lookup()
1427 if (j->last_proc && j->last_proc->pid == job) in j_lookup()
1428 return (j); in j_lookup()
1433 for (j = job_list; j != NULL; j = j->next) in j_lookup()
1434 if (j->pgrp && j->pgrp == job) in j_lookup()
1435 return (j); in j_lookup()
1461 for (j = job_list; j != NULL; j = j->next) in j_lookup()
1462 if (j->job == job) in j_lookup()
1463 return (j); in j_lookup()
1468 for (j = job_list; j != NULL; j = j->next) in j_lookup()
1469 for (p = j->proc_list; p != NULL; p = p->next) in j_lookup()
1476 last_match = j; in j_lookup()
1485 for (j = job_list; j != NULL; j = j->next) in j_lookup()
1486 if (strncmp(cp, j->proc_list->command, len) == 0) { in j_lookup()
1492 last_match = j; in j_lookup()
1515 Job *newj, *j; in new_job() local
1525 for (j = job_list; j && j->job != i; j = j->next) in new_job()
1527 if (j == NULL) in new_job()
1561 remove_job(Job *j, const char *where) in remove_job() argument
1568 for (; curr != NULL && curr != j; prev = &curr->next, curr = *prev) in remove_job()
1570 if (curr != j) { in remove_job()
1577 for (p = j->proc_list; p != NULL; ) { in remove_job()
1584 if ((j->flags & JF_ZOMBIE) && j->ppid == procpid) in remove_job()
1586 j->next = free_jobs; in remove_job()
1587 free_jobs = j; in remove_job()
1589 if (j == last_job) in remove_job()
1591 if (j == async_job) in remove_job()
1602 put_job(Job *j, int where) in put_job() argument
1609 for (; curr && curr != j; prev = &curr->next, curr = *prev) in put_job()
1611 if (curr == j) in put_job()
1616 j->next = job_list; in put_job()
1617 job_list = j; in put_job()
1626 j->next = curr; in put_job()
1627 *prev = j; in put_job()
1638 kill_job(Job *j, int sig) in kill_job() argument
1643 for (p = j->proc_list; p != NULL; p = p->next) in kill_job()