]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[ping] Allow "ping" command output to be inhibited
authorMichael Brown <mcb30@ipxe.org>
Thu, 23 Oct 2014 15:52:08 +0000 (16:52 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 23 Oct 2014 15:52:08 +0000 (16:52 +0100)
Originally-implemented-by: Cedric Levasseur <cyr-ius@ipocus.net>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/pinger.c
src/hci/commands/ping_cmd.c
src/include/usr/pingmgmt.h
src/usr/pingmgmt.c

index 558cfb49abed8bee110022b2b189f64ce5b15ac0..31ea2ce1c5d03bf38fca105241d32597d3a5dd8f 100644 (file)
@@ -166,7 +166,7 @@ static void pinger_expired ( struct retry_timer *timer, int over __unused ) {
        int rc;
 
        /* If no response has been received, notify the callback function */
-       if ( pinger->pending )
+       if ( pinger->pending && pinger->callback )
                pinger->callback ( NULL, pinger->sequence, 0, -ETIMEDOUT );
 
        /* Check for termination */
@@ -263,8 +263,9 @@ static int pinger_deliver ( struct pinger *pinger, struct io_buffer *iobuf,
        /* Discard I/O buffer */
        free_iob ( iobuf );
 
-       /* Notify callback function */
-       pinger->callback ( meta->src, sequence, len, rc );
+       /* Notify callback function, if applicable */
+       if ( pinger->callback )
+               pinger->callback ( meta->src, sequence, len, rc );
 
        /* Terminate if applicable */
        if ( terminate )
@@ -301,6 +302,7 @@ static struct interface_descriptor pinger_job_desc =
  * @v timeout          Timeout (in ticks)
  * @v len              Payload length
  * @v count            Number of packets to send (or zero for no limit)
+ * @v callback         Callback function (or NULL)
  * @ret rc             Return status code
  */
 int create_pinger ( struct interface *job, const char *hostname,
index 92c5443a914bddb13435d9be54f35c68e387e970..34807696f4bc144e2059d109fb38a24cac320051 100644 (file)
@@ -50,6 +50,8 @@ struct ping_options {
        unsigned long timeout;
        /** Number of packets to send (or zero for no limit) */
        unsigned int count;
+       /** Inhibit output */
+       int quiet;
 };
 
 /** "ping" option list */
@@ -60,6 +62,8 @@ static struct option_descriptor ping_opts[] = {
                      struct ping_options, timeout, parse_timeout ),
        OPTION_DESC ( "count", 'c', required_argument,
                      struct ping_options, count, parse_integer ),
+       OPTION_DESC ( "quiet", 'q', no_argument,
+                     struct ping_options, quiet, parse_flag ),
 };
 
 /** "ping" command descriptor */
@@ -92,7 +96,7 @@ static int ping_exec ( int argc, char **argv ) {
 
        /* Ping */
        if ( ( rc = ping ( hostname, opts.timeout, opts.size,
-                          opts.count ) ) != 0 )
+                          opts.count, opts.quiet ) ) != 0 )
                return rc;
 
        return 0;
index 8bded38491686693985ba52f1d620c5c05e17e89..d4c2d6cd59ff3e4795a87f5eacee1cbf224f329d 100644 (file)
@@ -12,6 +12,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <stdint.h>
 
 extern int ping ( const char *hostname, unsigned long timeout, size_t len,
-                 unsigned int count );
+                 unsigned int count, int quiet );
 
 #endif /* _USR_PINGMGMT_H */
index f8366f26fab5724a98204a4c7e61cc72e1cdb6ad..16b3ec9947304f788cf00639cdecf61fa32975c0 100644 (file)
@@ -59,22 +59,24 @@ static void ping_callback ( struct sockaddr *peer, unsigned int sequence,
  * @v timeout          Timeout between pings, in ticks
  * @v len              Payload length
  * @v count            Number of packets to send (or zero for no limit)
+ * @v quiet            Inhibit output
  * @ret rc             Return status code
  */
 int ping ( const char *hostname, unsigned long timeout, size_t len,
-          unsigned int count ) {
+          unsigned int count, int quiet ) {
        int rc;
 
        /* Create pinger */
-       if ( ( rc = create_pinger ( &monojob, hostname, timeout, len,
-                                   count, ping_callback ) ) != 0 ) {
+       if ( ( rc = create_pinger ( &monojob, hostname, timeout, len, count,
+                                   ( quiet ? NULL : ping_callback ) ) ) != 0 ){
                printf ( "Could not start ping: %s\n", strerror ( rc ) );
                return rc;
        }
 
        /* Wait for ping to complete */
        if ( ( rc = monojob_wait ( NULL, 0 ) ) != 0 ) {
-               printf ( "Finished: %s\n", strerror ( rc ) );
+               if ( ! quiet )
+                       printf ( "Finished: %s\n", strerror ( rc ) );
                return rc;
        }