Ver código fonte

Shell: Move printing job status into a Job::print_status() helper

This is only used by the "jobs" builtin right now, but more soon.
Andreas Kling 5 anos atrás
pai
commit
22dd5a7021
4 arquivos alterados com 87 adições e 45 exclusões
  1. 6 44
      Shell/Builtin.cpp
  2. 2 1
      Shell/CMakeLists.txt
  3. 71 0
      Shell/Job.cpp
  4. 8 0
      Shell/Job.h

+ 6 - 44
Shell/Builtin.cpp

@@ -429,55 +429,17 @@ int Shell::builtin_jobs(int argc, const char** argv)
     if (!parser.parse(argc, const_cast<char**>(argv), false))
         return 1;
 
-    enum {
-        Basic,
-        OnlyPID,
-        ListAll,
-    } mode { Basic };
+    Job::PrintStatusMode mode = Job::PrintStatusMode::Basic;
 
     if (show_pid)
-        mode = OnlyPID;
+        mode = Job::PrintStatusMode::OnlyPID;
 
     if (list)
-        mode = ListAll;
-
-    for (auto& job : jobs) {
-        auto pid = job.value->pid();
-        int wstatus;
-        auto rc = waitpid(pid, &wstatus, WNOHANG);
-        if (rc == -1) {
-            perror("waitpid");
-            return 1;
-        }
-        auto status = "running";
-
-        if (rc != 0) {
-            if (WIFEXITED(wstatus))
-                status = "exited";
-
-            if (WIFSTOPPED(wstatus))
-                status = "stopped";
+        mode = Job::PrintStatusMode::ListAll;
 
-            if (WIFSIGNALED(wstatus))
-                status = "signaled";
-        }
-
-        char background_indicator = '-';
-
-        if (job.value->is_running_in_background())
-            background_indicator = '+';
-
-        switch (mode) {
-        case Basic:
-            printf("[%" PRIu64 "] %c %s %s\n", job.value->job_id(), background_indicator, status, job.value->cmd().characters());
-            break;
-        case OnlyPID:
-            printf("[%" PRIu64 "] %c %d %s %s\n", job.value->job_id(), background_indicator, pid, status, job.value->cmd().characters());
-            break;
-        case ListAll:
-            printf("[%" PRIu64 "] %c %d %d %s %s\n", job.value->job_id(), background_indicator, pid, job.value->pgid(), status, job.value->cmd().characters());
-            break;
-        }
+    for (auto& it : jobs) {
+        if (!it.value->print_status(mode))
+            return 1;
     }
 
     return 0;

+ 2 - 1
Shell/CMakeLists.txt

@@ -1,9 +1,10 @@
 set(SOURCES
     AST.cpp
     Builtin.cpp
-    main.cpp
+    Job.cpp
     Parser.cpp
     Shell.cpp
+    main.cpp
 )
 
 serenity_bin(Shell)

+ 71 - 0
Shell/Job.cpp

@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2020, the SerenityOS developers
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "Job.h"
+#include <inttypes.h>
+#include <stdio.h>
+#include <sys/wait.h>
+
+bool Job::print_status(PrintStatusMode mode)
+{
+    int wstatus;
+    auto rc = waitpid(m_pid, &wstatus, WNOHANG);
+    if (rc == -1) {
+        perror("waitpid");
+        return false;
+    }
+    auto status = "running";
+
+    if (rc != 0) {
+        if (WIFEXITED(wstatus))
+            status = "exited";
+
+        if (WIFSTOPPED(wstatus))
+            status = "stopped";
+
+        if (WIFSIGNALED(wstatus))
+            status = "signaled";
+    }
+
+    char background_indicator = '-';
+
+    if (is_running_in_background())
+        background_indicator = '+';
+
+    switch (mode) {
+    case PrintStatusMode::Basic:
+        printf("[%" PRIu64 "] %c %s %s\n", m_job_id, background_indicator, status, m_cmd.characters());
+        break;
+    case PrintStatusMode::OnlyPID:
+        printf("[%" PRIu64 "] %c %d %s %s\n", m_job_id, background_indicator, m_pid, status, m_cmd.characters());
+        break;
+    case PrintStatusMode::ListAll:
+        printf("[%" PRIu64 "] %c %d %d %s %s\n", m_job_id, background_indicator, m_pid, m_pgid, status, m_cmd.characters());
+        break;
+    }
+
+    return true;
+}

+ 8 - 0
Shell/Job.h

@@ -92,6 +92,14 @@ public:
 
     void deactivate() const { m_active = false; }
 
+    enum class PrintStatusMode {
+        Basic,
+        OnlyPID,
+        ListAll,
+    };
+
+    bool print_status(PrintStatusMode);
+
 private:
     Job(pid_t pid, unsigned pgid, String cmd, u64 job_id)
         : m_pgid(pgid)