Skip to content

Commit

Permalink
[ping] Allow "ping" command output to be inhibited
Browse files Browse the repository at this point in the history
Originally-implemented-by: Cedric Levasseur <cyr-ius@ipocus.net>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Oct 23, 2014
1 parent 1c34ca7 commit dea6a6c
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 9 deletions.
8 changes: 5 additions & 3 deletions src/core/pinger.c
Expand Up @@ -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 */
Expand Down Expand Up @@ -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 )
Expand Down Expand Up @@ -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,
Expand Down
6 changes: 5 additions & 1 deletion src/hci/commands/ping_cmd.c
Expand Up @@ -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 */
Expand All @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/include/usr/pingmgmt.h
Expand Up @@ -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 */
10 changes: 6 additions & 4 deletions src/usr/pingmgmt.c
Expand Up @@ -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;
}

Expand Down

0 comments on commit dea6a6c

Please sign in to comment.