mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:37:45 +00:00
host: Use ArgsParser to parse arguments, and add man page (#1252)
Fixes #1246.
This commit is contained in:
parent
088d7be19c
commit
83668299a6
2 changed files with 36 additions and 10 deletions
25
Base/usr/share/man/man1/host.md
Normal file
25
Base/usr/share/man/man1/host.md
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
## Name
|
||||||
|
|
||||||
|
host - DNS lookup utility
|
||||||
|
|
||||||
|
## Synopsis
|
||||||
|
|
||||||
|
```**sh
|
||||||
|
$ host <name>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
`host` is a simple utility for performing DNS lookups. It is used to
|
||||||
|
convert names to IP addresses and vice versa.
|
||||||
|
|
||||||
|
`name` is the domain name that is to be looked up. It can also be a
|
||||||
|
dotted-decimal IPv4 address, in which case `host` will perform a reverse
|
||||||
|
lookup for that address.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ host github.com
|
||||||
|
$ host 8.8.8.8
|
||||||
|
```
|
|
@ -24,6 +24,7 @@
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <LibCore/ArgsParser.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
@ -38,37 +39,37 @@ int main(int argc, char** argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc < 2) {
|
const char* name_or_ip = nullptr;
|
||||||
printf("usage: host <hostname>\n");
|
Core::ArgsParser args_parser;
|
||||||
return 0;
|
args_parser.add_positional_argument(name_or_ip, "Domain name or IPv4 address", "name");
|
||||||
}
|
args_parser.parse(argc, argv);
|
||||||
|
|
||||||
// If input looks like an IPv4 address, we should do a reverse lookup.
|
// If input looks like an IPv4 address, we should do a reverse lookup.
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
addr.sin_family = AF_INET;
|
addr.sin_family = AF_INET;
|
||||||
addr.sin_port = htons(53);
|
addr.sin_port = htons(53);
|
||||||
int rc = inet_pton(AF_INET, argv[1], &addr.sin_addr);
|
int rc = inet_pton(AF_INET, name_or_ip, &addr.sin_addr);
|
||||||
if (rc == 1) {
|
if (rc == 1) {
|
||||||
// Okay, let's do a reverse lookup.
|
// Okay, let's do a reverse lookup.
|
||||||
auto* hostent = gethostbyaddr(&addr.sin_addr, sizeof(in_addr), AF_INET);
|
auto* hostent = gethostbyaddr(&addr.sin_addr, sizeof(in_addr), AF_INET);
|
||||||
if (!hostent) {
|
if (!hostent) {
|
||||||
fprintf(stderr, "Reverse lookup failed for '%s'\n", argv[1]);
|
fprintf(stderr, "Reverse lookup failed for '%s'\n", name_or_ip);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
printf("%s is %s\n", argv[1], hostent->h_name);
|
printf("%s is %s\n", name_or_ip, hostent->h_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* hostent = gethostbyname(argv[1]);
|
auto* hostent = gethostbyname(name_or_ip);
|
||||||
if (!hostent) {
|
if (!hostent) {
|
||||||
fprintf(stderr, "Lookup failed for '%s'\n", argv[1]);
|
fprintf(stderr, "Lookup failed for '%s'\n", name_or_ip);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
const char* ip_str = inet_ntop(AF_INET, hostent->h_addr_list[0], buffer, sizeof(buffer));
|
const char* ip_str = inet_ntop(AF_INET, hostent->h_addr_list[0], buffer, sizeof(buffer));
|
||||||
|
|
||||||
printf("%s is %s\n", argv[1], ip_str);
|
printf("%s is %s\n", name_or_ip, ip_str);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue