Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright (C) 2007 Michael Brown <mbrown (at) fensystems.co.uk>.
      3  *
      4  * This program is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU General Public License as
      6  * published by the Free Software Foundation; either version 2 of the
      7  * License, or any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful, but
     10  * WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program; if not, write to the Free Software
     16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     17  */
     18 
     19 FILE_LICENCE ( GPL2_OR_LATER );
     20 
     21 #include <string.h>
     22 #include <stdio.h>
     23 #include <errno.h>
     24 #include <gpxe/process.h>
     25 #include <console.h>
     26 #include <gpxe/keys.h>
     27 #include <gpxe/job.h>
     28 #include <gpxe/monojob.h>
     29 #include <gpxe/timer.h>
     30 
     31 /** @file
     32  *
     33  * Single foreground job
     34  *
     35  */
     36 
     37 static int monojob_rc;
     38 
     39 static void monojob_done ( struct job_interface *job __unused, int rc ) {
     40 	monojob_rc = rc;
     41 }
     42 
     43 /** Single foreground job operations */
     44 static struct job_interface_operations monojob_operations = {
     45 	.done		= monojob_done,
     46 	.kill		= ignore_job_kill,
     47 	.progress	= ignore_job_progress,
     48 };
     49 
     50 /** Single foreground job */
     51 struct job_interface monojob = {
     52 	.intf = {
     53 		.dest = &null_job.intf,
     54 		.refcnt = NULL,
     55 	},
     56 	.op = &monojob_operations,
     57 };
     58 
     59 /**
     60  * Wait for single foreground job to complete
     61  *
     62  * @v string		Job description to display
     63  * @ret rc		Job final status code
     64  */
     65 int monojob_wait ( const char *string ) {
     66 	int key;
     67 	int rc;
     68 	unsigned long last_progress_dot;
     69 	unsigned long elapsed;
     70 
     71 	printf ( "%s.", string );
     72 	monojob_rc = -EINPROGRESS;
     73 	last_progress_dot = currticks();
     74 	while ( monojob_rc == -EINPROGRESS ) {
     75 		step();
     76 		if ( iskey() ) {
     77 			key = getchar();
     78 			switch ( key ) {
     79 			case CTRL_C:
     80 				job_kill ( &monojob );
     81 				rc = -ECANCELED;
     82 				goto done;
     83 			default:
     84 				break;
     85 			}
     86 		}
     87 		elapsed = ( currticks() - last_progress_dot );
     88 		if ( elapsed >= TICKS_PER_SEC ) {
     89 			printf ( "." );
     90 			last_progress_dot = currticks();
     91 		}
     92 	}
     93 	rc = monojob_rc;
     94 
     95 done:
     96 	job_done ( &monojob, rc );
     97 	if ( rc ) {
     98 		printf ( " %s\n", strerror ( rc ) );
     99 	} else {
    100 		printf ( " ok\n" );
    101 	}
    102 	return rc;
    103 }
    104