]> git.ipfire.org Git - thirdparty/HylaFAX.git/commitdiff
[Bug 78] RFE: new status flag F=Failed
authorDarren Nickerson <darren.nickerson@ifax.com>
Fri, 15 Feb 2002 04:20:48 +0000 (04:20 +0000)
committerDarren Nickerson <darren.nickerson@ifax.com>
Fri, 15 Feb 2002 04:20:48 +0000 (04:20 +0000)
Change status of completed jobs to:
  D - for transmitted jobs
  F - for failed jobs.
Contributed by Patrice Fournier.

faxd/FaxRequest.c++
faxd/FaxRequest.h
faxd/faxQueueApp.c++
hfaxd/Jobs.c++
hfaxd/SNPPServer.c++
man/faxstat.1

index dd191f9bcb75c605c303657c8a4921dd4d3946db..7b5d9dbff8ad17ec42e22548e7933d3fdd426b9b 100644 (file)
@@ -368,7 +368,7 @@ FaxRequest::readQFile(bool& rejectJob)
      * ``suitable values'' by higher-level code (i.e.
      * the scheduler).
      */
-    if (state < state_suspended || state > state_done) {
+    if (state < state_suspended || state > state_failed) {
        error("Invalid scheduler state %u in job request", state);
        rejectJob = true;
     }
index 1f8daa210284a2e8ae7dba756b7ebf705490c569..7c0a5794723bf618759a526856605072cf4bc144 100644 (file)
@@ -87,7 +87,8 @@ public:
        state_blocked   = 4,    // blocked by concurrent activity
        state_ready     = 5,    // ready to be go, waiting for resources
        state_active    = 6,    // actively being processed
-       state_done      = 7     // processing completed
+       state_done      = 7,    // processing completed with success
+       state_failed    = 8     // processing completed with a failure
     };
     struct stringval {         // string-valued item
        const char* name;
index 326ef5281ddf0a585dbf57835be2b7ca8ff930c8..04a73cd0d5604bbe2cd61182c81783487a77ee6e 100644 (file)
@@ -226,7 +226,7 @@ faxQueueApp::processJob(Job& job, FaxRequest* req,
     updateRequest(*req, job);
     if (!prepareJobNeeded(job, *req, status)) {
        if (status != Job::done) {
-           job.state = FaxRequest::state_done;
+           job.state = FaxRequest::state_failed;
            deleteRequest(job, req, status, true);
            setDead(job);
        } else
@@ -1362,7 +1362,7 @@ faxQueueApp::sendJobDone(Job& job, int status)
         * notified of the requeue as well as the timeout?
         */
        fxAssert(!job.suspendPending, "Interrupted job timed out");
-       job.state = FaxRequest::state_done;
+       job.state = FaxRequest::state_failed;
        deleteRequest(job, req, Job::timedout, true);
        setDead(job);
     } else if (req->status == send_retry) {
@@ -1444,14 +1444,16 @@ faxQueueApp::sendJobDone(Job& job, int status)
            job.suspendPending = false;
        delete req;                             // implicit unlock of q file
     } else {
-       job.state = FaxRequest::state_done;
-       traceQueue(job, "SEND DONE: " | strTime(duration));
-       Trigger::post(Trigger::SEND_DONE, job);
        // NB: always notify client if job failed
-       if (req->status == send_failed)
+       if (req->status == send_failed) {
+           job.state = FaxRequest::state_failed;
            deleteRequest(job, req, Job::failed, true, fmtTime(duration));
-       else
+       } else {
+           job.state = FaxRequest::state_done;
            deleteRequest(job, req, Job::done, false, fmtTime(duration));
+       }
+       traceQueue(job, "SEND DONE: " | strTime(duration));
+       Trigger::post(Trigger::SEND_DONE, job);
        setDead(job);
     }
 }
@@ -1503,7 +1505,9 @@ faxQueueApp::setSleep(Job& job, time_t tts)
 void
 faxQueueApp::setDead(Job& job)
 {
-    job.state = FaxRequest::state_done;
+    if (job.state != FaxRequest::state_done 
+      && job.state != FaxRequest::state_failed)
+       job.state = FaxRequest::state_failed;
     job.suspendPending = false;
     traceJob(job, "DEAD");
     Trigger::post(Trigger::JOB_DEAD, job);
@@ -1642,6 +1646,7 @@ faxQueueApp::submitJob(Job& job, FaxRequest& req, bool checkState)
            setSuspend(job);
            return (true);
        case FaxRequest::state_done:
+       case FaxRequest::state_failed:
            setDead(job);
            return (true);
        }
@@ -1718,10 +1723,12 @@ faxQueueApp::suspendJob(Job& job, bool abortActive)
         * Recheck the job state; it may have changed while
         * we were waiting for the subprocess to terminate.
         */
-       if (job.state != FaxRequest::state_done)
+       if (job.state != FaxRequest::state_done &&
+         job.state != FaxRequest::state_failed)
            break;
        /* fall thru... */
     case FaxRequest::state_done:
+    case FaxRequest::state_failed:
        return (false);
     case FaxRequest::state_sleeping:
     case FaxRequest::state_pending:
@@ -1780,7 +1787,7 @@ faxQueueApp::terminateJob(const fxStr& jobid, JobStatus why)
 {
     Job* job = Job::getJobByID(jobid);
     if (job && suspendJob(*job, true)) {
-       job->state = FaxRequest::state_done;
+       job->state = FaxRequest::state_failed;
        Trigger::post(Trigger::JOB_KILL, *job);
        FaxRequest* req = readRequest(*job);
        if (req)
@@ -1800,7 +1807,7 @@ faxQueueApp::rejectJob(Job& job, FaxRequest& req, const fxStr& reason)
     req.status = send_failed;
     req.notice = reason;
     traceServer("JOB " | job.jobid | ": " | reason);
-    job.state = FaxRequest::state_done;
+    job.state = FaxRequest::state_failed;
     Trigger::post(Trigger::JOB_REJECT, job);
     setDead(job);                              // dispose of job
 }
@@ -1858,7 +1865,7 @@ faxQueueApp::timeoutJob(Job& job)
     Trigger::post(Trigger::JOB_TIMEDOUT, job);
     if (job.state != FaxRequest::state_active) {
        job.remove();                           // remove from sleep queue
-       job.state = FaxRequest::state_done;
+       job.state = FaxRequest::state_failed;
        FaxRequest* req = readRequest(job);
        if (req)
            deleteRequest(job, req, Job::timedout, true);
@@ -1880,7 +1887,7 @@ faxQueueApp::timeoutJob(Job& job)
 void
 faxQueueApp::timeoutJob(Job& job, FaxRequest& req)
 {
-    job.state = FaxRequest::state_done;
+    job.state = FaxRequest::state_failed;
     traceQueue(job, "KILL TIME EXPIRED");
     Trigger::post(Trigger::JOB_TIMEDOUT, job);
     deleteRequest(job, req, Job::timedout, true);
@@ -1906,7 +1913,8 @@ faxQueueApp::submitJob(const fxStr& jobid, bool checkState)
                delete req;                     // NB: unlock qfile
            } else
                setDead(*job);                  // XXX???
-       } else if (job->state == FaxRequest::state_done)
+       } else if (job->state == FaxRequest::state_done ||
+         job->state == FaxRequest::state_failed)
            jobError(*job, "Cannot resubmit a completed job");
        else
            ok = true;                          // other, nothing to do
@@ -1942,17 +1950,19 @@ faxQueueApp::submitJob(const fxStr& jobid, bool checkState)
             */
            bool reject;
            if (req.readQFile(reject) && !reject &&
-             req.state != FaxRequest::state_done) {
+             req.state != FaxRequest::state_done &&
+             req.state != FaxRequest::state_failed) {
                status = submitJob(req, checkState);
            } else if (reject) {
                Job job(req);
-               job.state = FaxRequest::state_done;
+               job.state = FaxRequest::state_failed;
                req.status = send_failed;
                req.notice = "Invalid or corrupted job description file";
                traceServer("JOB " | jobid | ": " | req.notice);
                // NB: this may not work, but we try...
                deleteRequest(job, req, Job::rejected, true);
-           } else if (req.state == FaxRequest::state_done) {
+           } else if (req.state == FaxRequest::state_done ||
+             req.state == FaxRequest::state_failed) {
                logError("JOB %s: Cannot resubmit a completed job",
                    (const char*) jobid);
            } else
@@ -2312,7 +2322,10 @@ faxQueueApp::deleteRequest(Job& job, FaxRequest& req, JobStatus why,
        }
        req.qfile = dest;                       // moved to doneq
        job.file = req.qfile;                   // ...and track change
-       req.state = FaxRequest::state_done;     // job is definitely done
+       if (why == Job::done)
+           req.state = FaxRequest::state_done; // job is definitely done
+       else
+           req.state = FaxRequest::state_failed;// job is definitely done
        req.pri = job.pri;                      // just in case someone cares
        req.tts = Sys::now();                   // mark job termination time
        req.writeQFile();
@@ -2974,12 +2987,12 @@ vtraceJob(const Job& job, const char* fmt, va_list ap)
 {
     static const char* stateNames[] = {
         "state#0", "suspended", "pending", "sleeping", "blocked",
-       "ready", "active", "done"
+       "ready", "active", "done", "failed"
     };
     time_t now = Sys::now();
     vlogInfo(
          "JOB " | job.jobid
-       | " (" | stateNames[job.state&7]
+       | " (" | stateNames[job.state%9]
        | " dest " | job.dest
        | fxStr::format(" pri %u", job.pri)
        | " tts " | strTime(job.tts - now)
index d3642f81ad521480216999d52d4bf44114cc4137..f5190a2d83bdcf0c8d9187fc4059ba02742b0cd9 100644 (file)
@@ -1188,6 +1188,7 @@ HylaFAXServer::deleteJob(const char* jobid)
     Job* job = preJobCmd("delete", jobid, emsg);
     if (job) {
        if (job->state != FaxRequest::state_done &&
+         job->state != FaxRequest::state_failed &&
          job->state != FaxRequest::state_suspended) {
            reply(504, "Job %s not deleted; use JSUSP first.", jobid);
            return;
@@ -1269,7 +1270,8 @@ HylaFAXServer::operateOnJob(const char* jobid, const char* what, const char* op)
     fxStr emsg;
     Job* job = preJobCmd(what, jobid, emsg);
     if (job) {
-       if (job->state == FaxRequest::state_done) {
+       if (job->state == FaxRequest::state_done ||
+         job->state == FaxRequest::state_failed) {
            reply(504, "Job %s not %sed; already done.", jobid, what);
            return;
        }
@@ -1324,7 +1326,8 @@ HylaFAXServer::submitJob(const char* jobid)
     fxStr emsg;
     Job* job = preJobCmd("submit", jobid, emsg);
     if (job) {
-       if (job->state == FaxRequest::state_done) {
+       if (job->state == FaxRequest::state_done ||
+         job->state == FaxRequest::state_failed) {
            reply(504, "Job %s not submitted; already done.", jobid);
            return;
        }
@@ -1381,7 +1384,8 @@ HylaFAXServer::waitForJob(const char* jobid)
            reply(504, "Cannot wait for default job.");
            return;
        }
-       if (job->state == FaxRequest::state_done) {
+       if (job->state == FaxRequest::state_done ||
+         job->state == FaxRequest::state_failed) {
            reply(216, "Job %s done (already).", jobid);
            return;
        }
@@ -1402,7 +1406,8 @@ HylaFAXServer::waitForJob(const char* jobid)
                     * blindly hold a reference to the in-memory structure.
                     */
                    job = findJob(jobid, emsg);
-                   if (!job || job->state == FaxRequest::state_done)
+                   if (!job || job->state == FaxRequest::state_done ||
+                     job->state == FaxRequest::state_failed)
                        break;
                }
                reply(216, "Wait for job %s completed.", jobid);
@@ -1732,7 +1737,7 @@ HylaFAXServer::Jprintf(FILE* fd, const char* fmt, const Job& job)
                break;
 #endif /* OLDPROTO_SUPPORT */
            case 'a':
-               fprintf(fd, fspec, "?TPSBWRD"[job.state]);
+               fprintf(fd, fspec, "?TPSBWRDF"[job.state]);
                break;
            case 'b':
                fprintf(fd, fspec, job.ntries);
index bcc0a6696983168e052a67fe8d1f671ab5f9f8af..2181a8bb16f8b063f805132bd3d50f59fbbdde20 100644 (file)
@@ -1289,7 +1289,9 @@ SNPPServer::sendCmd(void)
                    Job* job = findJob(msgs[i], emsg);
                    if (!job)
                        msgs.remove(i), n--;
-                   else if (!job->queued && job->state != FaxRequest::state_done)
+                   else if (!job->queued && 
+                     job->state != FaxRequest::state_done &&
+                     job->state != FaxRequest::state_failed)
                        jobsPending = true;
                }
            } while (IS(WAITTRIG) && jobsPending);
index c84d663f52b508d824709b5667717df7745b0238..548c81edfdb31b3eeb5c12e1bf7fd0792ce8a459 100644 (file)
@@ -352,7 +352,8 @@ format produces:
 ``W'' for a job waiting for resources such as a free modem,
 ``R'' for a job that is actively running,
 and
-``D'' for a job that is done.
+``D'' for a job that is done and was a success.
+``F'' for a job that failed to complete.
 .IP
 The
 .B h