blob: 2812d8516f2ad71c8e92da85a8dd75227555c392 [file] [edit]
/*
*
* Copyright (c) 2016 Nest Labs, Inc.
* All rights reserved.
*
* This document is the property of Nest. It is considered
* confidential and proprietary information.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Nest.
*
*/
#if HAVE_CONFIG_H
#include <config.h>
#endif
#include <getopt.h>
#include "wpanctl-utils.h"
#include "tool-cmd-ping.h"
#include "assert-macros.h"
#include "args.h"
#include "assert-macros.h"
#include "wpan-dbus-v0.h"
const char ping_cmd_syntax[] = "[args]";
static const arg_list_item_t ping_option_list[] = {
{'h', "help", NULL, "Print Help"},
{'t', "timeout", "ms", "Set timeout period"},
{0}
};
int tool_cmd_ping(int argc, char *argv[])
{
int ret = 0;
int c;
int timeout = 10 * 1000;
DBusConnection* connection = NULL;
DBusMessage *message = NULL;
DBusMessage *reply = NULL;
DBusError error;
dbus_error_init(&error);
while (1) {
static struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"timeout", required_argument, 0, 't'},
{0, 0, 0, 0}
};
int option_index = 0;
c = getopt_long(argc, argv, "ht:", long_options, &option_index);
if (c == -1)
break;
switch (c) {
case 'h':
print_arg_list_help(ping_option_list, argv[0],
ping_cmd_syntax);
ret = ERRORCODE_HELP;
goto bail;
case 't':
timeout = strtol(optarg, NULL, 0);
break;
}
}
if (optind < argc) {
fprintf(stderr,
"%s: error: Unexpected extra argument: \"%s\"\n",
argv[0], argv[optind]);
ret = ERRORCODE_BADARG;
goto bail;
}
if (gInterfaceName[0] == 0) {
fprintf(stderr,
"%s: error: No WPAN interface set (use the `cd` command, or the `-I` argument for `wpanctl`).\n",
argv[0]);
ret = ERRORCODE_BADARG;
goto bail;
}
connection = dbus_bus_get(DBUS_BUS_STARTER, &error);
if (!connection) {
dbus_error_free(&error);
dbus_error_init(&error);
connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
}
require_string(connection != NULL, bail, error.message);
{
DBusMessageIter iter;
DBusMessageIter list_iter;
char path[DBUS_MAXIMUM_NAME_LENGTH+1];
char interface_dbus_name[DBUS_MAXIMUM_NAME_LENGTH+1];
ret = lookup_dbus_name_from_interface(interface_dbus_name, gInterfaceName);
if (ret != 0) {
goto bail;
}
snprintf(path,
sizeof(path),
"%s/%s",
WPAN_TUNNEL_DBUS_PATH,
gInterfaceName);
message = dbus_message_new_method_call(
interface_dbus_name,
path,
WPAN_TUNNEL_DBUS_INTERFACE,
WPAN_IFACE_CMD_PING
);
reply = dbus_connection_send_with_reply_and_block(
connection,
message,
timeout,
&error
);
if (!reply) {
fprintf(stderr, "%s: error: %s\n", argv[0], error.message);
ret = ERRORCODE_TIMEOUT;
goto bail;
}
dbus_message_get_args(reply, &error,
DBUS_TYPE_INT32, &ret,
DBUS_TYPE_INVALID
);
if (ret == 6)
ret = 0;
if (ret) {
fprintf(stderr, "%s failed with error %d. %s\n", argv[0], ret, wpantund_status_to_cstr(ret));
print_error_diagnosis(ret);
}
}
bail:
if (connection)
dbus_connection_unref(connection);
if (message)
dbus_message_unref(message);
if (reply)
dbus_message_unref(reply);
dbus_error_free(&error);
return ret;
}