|
Packit |
4b6dd7 |
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
4b6dd7 |
/*
|
|
Packit |
4b6dd7 |
* GData Client
|
|
Packit |
4b6dd7 |
* Copyright © 2017 Philip Withnall <philip@tecnocode.co.uk>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is free software; you can redistribute it and/or
|
|
Packit |
4b6dd7 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License as published by the Free Software Foundation; either
|
|
Packit |
4b6dd7 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is distributed in the hope that it will be useful,
|
|
Packit |
4b6dd7 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4b6dd7 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4b6dd7 |
* Lesser General Public License for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License along with GData Client. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include <gdata/gdata.h>
|
|
Packit |
4b6dd7 |
#include <locale.h>
|
|
Packit |
4b6dd7 |
#include <string.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#define CLIENT_ID "1074795795536-necvslvs0pchk65nf6ju4i6mniogg8fr.apps.googleusercontent.com"
|
|
Packit |
4b6dd7 |
#define CLIENT_SECRET "8totRi50eo2Zfr3SD2DeNAzo"
|
|
Packit |
4b6dd7 |
#define REDIRECT_URI "urn:ietf:wg:oauth:2.0:oob"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
print_usage (char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Usage — %s <subcommand>\n"
|
|
Packit |
4b6dd7 |
"Subcommands:\n"
|
|
Packit |
4b6dd7 |
" tasklists\n"
|
|
Packit |
4b6dd7 |
" tasks <tasklist ID> [query string]\n",
|
|
Packit |
4b6dd7 |
argv[0], argv[0]);
|
|
Packit |
4b6dd7 |
return -1;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
print_tasklist (GDataTasksTasklist *tasklist)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *id, *title, *description;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
id = gdata_entry_get_id (GDATA_ENTRY (tasklist));
|
|
Packit |
4b6dd7 |
title = gdata_entry_get_title (GDATA_ENTRY (tasklist));
|
|
Packit |
4b6dd7 |
description = gdata_entry_get_summary (GDATA_ENTRY (tasklist));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("%s — %s\n", id, title);
|
|
Packit |
4b6dd7 |
g_print (" Description:\n %s\n", description);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("\n");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static const gchar *
|
|
Packit |
4b6dd7 |
format_status (const gchar *status)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (status, GDATA_TASKS_STATUS_NEEDS_ACTION) == 0)
|
|
Packit |
4b6dd7 |
return "needs action";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (status, GDATA_TASKS_STATUS_COMPLETED) == 0)
|
|
Packit |
4b6dd7 |
return "completed";
|
|
Packit |
4b6dd7 |
else
|
|
Packit |
4b6dd7 |
return status;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
print_task (GDataTasksTask *task)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *title, *id, *description, *parent_id, *position, *notes;
|
|
Packit |
4b6dd7 |
const gchar *status;
|
|
Packit |
4b6dd7 |
GTimeVal date_published_tv = { 0, };
|
|
Packit |
4b6dd7 |
gchar *date_published = NULL; /* owned */
|
|
Packit |
4b6dd7 |
GTimeVal due_tv = { 0, };
|
|
Packit |
4b6dd7 |
gchar *due = NULL; /* owned */
|
|
Packit |
4b6dd7 |
GTimeVal completed_tv = { 0, };
|
|
Packit |
4b6dd7 |
gchar *completed = NULL; /* owned */
|
|
Packit |
4b6dd7 |
gboolean is_deleted, is_hidden;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
title = gdata_entry_get_title (GDATA_ENTRY (task));
|
|
Packit |
4b6dd7 |
id = gdata_entry_get_id (GDATA_ENTRY (task));
|
|
Packit |
4b6dd7 |
description = gdata_entry_get_content (GDATA_ENTRY (task));
|
|
Packit |
4b6dd7 |
date_published_tv.tv_sec = gdata_entry_get_published (GDATA_ENTRY (task));
|
|
Packit |
4b6dd7 |
date_published = g_time_val_to_iso8601 (&date_published_tv);
|
|
Packit |
4b6dd7 |
parent_id = gdata_tasks_task_get_parent (task);
|
|
Packit |
4b6dd7 |
position = gdata_tasks_task_get_position (task);
|
|
Packit |
4b6dd7 |
notes = gdata_tasks_task_get_notes (task);
|
|
Packit |
4b6dd7 |
status = gdata_tasks_task_get_status (task);
|
|
Packit |
4b6dd7 |
due_tv.tv_sec = gdata_tasks_task_get_due (task);
|
|
Packit |
4b6dd7 |
due = g_time_val_to_iso8601 (&due_tv);
|
|
Packit |
4b6dd7 |
completed_tv.tv_sec = gdata_tasks_task_get_completed (task);
|
|
Packit |
4b6dd7 |
completed = g_time_val_to_iso8601 (&completed_tv);
|
|
Packit |
4b6dd7 |
is_deleted = gdata_tasks_task_is_deleted (task);
|
|
Packit |
4b6dd7 |
is_hidden = gdata_tasks_task_is_hidden (task);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("%s — %s\n", id, title);
|
|
Packit |
4b6dd7 |
g_print (" Published: %s\n", date_published_tv.tv_sec != 0 ? date_published : "unknown");
|
|
Packit |
4b6dd7 |
g_print (" Status: %s\n", format_status (status));
|
|
Packit |
4b6dd7 |
g_print (" Due: %s\n", due_tv.tv_sec != 0 ? due : "not set");
|
|
Packit |
4b6dd7 |
g_print (" Completed: %s\n", completed_tv.tv_sec != 0 ? completed : "not yet");
|
|
Packit |
4b6dd7 |
g_print (" Deleted? %s\n", is_deleted ? "Yes" : "No");
|
|
Packit |
4b6dd7 |
g_print (" Hidden? %s\n", is_hidden ? "Yes" : "No");
|
|
Packit |
4b6dd7 |
g_print (" Position: %s\n", position);
|
|
Packit |
4b6dd7 |
g_print (" Parent ID: %s\n", parent_id);
|
|
Packit |
4b6dd7 |
g_print (" Description:\n %s\n", description);
|
|
Packit |
4b6dd7 |
g_print (" Notes:\n %s\n", notes);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("\n");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (completed);
|
|
Packit |
4b6dd7 |
g_free (due);
|
|
Packit |
4b6dd7 |
g_free (date_published);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* FIXME: Factor all this code out of all the demos */
|
|
Packit |
4b6dd7 |
static GDataAuthorizer *
|
|
Packit |
4b6dd7 |
create_authorizer (GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataOAuth2Authorizer *authorizer = NULL; /* owned */
|
|
Packit |
4b6dd7 |
gchar *uri = NULL;
|
|
Packit |
4b6dd7 |
gchar code[100];
|
|
Packit |
4b6dd7 |
GError *child_error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Go through the interactive OAuth dance. */
|
|
Packit |
4b6dd7 |
authorizer = gdata_oauth2_authorizer_new (CLIENT_ID, CLIENT_SECRET,
|
|
Packit |
4b6dd7 |
REDIRECT_URI,
|
|
Packit |
4b6dd7 |
GDATA_TYPE_TASKS_SERVICE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Get an authentication URI */
|
|
Packit |
4b6dd7 |
uri = gdata_oauth2_authorizer_build_authentication_uri (authorizer,
|
|
Packit |
4b6dd7 |
NULL, FALSE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Wait for the user to retrieve and enter the verifier. */
|
|
Packit |
4b6dd7 |
g_print ("Please navigate to the following URI and grant access:\n"
|
|
Packit |
4b6dd7 |
" %s\n", uri);
|
|
Packit |
4b6dd7 |
g_print ("Enter verifier (EOF to abort): ");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (scanf ("%100s", code) != 1) {
|
|
Packit |
4b6dd7 |
/* User chose to abort. */
|
|
Packit |
4b6dd7 |
g_print ("\n");
|
|
Packit |
4b6dd7 |
g_clear_object (&authorizer);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Authorise the token. */
|
|
Packit |
4b6dd7 |
gdata_oauth2_authorizer_request_authorization (authorizer, code, NULL,
|
|
Packit |
4b6dd7 |
&child_error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (child_error != NULL) {
|
|
Packit |
4b6dd7 |
g_propagate_error (error, child_error);
|
|
Packit |
4b6dd7 |
g_clear_object (&authorizer);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return GDATA_AUTHORIZER (authorizer);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* List all the user’s task-lists. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_tasklists (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataTasksService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataTasksQuery *query = NULL;
|
|
Packit |
4b6dd7 |
GDataFeed *feed = NULL;
|
|
Packit |
4b6dd7 |
GList/*<unowned GDataTasksTasklist>*/ *entries;
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
GDataAuthorizer *authorizer = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc != 2) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Authenticate and create a service. */
|
|
Packit |
4b6dd7 |
authorizer = create_authorizer (&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error authenticating: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
} else if (authorizer == NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: User chose to abort authentication.\n",
|
|
Packit |
4b6dd7 |
argv[0]);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_tasks_service_new (authorizer);
|
|
Packit |
4b6dd7 |
query = gdata_tasks_query_new (NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
feed = gdata_tasks_service_query_all_tasklists (service,
|
|
Packit |
4b6dd7 |
GDATA_QUERY (query),
|
|
Packit |
4b6dd7 |
NULL, NULL,
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error querying tasklists: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print results. */
|
|
Packit |
4b6dd7 |
for (entries = gdata_feed_get_entries (feed); entries != NULL;
|
|
Packit |
4b6dd7 |
entries = entries->next) {
|
|
Packit |
4b6dd7 |
GDataTasksTasklist *tasklist;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
tasklist = GDATA_TASKS_TASKLIST (entries->data);
|
|
Packit |
4b6dd7 |
print_tasklist (tasklist);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("Total of %u results.\n",
|
|
Packit |
4b6dd7 |
g_list_length (gdata_feed_get_entries (feed)));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&feed);
|
|
Packit |
4b6dd7 |
g_clear_object (&query);
|
|
Packit |
4b6dd7 |
g_clear_object (&authorizer);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Query the tasks in a tasklist. */
|
|
Packit |
4b6dd7 |
static int
|
|
Packit |
4b6dd7 |
command_tasks (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataTasksService *service = NULL;
|
|
Packit |
4b6dd7 |
GDataTasksTasklist *tasklist = NULL;
|
|
Packit |
4b6dd7 |
GDataTasksQuery *query = NULL;
|
|
Packit |
4b6dd7 |
GError *error = NULL;
|
|
Packit |
4b6dd7 |
gint retval = 0;
|
|
Packit |
4b6dd7 |
const gchar *query_string, *tasklist_id;
|
|
Packit |
4b6dd7 |
GDataAuthorizer *authorizer = NULL;
|
|
Packit |
4b6dd7 |
guint n_results;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 3) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
tasklist_id = argv[2];
|
|
Packit |
4b6dd7 |
query_string = (argc > 3) ? argv[3] : NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Authenticate and create a service. */
|
|
Packit |
4b6dd7 |
authorizer = create_authorizer (&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error authenticating: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
} else if (authorizer == NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: User chose to abort authentication.\n",
|
|
Packit |
4b6dd7 |
argv[0]);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service = gdata_tasks_service_new (authorizer);
|
|
Packit |
4b6dd7 |
query = gdata_tasks_query_new (query_string);
|
|
Packit |
4b6dd7 |
gdata_query_set_max_results (GDATA_QUERY (query), 10);
|
|
Packit |
4b6dd7 |
tasklist = gdata_tasks_tasklist_new (tasklist_id);
|
|
Packit |
4b6dd7 |
n_results = 0;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
while (TRUE) {
|
|
Packit |
4b6dd7 |
GList/*<unowned GDataTasksTask>*/ *entries, *l;
|
|
Packit |
4b6dd7 |
GDataFeed *feed = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
feed = gdata_tasks_service_query_tasks (service, tasklist,
|
|
Packit |
4b6dd7 |
GDATA_QUERY (query),
|
|
Packit |
4b6dd7 |
NULL, NULL, NULL,
|
|
Packit |
4b6dd7 |
&error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (error != NULL) {
|
|
Packit |
4b6dd7 |
g_printerr ("%s: Error querying tasks: %s\n",
|
|
Packit |
4b6dd7 |
argv[0], error->message);
|
|
Packit |
4b6dd7 |
g_error_free (error);
|
|
Packit |
4b6dd7 |
retval = 1;
|
|
Packit |
4b6dd7 |
goto done;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Print results. */
|
|
Packit |
4b6dd7 |
entries = gdata_feed_get_entries (feed);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (entries == NULL) {
|
|
Packit |
4b6dd7 |
retval = 0;
|
|
Packit |
4b6dd7 |
g_object_unref (feed);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (l = entries; l != NULL; l = l->next) {
|
|
Packit |
4b6dd7 |
GDataTasksTask *task;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
task = GDATA_TASKS_TASK (l->data);
|
|
Packit |
4b6dd7 |
print_task (task);
|
|
Packit |
4b6dd7 |
n_results++;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gdata_query_next_page (GDATA_QUERY (query));
|
|
Packit |
4b6dd7 |
g_object_unref (feed);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_print ("Total of %u results.\n", n_results);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
done:
|
|
Packit |
4b6dd7 |
g_clear_object (&query);
|
|
Packit |
4b6dd7 |
g_clear_object (&authorizer);
|
|
Packit |
4b6dd7 |
g_clear_object (&tasklist);
|
|
Packit |
4b6dd7 |
g_clear_object (&service);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static const struct {
|
|
Packit |
4b6dd7 |
const gchar *command;
|
|
Packit |
4b6dd7 |
int (*handler_fn) (int argc, char **argv);
|
|
Packit |
4b6dd7 |
} command_handlers[] = {
|
|
Packit |
4b6dd7 |
{ "tasklists", command_tasklists },
|
|
Packit |
4b6dd7 |
{ "tasks", command_tasks },
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
int
|
|
Packit |
4b6dd7 |
main (int argc, char *argv[])
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
guint i;
|
|
Packit |
4b6dd7 |
gint retval = -1;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
setlocale (LC_ALL, "");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (argc < 2) {
|
|
Packit |
4b6dd7 |
return print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0; i < G_N_ELEMENTS (command_handlers); i++) {
|
|
Packit |
4b6dd7 |
if (strcmp (argv[1], command_handlers[i].command) == 0) {
|
|
Packit |
4b6dd7 |
retval = command_handlers[i].handler_fn (argc, argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (retval == -1) {
|
|
Packit |
4b6dd7 |
retval = print_usage (argv);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return retval;
|
|
Packit |
4b6dd7 |
}
|