]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[job] Allow job_progress() to return an ongoing job status code, if known
authorMichael Brown <mcb30@ipxe.org>
Fri, 1 Nov 2013 15:05:16 +0000 (15:05 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 1 Nov 2013 16:17:28 +0000 (16:17 +0000)
Some background jobs have a meaningful ongoing status code (e.g. the
current link status for a job waiting for a network link to come up).
Allow this to be exposed via the job_progress() method.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/downloader.c
src/core/job.c
src/include/ipxe/job.h

index 4f3fc2c81eea2e3189d4349eafcbdf198d462a70..3927dfabf09c51cd4d3f5ef45887a985e28de861 100644 (file)
@@ -131,9 +131,10 @@ static int downloader_ensure_size ( struct downloader *downloader,
  *
  * @v downloader       Downloader
  * @v progress         Progress report to fill in
+ * @ret ongoing_rc     Ongoing job status code (if known)
  */
-static void downloader_progress ( struct downloader *downloader,
-                                 struct job_progress *progress ) {
+static int downloader_progress ( struct downloader *downloader,
+                                struct job_progress *progress ) {
 
        /* This is not entirely accurate, since downloaded data may
         * arrive out of order (e.g. with multicast protocols), but
@@ -141,6 +142,8 @@ static void downloader_progress ( struct downloader *downloader,
         */
        progress->completed = downloader->pos;
        progress->total = downloader->image->len;
+
+       return 0;
 }
 
 /****************************************************************************
index 64d184ec313810735d1da11c932cb79b7f5f0535..674bec8b52095ab81ea69c15fc9de97f20896c81 100644 (file)
@@ -34,22 +34,30 @@ FILE_LICENCE ( GPL2_OR_LATER );
  *
  * @v intf             Object interface
  * @v progress         Progress data to fill in
+ * @ret ongoing_rc     Ongoing job status code (if known)
  */
-void job_progress ( struct interface *intf, struct job_progress *progress ) {
+int job_progress ( struct interface *intf, struct job_progress *progress ) {
        struct interface *dest;
        job_progress_TYPE ( void * ) *op =
                intf_get_dest_op ( intf, job_progress, &dest );
        void *object = intf_object ( dest );
+       int ongoing_rc;
 
        DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " job_progress\n",
               INTF_INTF_DBG ( intf, dest ) );
 
+       /* Initialise progress to zero */
+       memset ( progress, 0, sizeof ( *progress ) );
+
        if ( op ) {
-               op ( object, progress );
+               ongoing_rc = op ( object, progress );
        } else {
-               /* Default is to mark progress as zero */
-               memset ( progress, 0, sizeof ( *progress ) );
+               /* Default is to leave progress as zero and have no
+                * known return status code.
+                */
+               ongoing_rc = 0;
        }
 
        intf_put ( dest );
+       return ongoing_rc;
 }
index c2232fc170abdca756a1207e1dabb630323b6c4d..a2369f7c21dc70853b79ff7cf6cc2a10301d1bad 100644 (file)
@@ -30,9 +30,9 @@ struct job_progress {
        unsigned long total;
 };
 
-extern void job_progress ( struct interface *intf,
-                          struct job_progress *progress );
+extern int job_progress ( struct interface *intf,
+                         struct job_progress *progress );
 #define job_progress_TYPE( object_type ) \
-       typeof ( void ( object_type, struct job_progress *progress ) )
+       typeof ( int ( object_type, struct job_progress *progress ) )
 
 #endif /* _IPXE_JOB_H */