X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=builtins%2Fjobs.def;h=4c3ba6a73144c9bcf266d5d5184128fc5a8ed97e;hb=95732b497d12c98613bb3c5db16b61f377501a59;hp=2c818af5bab3d8b6ff0018232ee6326943b32f7c;hpb=d166f048818e10cf3799aa24a174fb22835f1acc;p=platform%2Fupstream%2Fbash.git diff --git a/builtins/jobs.def b/builtins/jobs.def index 2c818af..4c3ba6a 100644 --- a/builtins/jobs.def +++ b/builtins/jobs.def @@ -1,13 +1,13 @@ This file is jobs.def, from which is created jobs.c. It implements the builtins "jobs" and "disown" in Bash. -Copyright (C) 1987, 1989, 1991, 1992 Free Software Foundation, Inc. +Copyright (C) 1987-2005 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. Bash is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free -Software Foundation; either version 1, or (at your option) any later +Software Foundation; either version 2, or (at your option) any later version. Bash is distributed in the hope that it will be useful, but WITHOUT ANY @@ -17,7 +17,7 @@ for more details. You should have received a copy of the GNU General Public License along with Bash; see the file COPYING. If not, write to the Free Software -Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. $PRODUCES jobs.c @@ -46,6 +46,7 @@ $END #endif #include "../bashansi.h" +#include "../bashintl.h" #include "../shell.h" #include "../jobs.h" @@ -57,8 +58,7 @@ $END #define JSTATE_RUNNING 0x1 #define JSTATE_STOPPED 0x2 -extern int job_control, interactive_shell; -static int execute_list_with_replacements (); +static int execute_list_with_replacements __P((WORD_LIST *)); /* The `jobs' command. Prints outs a list of active jobs. If the argument `-l' is given, then the process id's are printed also. @@ -75,9 +75,6 @@ jobs_builtin (list) int form, execute, state, opt, any_failed, job; sigset_t set, oset; - if (job_control == 0 && interactive_shell == 0) - return (EXECUTION_SUCCESS); - execute = any_failed = 0; form = JLIST_STANDARD; state = JSTATE_ANY; @@ -99,7 +96,7 @@ jobs_builtin (list) case 'x': if (form != JLIST_STANDARD) { - builtin_error ("Other options not allowed with `-x'"); + builtin_error (_("no other options allowed with `-x'")); return (EXECUTION_FAILURE); } execute++; @@ -144,9 +141,9 @@ jobs_builtin (list) BLOCK_CHILD (set, oset); job = get_job_spec (list); - if ((job == NO_JOB) || !jobs || !jobs[job]) + if ((job == NO_JOB) || jobs == 0 || get_job_by_jid (job) == 0) { - builtin_error ("no such job %s", list->word->word); + sh_badjob (list->word->word); any_failed++; } else if (job != DUP_JOB) @@ -164,6 +161,8 @@ execute_list_with_replacements (list) { register WORD_LIST *l; int job, result; + COMMAND *command; + JOB *j; /* First do the replacement of job specifications with pids. */ for (l = list; l; l = l->next) @@ -173,31 +172,29 @@ execute_list_with_replacements (list) job = get_job_spec (l); /* A bad job spec is not really a job spec! Pass it through. */ - if (job < 0 || job >= job_slots || !jobs[job]) + if (INVALID_JOB (job)) continue; + j = get_job_by_jid (job); free (l->word->word); - l->word->word = itos (jobs[job]->pgrp); + l->word->word = itos (j->pgrp); } } /* Next make a new simple command and execute it. */ begin_unwind_frame ("jobs_builtin"); - { - COMMAND *command = (COMMAND *)NULL; - - add_unwind_protect (dispose_command, command); - command = make_bare_simple_command (); - command->value.Simple->words = copy_word_list (list); - command->value.Simple->redirects = (REDIRECT *)NULL; - command->flags |= CMD_INHIBIT_EXPANSION; - command->value.Simple->flags |= CMD_INHIBIT_EXPANSION; + command = make_bare_simple_command (); + command->value.Simple->words = copy_word_list (list); + command->value.Simple->redirects = (REDIRECT *)NULL; + command->flags |= CMD_INHIBIT_EXPANSION; + command->value.Simple->flags |= CMD_INHIBIT_EXPANSION; - result = execute_command (command); - } + add_unwind_protect (dispose_command, command); + result = execute_command (command); + dispose_command (command); - run_unwind_frame ("jobs_builtin"); + discard_unwind_frame ("jobs_builtin"); return (result); } #endif /* JOB_CONTROL */ @@ -205,11 +202,12 @@ execute_list_with_replacements (list) $BUILTIN disown $FUNCTION disown_builtin $DEPENDS_ON JOB_CONTROL -$SHORT_DOC disown [-h] [jobspec ...] +$SHORT_DOC disown [-h] [-ar] [jobspec ...] By default, removes each JOBSPEC argument from the table of active jobs. If the -h option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a -SIGHUP. +SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all +jobs from the job table; the -r option means to remove only running jobs. $END #if defined (JOB_CONTROL) @@ -217,18 +215,25 @@ int disown_builtin (list) WORD_LIST *list; { - int opt, job, retval, nohup_only; + int opt, job, retval, nohup_only, running_jobs, all_jobs; sigset_t set, oset; + intmax_t pid_value; - nohup_only = 0; + nohup_only = running_jobs = all_jobs = 0; reset_internal_getopt (); - while ((opt = internal_getopt (list, "h")) != -1) + while ((opt = internal_getopt (list, "ahr")) != -1) { switch (opt) { + case 'a': + all_jobs = 1; + break; case 'h': nohup_only = 1; break; + case 'r': + running_jobs = 1; + break; default: builtin_usage (); return (EX_USAGE); @@ -237,34 +242,32 @@ disown_builtin (list) list = loptend; retval = EXECUTION_SUCCESS; -#if 0 - /* For the future `disown -a' */ - if (list == 0) + /* `disown -a' or `disown -r' */ + if (list == 0 && (all_jobs || running_jobs)) { if (nohup_only) - nohup_all_jobs (); + nohup_all_jobs (running_jobs); else - delete_all_jobs (); + delete_all_jobs (running_jobs); return (EXECUTION_SUCCESS); } -#endif do { BLOCK_CHILD (set, oset); - job = (list && all_digits(list->word->word)) - ? get_job_by_pid (atoi(list->word->word), 0) + job = (list && legal_number (list->word->word, &pid_value) && pid_value == (pid_t) pid_value) + ? get_job_by_pid ((pid_t) pid_value, 0) : get_job_spec (list); - if (job == NO_JOB || jobs == 0 || jobs[job] == 0) + if (job == NO_JOB || jobs == 0 || INVALID_JOB (job)) { - builtin_error ("%s: no such job", list ? list->word->word : "current"); + sh_badjob (list ? list->word->word : "current"); retval = EXECUTION_FAILURE; } else if (nohup_only) nohup_job (job); else - delete_job (job); + delete_job (job, 1); UNBLOCK_CHILD (oset); if (list)