/// The jobs builtin. Used for printing running jobs. Defined in builtin_jobs.c. int builtin_jobs(parser_t &parser, io_streams_t &streams, wchar_t **argv) { wchar_t *cmd = argv[0]; int argc = builtin_count_args(argv); int found = 0; int mode = JOBS_DEFAULT; int print_last = 0; static const wchar_t *const short_options = L":cghlpq"; static const struct woption long_options[] = { {L"command", no_argument, NULL, 'c'}, {L"group", no_argument, NULL, 'g'}, {L"help", no_argument, NULL, 'h'}, {L"last", no_argument, NULL, 'l'}, {L"pid", no_argument, NULL, 'p'}, {L"quiet", no_argument, NULL, 'q'}, {nullptr, 0, NULL, 0}}; int opt; wgetopter_t w; while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'p': { mode = JOBS_PRINT_PID; break; } case 'q': { mode = JOBS_PRINT_NOTHING; break; } case 'c': { mode = JOBS_PRINT_COMMAND; break; } case 'g': { mode = JOBS_PRINT_GROUP; break; } case 'l': { print_last = 1; break; } case 'h': { builtin_print_help(parser, streams, cmd, streams.out); return STATUS_CMD_OK; } case ':': { builtin_missing_argument(parser, streams, cmd, argv[w.woptind - 1]); return STATUS_INVALID_ARGS; } case '?': { builtin_unknown_option(parser, streams, cmd, argv[w.woptind - 1]); return STATUS_INVALID_ARGS; } default: { DIE("unexpected retval from wgetopt_long"); break; } } } if (print_last) { // Ignore unconstructed jobs, i.e. ourself. job_iterator_t jobs; const job_t *j; while ((j = jobs.next())) { if (j->is_constructed() && !j->is_completed()) { builtin_jobs_print(j, mode, !streams.out_is_redirected, streams); return STATUS_CMD_ERROR; } } } else { if (w.woptind < argc) { int i; for (i = w.woptind; i < argc; i++) { const job_t *j = nullptr; if (argv[i][0] == L'%') { int jobId = -1; jobId = fish_wcstoi(argv[i] + 1); if (errno || jobId < -1) { streams.err.append_format(_(L"%ls: '%ls' is not a valid job id"), cmd, argv[i]); return STATUS_INVALID_ARGS; } j = job_t::from_job_id(jobId); } else { int pid = fish_wcstoi(argv[i]); if (errno || pid < 0) { streams.err.append_format(_(L"%ls: '%ls' is not a valid process id\n"), cmd, argv[i]); return STATUS_INVALID_ARGS; } j = job_t::from_pid(pid); } if (j && !j->is_completed() && j->is_constructed()) { builtin_jobs_print(j, mode, false, streams); found = 1; } else { streams.err.append_format(_(L"%ls: No suitable job: %ls\n"), cmd, argv[i]); return STATUS_CMD_ERROR; } } } else { job_iterator_t jobs; const job_t *j; while ((j = jobs.next())) { // Ignore unconstructed jobs, i.e. ourself. if (j->is_constructed() && !j->is_completed()) { builtin_jobs_print(j, mode, !found && !streams.out_is_redirected, streams); found = 1; } } } } if (!found) { // Do not babble if not interactive. if (!streams.out_is_redirected && mode != JOBS_PRINT_NOTHING) { streams.out.append_format(_(L"%ls: There are no jobs\n"), argv[0]); } return STATUS_CMD_ERROR; } return STATUS_CMD_OK; }
/** The jobs builtin. Used fopr printing running jobs. Defined in builtin_jobs.c. */ static int builtin_jobs( wchar_t **argv ) { int argc=0; int found=0; int mode=JOBS_DEFAULT; int print_last = 0; job_t *j; argc = builtin_count_args( argv ); woptind=0; while( 1 ) { const static struct woption long_options[] = { { L"pid", no_argument, 0, 'p' } , { L"command", no_argument, 0, 'c' } , { L"group", no_argument, 0, 'g' } , { L"last", no_argument, 0, 'l' } , { L"help", no_argument, 0, 'h' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = wgetopt_long( argc, argv, L"pclgh", long_options, &opt_index ); if( opt == -1 ) break; switch( opt ) { case 0: if(long_options[opt_index].flag != 0) break; sb_printf( sb_err, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name ); builtin_print_help( argv[0], sb_err ); return 1; case 'p': mode=JOBS_PRINT_PID; break; case 'c': mode=JOBS_PRINT_COMMAND; break; case 'g': mode=JOBS_PRINT_GROUP; break; case 'l': { print_last = 1; break; } case 'h': builtin_print_help( argv[0], sb_out ); return 0; case '?': builtin_unknown_option( argv[0], argv[woptind-1] ); return 1; } } /* Do not babble if not interactive */ if( builtin_out_redirect ) { found=1; } if( print_last ) { /* Ignore unconstructed jobs, i.e. ourself. */ for( j=first_job; j; j=j->next ) { if( (j->flags & JOB_CONSTRUCTED) && !job_is_completed(j) ) { builtin_jobs_print( j, mode, !found ); return 0; } } } else { if( woptind < argc ) { int i; found = 1; for( i=woptind; i<argc; i++ ) { long pid; wchar_t *end; errno=0; pid=wcstol( argv[i], &end, 10 ); if( errno || *end ) { sb_printf( sb_err, _( L"%ls: '%ls' is not a job\n" ), argv[0], argv[i] ); return 1; } j = job_get_from_pid( pid ); if( j && !job_is_completed( j ) ) { builtin_jobs_print( j, mode, !found ); } else { sb_printf( sb_err, _( L"%ls: No suitable job: %d\n" ), argv[0], pid ); return 1; } } } else { for( j= first_job; j; j=j->next ) { /* Ignore unconstructed jobs, i.e. ourself. */ if( (j->flags & JOB_CONSTRUCTED) && !job_is_completed(j) ) { builtin_jobs_print( j, mode, !found ); found = 1; } } } } if( !found ) { sb_printf( sb_out, _( L"%ls: There are no jobs\n" ), argv[0] ); } return 0; }
/// The jobs builtin. Used fopr printing running jobs. Defined in builtin_jobs.c. int builtin_jobs(parser_t &parser, io_streams_t &streams, wchar_t **argv) { wgetopter_t w; int argc = 0; int found = 0; int mode = JOBS_DEFAULT; int print_last = 0; argc = builtin_count_args(argv); w.woptind = 0; while (1) { static const struct woption long_options[] = { {L"pid", no_argument, 0, 'p'}, {L"command", no_argument, 0, 'c'}, {L"group", no_argument, 0, 'g'}, {L"last", no_argument, 0, 'l'}, {L"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; int opt_index = 0; int opt = w.wgetopt_long(argc, argv, L"pclgh", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: { if (long_options[opt_index].flag != 0) break; streams.err.append_format(BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, streams, argv[0], streams.err); return 1; } case 'p': { mode = JOBS_PRINT_PID; break; } case 'c': { mode = JOBS_PRINT_COMMAND; break; } case 'g': { mode = JOBS_PRINT_GROUP; break; } case 'l': { print_last = 1; break; } case 'h': { builtin_print_help(parser, streams, argv[0], streams.out); return 0; } case '?': { builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); return 1; } default: { DIE("unexpected opt"); break; } } } if (print_last) { // Ignore unconstructed jobs, i.e. ourself. job_iterator_t jobs; const job_t *j; while ((j = jobs.next())) { if ((j->flags & JOB_CONSTRUCTED) && !job_is_completed(j)) { builtin_jobs_print(j, mode, !streams.out_is_redirected, streams); return 0; } } } else { if (w.woptind < argc) { int i; for (i = w.woptind; i < argc; i++) { int pid = fish_wcstoi(argv[i]); if (errno || pid < 0) { streams.err.append_format(_(L"%ls: '%ls' is not a job\n"), argv[0], argv[i]); return 1; } const job_t *j = job_get_from_pid(pid); if (j && !job_is_completed(j)) { builtin_jobs_print(j, mode, false, streams); found = 1; } else { streams.err.append_format(_(L"%ls: No suitable job: %d\n"), argv[0], pid); return 1; } } } else { job_iterator_t jobs; const job_t *j; while ((j = jobs.next())) { // Ignore unconstructed jobs, i.e. ourself. if ((j->flags & JOB_CONSTRUCTED) && !job_is_completed(j)) { builtin_jobs_print(j, mode, !found && !streams.out_is_redirected, streams); found = 1; } } } } if (!found) { // Do not babble if not interactive. if (!streams.out_is_redirected) { streams.out.append_format(_(L"%ls: There are no jobs\n"), argv[0]); } return 1; } return 0; }