Browse Source

[ping] Add top-level ping() function to ping a host

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 11 years ago
parent
commit
de35167714
2 changed files with 97 additions and 0 deletions
  1. 16
    0
      src/include/usr/pingmgmt.h
  2. 81
    0
      src/usr/pingmgmt.c

+ 16
- 0
src/include/usr/pingmgmt.h View File

@@ -0,0 +1,16 @@
1
+#ifndef _USR_PINGMGMT_H
2
+#define _USR_PINGMGMT_H
3
+
4
+/** @file
5
+ *
6
+ * ICMP ping management
7
+ *
8
+ */
9
+
10
+FILE_LICENCE ( GPL2_OR_LATER );
11
+
12
+#include <stdint.h>
13
+
14
+extern int ping ( const char *hostname, unsigned long timeout_ms, size_t len );
15
+
16
+#endif /* _USR_PINGMGMT_H */

+ 81
- 0
src/usr/pingmgmt.c View File

@@ -0,0 +1,81 @@
1
+/*
2
+ * Copyright (C) 2013 Michael Brown <mbrown@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., 51 Franklin Street, Fifth Floor, Boston, MA
17
+ * 02110-1301, USA.
18
+ */
19
+
20
+FILE_LICENCE ( GPL2_OR_LATER );
21
+
22
+#include <stdint.h>
23
+#include <stdio.h>
24
+#include <string.h>
25
+#include <ipxe/pinger.h>
26
+#include <ipxe/monojob.h>
27
+#include <ipxe/timer.h>
28
+#include <usr/pingmgmt.h>
29
+
30
+/** @file
31
+ *
32
+ * ICMP ping management
33
+ *
34
+ */
35
+
36
+/**
37
+ * Display ping result
38
+ *
39
+ * @v src		Source socket address
40
+ * @v sequence		Sequence number
41
+ * @v len		Payload length
42
+ * @v rc		Status code
43
+ */
44
+static void ping_callback ( struct sockaddr *peer, unsigned int sequence,
45
+			    size_t len, int rc ) {
46
+
47
+	/* Display ping response */
48
+	printf ( "%zd bytes from %s: seq=%d",
49
+		 len, sock_ntoa ( peer ), sequence );
50
+	if ( rc != 0 )
51
+		printf ( ": %s", strerror ( rc ) );
52
+	printf ( "\n" );
53
+}
54
+
55
+/**
56
+ * Ping a host
57
+ *
58
+ * @v hostname		Hostname
59
+ * @v timeout_ms	Timeout between pings, in ms
60
+ * @v len		Payload length
61
+ * @ret rc		Return status code
62
+ */
63
+int ping ( const char *hostname, unsigned long timeout_ms, size_t len ) {
64
+	int rc;
65
+
66
+	/* Create pinger */
67
+	if ( ( rc = create_pinger ( &monojob, hostname,
68
+				    ( ( timeout_ms * TICKS_PER_SEC ) / 1000 ),
69
+				    len, ping_callback ) ) != 0 ) {
70
+		printf ( "Could not start ping: %s\n", strerror ( rc ) );
71
+		return rc;
72
+	}
73
+
74
+	/* Wait for ping to complete */
75
+	if ( ( rc = monojob_wait ( NULL ) ) != 0 ) {
76
+		printf ( "Finished: %s\n", strerror ( rc ) );
77
+		return rc;
78
+	}
79
+
80
+	return 0;
81
+}

Loading…
Cancel
Save