1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
27c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington/* dbus-send.c  Utility program to send messages from the command line
37c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington *
47c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * Copyright (C) 2003 Philip Blundell <philb@gnu.org>
57c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington *
67c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * This program is free software; you can redistribute it and/or modify
77c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * it under the terms of the GNU General Public License as published by
87c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * the Free Software Foundation; either version 2 of the License, or
97c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * (at your option) any later version.
107c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington *
117c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * This program is distributed in the hope that it will be useful,
127c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
137c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
147c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * GNU General Public License for more details.
157c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington *
167c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * You should have received a copy of the GNU General Public License
177c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington * along with this program; if not, write to the Free Software
185baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
197c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington *
207c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington */
217c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
22572ae0a7d4c8bc7849422f948eb9cc6239bed4c1Ralf Habacker#include <config.h>
237c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington#include <stdio.h>
247c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington#include <stdlib.h>
257c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington#include <string.h>
267c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
277c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington#include <dbus/dbus.h>
287c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
295e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#ifndef HAVE_STRTOLL
305e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#undef strtoll
315e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#define strtoll mystrtoll
325e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#include "strtoll.c"
335e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#endif
345e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann
355e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#ifndef HAVE_STRTOULL
365e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#undef strtoull
375e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#define strtoull mystrtoull
385e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#include "strtoull.c"
395e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann#endif
405e4ef80e098c950fa394092060eb311babbe7035Marcus Brinkmann
41f041773df2b0db3f7e1a8a617302a5607765e8a3Marcus Brinkmann#ifdef DBUS_WINCE
42f041773df2b0db3f7e1a8a617302a5607765e8a3Marcus Brinkmann#ifndef strdup
43f041773df2b0db3f7e1a8a617302a5607765e8a3Marcus Brinkmann#define strdup _strdup
44f041773df2b0db3f7e1a8a617302a5607765e8a3Marcus Brinkmann#endif
45f041773df2b0db3f7e1a8a617302a5607765e8a3Marcus Brinkmann#endif
46f041773df2b0db3f7e1a8a617302a5607765e8a3Marcus Brinkmann
47306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington#include "dbus-print-message.h"
48306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington
493fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Waltersstatic const char *appname;
503fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
517c434a849a161c4514f3759659ac7af9ecddc721Havoc Penningtonstatic void
523fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Waltersusage (int ecode)
537c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington{
5414afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger  fprintf (stderr, "Usage: %s [--help] [--system | --session | --address=ADDRESS] [--dest=NAME] [--type=TYPE] [--print-reply=(literal)] [--reply-timeout=MSEC] <destination object path> <message name> [contents ...]\n", appname);
55fc5e3a06cf4876fb10d0205a626e51109f29eb82Colin Walters  exit (ecode);
567c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington}
577c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
583fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Waltersstatic void
593fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Waltersappend_arg (DBusMessageIter *iter, int type, const char *value)
603fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters{
61955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  dbus_uint16_t uint16;
62955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  dbus_int16_t int16;
633fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  dbus_uint32_t uint32;
643fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  dbus_int32_t int32;
65955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  dbus_uint64_t uint64;
66955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  dbus_int64_t int64;
673fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  double d;
683fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  unsigned char byte;
693fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  dbus_bool_t v_BOOLEAN;
703fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
713fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  /* FIXME - we are ignoring OOM returns on all these functions */
723fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  switch (type)
733fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    {
743fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    case DBUS_TYPE_BYTE:
753fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      byte = strtoul (value, NULL, 0);
763fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      dbus_message_iter_append_basic (iter, DBUS_TYPE_BYTE, &byte);
773fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      break;
783fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
793fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    case DBUS_TYPE_DOUBLE:
803fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      d = strtod (value, NULL);
813fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      dbus_message_iter_append_basic (iter, DBUS_TYPE_DOUBLE, &d);
823fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      break;
833fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
84955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    case DBUS_TYPE_INT16:
85955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      int16 = strtol (value, NULL, 0);
86955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      dbus_message_iter_append_basic (iter, DBUS_TYPE_INT16, &int16);
87955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      break;
88955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen
89955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    case DBUS_TYPE_UINT16:
90955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      uint16 = strtoul (value, NULL, 0);
91955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT16, &uint16);
92955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      break;
93955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen
943fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    case DBUS_TYPE_INT32:
953fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      int32 = strtol (value, NULL, 0);
963fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &int32);
973fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      break;
983fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
993fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    case DBUS_TYPE_UINT32:
1003fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      uint32 = strtoul (value, NULL, 0);
1013fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT32, &uint32);
1023fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      break;
1033fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
104955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    case DBUS_TYPE_INT64:
105955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      int64 = strtoll (value, NULL, 0);
106955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      dbus_message_iter_append_basic (iter, DBUS_TYPE_INT64, &int64);
107955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      break;
108955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen
109955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    case DBUS_TYPE_UINT64:
110955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      uint64 = strtoull (value, NULL, 0);
111955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT64, &uint64);
112955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen      break;
113955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen
1143fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    case DBUS_TYPE_STRING:
1153fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &value);
1163fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      break;
1173fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
1183fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    case DBUS_TYPE_OBJECT_PATH:
1193fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      dbus_message_iter_append_basic (iter, DBUS_TYPE_OBJECT_PATH, &value);
1203fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      break;
1213fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
1223fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    case DBUS_TYPE_BOOLEAN:
1233fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      if (strcmp (value, "true") == 0)
1243fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	{
1253fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  v_BOOLEAN = TRUE;
1263fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  dbus_message_iter_append_basic (iter, DBUS_TYPE_BOOLEAN, &v_BOOLEAN);
1273fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	}
1283fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      else if (strcmp (value, "false") == 0)
1293fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	{
1303fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  v_BOOLEAN = FALSE;
1313fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  dbus_message_iter_append_basic (iter, DBUS_TYPE_BOOLEAN, &v_BOOLEAN);
1323fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	}
1333fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      else
1343fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	{
1353fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  fprintf (stderr, "%s: Expected \"true\" or \"false\" instead of \"%s\"\n", appname, value);
1363fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  exit (1);
1373fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	}
1383fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      break;
1393fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
1403fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    default:
1413fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      fprintf (stderr, "%s: Unsupported data type %c\n", appname, (char) type);
1423fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      exit (1);
1433fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    }
1443fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters}
1453fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
1463fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Waltersstatic void
1473fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Waltersappend_array (DBusMessageIter *iter, int type, const char *value)
1483fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters{
14970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  const char *val;
15070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  char *dupval = strdup (value);
1513fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
15270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  val = strtok (dupval, ",");
15370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  while (val != NULL)
1543fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    {
15570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      append_arg (iter, type, val);
15670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      val = strtok (NULL, ",");
1573fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    }
15870bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  free (dupval);
15970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters}
16070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters
16170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Waltersstatic void
16270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Waltersappend_dict (DBusMessageIter *iter, int keytype, int valtype, const char *value)
16370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters{
16470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  const char *val;
16570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  char *dupval = strdup (value);
16670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters
16770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  val = strtok (dupval, ",");
16870bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  while (val != NULL)
16970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    {
17070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      DBusMessageIter subiter;
171d7446ac003f63aca29624b42b55f13b64e19a77fJohn (J
17270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      dbus_message_iter_open_container (iter,
17370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters					DBUS_TYPE_DICT_ENTRY,
174d7446ac003f63aca29624b42b55f13b64e19a77fJohn (J					NULL,
17570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters					&subiter);
17670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters
17770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      append_arg (&subiter, keytype, val);
17870bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      val = strtok (NULL, ",");
17970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      if (val == NULL)
18070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	{
18170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  fprintf (stderr, "%s: Malformed dictionary\n", appname);
18270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  exit (1);
18370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	}
18470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      append_arg (&subiter, valtype, val);
18570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters
18670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      dbus_message_iter_close_container (iter, &subiter);
18770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      val = strtok (NULL, ",");
18870bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    }
18970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  free (dupval);
19070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters}
19170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters
19270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Waltersstatic int
19370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walterstype_from_name (const char *arg)
19470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters{
19570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  int type;
19670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  if (!strcmp (arg, "string"))
19770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    type = DBUS_TYPE_STRING;
198955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  else if (!strcmp (arg, "int16"))
199955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    type = DBUS_TYPE_INT16;
200955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  else if (!strcmp (arg, "uint16"))
201955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    type = DBUS_TYPE_UINT16;
20270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  else if (!strcmp (arg, "int32"))
20370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    type = DBUS_TYPE_INT32;
20470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  else if (!strcmp (arg, "uint32"))
20570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    type = DBUS_TYPE_UINT32;
206955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  else if (!strcmp (arg, "int64"))
207955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    type = DBUS_TYPE_INT64;
208955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen  else if (!strcmp (arg, "uint64"))
209955cc78770c03edd9b88d5d73ba53901016ddf60David Zeuthen    type = DBUS_TYPE_UINT64;
21070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  else if (!strcmp (arg, "double"))
21170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    type = DBUS_TYPE_DOUBLE;
21270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  else if (!strcmp (arg, "byte"))
21370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    type = DBUS_TYPE_BYTE;
21470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  else if (!strcmp (arg, "boolean"))
21570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    type = DBUS_TYPE_BOOLEAN;
21670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  else if (!strcmp (arg, "objpath"))
21770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    type = DBUS_TYPE_OBJECT_PATH;
21870bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  else
21970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    {
22070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      fprintf (stderr, "%s: Unknown type \"%s\"\n", appname, arg);
22170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      exit (1);
22270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters    }
22370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters  return type;
2243fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters}
2253fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
2267c434a849a161c4514f3759659ac7af9ecddc721Havoc Penningtonint
2277c434a849a161c4514f3759659ac7af9ecddc721Havoc Penningtonmain (int argc, char *argv[])
2287c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington{
2297c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  DBusConnection *connection;
2307c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  DBusError error;
2317c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  DBusMessage *message;
232306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington  int print_reply;
2332ca6e95764dc3491458dcf077ce77cbbabf00ddfColin Walters  int print_reply_literal;
234fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters  int reply_timeout;
2357c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  DBusMessageIter iter;
2367c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  int i;
237fc5e3a06cf4876fb10d0205a626e51109f29eb82Colin Walters  DBusBusType type = DBUS_BUS_SESSION;
238a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  const char *dest = NULL;
2395fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  const char *name = NULL;
2405fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  const char *path = NULL;
241b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  int message_type = DBUS_MESSAGE_TYPE_SIGNAL;
242b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  const char *type_str = NULL;
24314afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger  const char *address = NULL;
24414afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger  int session_or_system = FALSE;
2453fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
2463fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters  appname = argv[0];
247b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
2485fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  if (argc < 3)
2493fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    usage (1);
2507c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
251306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington  print_reply = FALSE;
2522ca6e95764dc3491458dcf077ce77cbbabf00ddfColin Walters  print_reply_literal = FALSE;
253fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters  reply_timeout = -1;
254306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington
2557c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  for (i = 1; i < argc && name == NULL; i++)
2567c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    {
2577c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      char *arg = argv[i];
2587c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
259fc5e3a06cf4876fb10d0205a626e51109f29eb82Colin Walters      if (strcmp (arg, "--system") == 0)
26014afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger        {
26114afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger	  type = DBUS_BUS_SYSTEM;
26214afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger          session_or_system = TRUE;
26314afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger        }
264e94493fc116955bbf72a8896c48f2c119efacf7fAnders Carlsson      else if (strcmp (arg, "--session") == 0)
26514afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger        {
26614afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger	  type = DBUS_BUS_SESSION;
26714afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger          session_or_system = TRUE;
26814afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger        }
26914afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger      else if (strstr (arg, "--address") == arg)
27014afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger        {
27114afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger          address = strchr (arg, '=');
27214afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger
27314afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger          if (address == NULL)
27414afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger            {
27514afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger              fprintf (stderr, "\"--address=\" requires an ADDRESS\n");
27614afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger              usage (1);
27714afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger            }
27814afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger          else
27914afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger            {
28014afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger              address = address + 1;
28114afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger            }
28214afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger        }
2832ca6e95764dc3491458dcf077ce77cbbabf00ddfColin Walters      else if (strncmp (arg, "--print-reply", 13) == 0)
284a221eefadfb48488129dedca2f2dc062e1c718e7Havoc Pennington	{
285a221eefadfb48488129dedca2f2dc062e1c718e7Havoc Pennington	  print_reply = TRUE;
286a221eefadfb48488129dedca2f2dc062e1c718e7Havoc Pennington	  message_type = DBUS_MESSAGE_TYPE_METHOD_CALL;
2872ca6e95764dc3491458dcf077ce77cbbabf00ddfColin Walters	  if (*(arg + 13) != '\0')
2882ca6e95764dc3491458dcf077ce77cbbabf00ddfColin Walters	    print_reply_literal = TRUE;
289a221eefadfb48488129dedca2f2dc062e1c718e7Havoc Pennington	}
290fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters      else if (strstr (arg, "--reply-timeout=") == arg)
291fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters	{
292fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters	  reply_timeout = strtol (strchr (arg, '=') + 1,
293fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters				  NULL, 10);
294fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters	}
2957c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      else if (strstr (arg, "--dest=") == arg)
2967c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	dest = strchr (arg, '=') + 1;
297b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      else if (strstr (arg, "--type=") == arg)
298b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington	type_str = strchr (arg, '=') + 1;
299fc5e3a06cf4876fb10d0205a626e51109f29eb82Colin Walters      else if (!strcmp(arg, "--help"))
3003fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	usage (0);
3017c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      else if (arg[0] == '-')
3023fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	usage (1);
3035fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington      else if (path == NULL)
3045fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington        path = arg;
3055fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington      else if (name == NULL)
3065fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington        name = arg;
3077c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      else
3083fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters        usage (1);
3097c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    }
3107c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
3117c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  if (name == NULL)
3123fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters    usage (1);
3137c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
31414afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger  if (session_or_system &&
31514afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger      (address != NULL))
31614afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger    {
31714afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger      fprintf (stderr, "\"--address\" may not be used with \"--system\" or \"--session\"\n");
31814afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger      usage (1);
31914afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger    }
32014afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger
321b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (type_str != NULL)
322b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    {
3236a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington      message_type = dbus_message_type_from_string (type_str);
3246a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington      if (!(message_type == DBUS_MESSAGE_TYPE_METHOD_CALL ||
3256a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington            message_type == DBUS_MESSAGE_TYPE_SIGNAL))
326b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington        {
327b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington          fprintf (stderr, "Message type \"%s\" is not supported\n",
328b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington                   type_str);
329b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington          exit (1);
330b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington        }
331b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    }
332b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
3337c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  dbus_error_init (&error);
33414afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger
33514afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger  if (address != NULL)
33614afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger    {
33714afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger      connection = dbus_connection_open (address, &error);
33814afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger    }
33914afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger  else
34014afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger    {
34114afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger      connection = dbus_bus_get (type, &error);
34214afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger    }
34314afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger
3447c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  if (connection == NULL)
3457c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    {
34614afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger      fprintf (stderr, "Failed to open connection to \"%s\" message bus: %s\n",
34714afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger               (address != NULL) ? address :
34814afa0564e9eea01d28d4b2fd1e6ac0bfec626e7Lawrence R. Steeger                 ((type == DBUS_BUS_SYSTEM) ? "system" : "session"),
3497c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington               error.message);
3507c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      dbus_error_free (&error);
3517c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      exit (1);
3527c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    }
3537c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
354b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (message_type == DBUS_MESSAGE_TYPE_METHOD_CALL)
355b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    {
35668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      char *last_dot;
35768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
35868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      last_dot = strrchr (name, '.');
35968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (last_dot == NULL)
36068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington        {
36168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          fprintf (stderr, "Must use org.mydomain.Interface.Method notation, no dot in \"%s\"\n",
36268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                   name);
36368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          exit (1);
36468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington        }
36568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      *last_dot = '\0';
36668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
3675fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington      message = dbus_message_new_method_call (NULL,
3685fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                              path,
3695fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                              name,
3705fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                              last_dot + 1);
37170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      dbus_message_set_auto_start (message, TRUE);
372b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    }
373b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  else if (message_type == DBUS_MESSAGE_TYPE_SIGNAL)
374b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    {
37568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      char *last_dot;
37668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
37768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      last_dot = strrchr (name, '.');
37868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (last_dot == NULL)
37968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington        {
38068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          fprintf (stderr, "Must use org.mydomain.Interface.Signal notation, no dot in \"%s\"\n",
38168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                   name);
38268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          exit (1);
38368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington        }
38468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      *last_dot = '\0';
38568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
3865fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington      message = dbus_message_new_signal (path, name, last_dot + 1);
387b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    }
388b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  else
389b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    {
390b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      fprintf (stderr, "Internal error, unknown message type\n");
391b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      exit (1);
392b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    }
393b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
3947c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  if (message == NULL)
3957c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    {
3967652304bff969afb3969603149bb385efe861fe8John (J      fprintf (stderr, "Couldn't allocate D-Bus message\n");
3977c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      exit (1);
3987c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    }
3997c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
400b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (dest && !dbus_message_set_destination (message, dest))
401b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    {
402b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      fprintf (stderr, "Not enough memory\n");
403b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      exit (1);
404b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington    }
405b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington
40631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington  dbus_message_iter_init_append (message, &iter);
4077c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
4087c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  while (i < argc)
4097c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    {
4107c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      char *arg;
4117c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      char *c;
4127c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      int type;
41370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      int secondary_type;
4143fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      int container_type;
4153fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      DBusMessageIter *target_iter;
4163fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      DBusMessageIter container_iter;
4177c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
4187c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      type = DBUS_TYPE_INVALID;
4197c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      arg = argv[i++];
4207c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      c = strchr (arg, ':');
4217c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
4227c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      if (c == NULL)
4237c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	{
4247c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	  fprintf (stderr, "%s: Data item \"%s\" is badly formed\n", argv[0], arg);
4257c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	  exit (1);
4267c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	}
4277c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
4287c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      *(c++) = 0;
4297c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
4303fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      container_type = DBUS_TYPE_INVALID;
4313fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
4323fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      if (strcmp (arg, "variant") == 0)
4333fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	container_type = DBUS_TYPE_VARIANT;
4343fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      else if (strcmp (arg, "array") == 0)
4353fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	container_type = DBUS_TYPE_ARRAY;
43670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      else if (strcmp (arg, "dict") == 0)
43770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	container_type = DBUS_TYPE_DICT_ENTRY;
4383fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
4393fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      if (container_type != DBUS_TYPE_INVALID)
4403fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	{
4413fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  arg = c;
4423fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  c = strchr (arg, ':');
4433fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  if (c == NULL)
4443fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	    {
4453fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	      fprintf (stderr, "%s: Data item \"%s\" is badly formed\n", argv[0], arg);
4463fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	      exit (1);
4473fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	    }
4483fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  *(c++) = 0;
4493fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	}
4503fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
45170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      if (arg[0] == 0)
4527c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	type = DBUS_TYPE_STRING;
4537c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington      else
45470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	type = type_from_name (arg);
45570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters
45670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      if (container_type == DBUS_TYPE_DICT_ENTRY)
4577c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	{
4581889d97d4e2a0cb92dfc98c23bcbc70d6624d418Colin Walters	  char sig[5];
45970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  arg = c;
46070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  c = strchr (c, ':');
46170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  if (c == NULL)
46270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	    {
46370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	      fprintf (stderr, "%s: Data item \"%s\" is badly formed\n", argv[0], arg);
46470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	      exit (1);
46570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	    }
46670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  *(c++) = 0;
46770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  secondary_type = type_from_name (arg);
46870bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  sig[0] = DBUS_DICT_ENTRY_BEGIN_CHAR;
46970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  sig[1] = type;
47070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  sig[2] = secondary_type;
47170bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  sig[3] = DBUS_DICT_ENTRY_END_CHAR;
47270bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  sig[4] = '\0';
47370bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  dbus_message_iter_open_container (&iter,
47470bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters					    DBUS_TYPE_ARRAY,
47570bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters					    sig,
47670bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters					    &container_iter);
47770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  target_iter = &container_iter;
4787c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	}
47970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      else if (container_type != DBUS_TYPE_INVALID)
4807c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	{
4813fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  char sig[2];
4823fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  sig[0] = type;
4833fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  sig[1] = '\0';
4843fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  dbus_message_iter_open_container (&iter,
4853fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters					    container_type,
4863fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters					    sig,
4873fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters					    &container_iter);
4883fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  target_iter = &container_iter;
4893fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	}
4903fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      else
4913fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	target_iter = &iter;
492a221eefadfb48488129dedca2f2dc062e1c718e7Havoc Pennington
4933fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      if (container_type == DBUS_TYPE_ARRAY)
4943fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	{
4953fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  append_array (target_iter, type, c);
4963fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	}
49770bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters      else if (container_type == DBUS_TYPE_DICT_ENTRY)
49870bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	{
49970bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	  append_dict (target_iter, type, secondary_type, c);
50070bd20a50e5d8d5dd5ddabf945812d881090d3f5Colin Walters	}
5013fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      else
5023fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	append_arg (target_iter, type, c);
5033fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters
5043fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters      if (container_type != DBUS_TYPE_INVALID)
5053fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	{
5063fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters	  dbus_message_iter_close_container (&iter,
5073fa4c2f4044bc06a9ce166a4f44d7b0a54ed4843Colin Walters					     &container_iter);
5087c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington	}
5097c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington    }
5107c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
511306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington  if (print_reply)
512306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington    {
513306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      DBusMessage *reply;
514306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington
515306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      dbus_error_init (&error);
516306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      reply = dbus_connection_send_with_reply_and_block (connection,
517fefa40496b425ea18e7a392bb62ded2de008e4e9Colin Walters                                                         message, reply_timeout,
518306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington                                                         &error);
519306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      if (dbus_error_is_set (&error))
520306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington        {
521ab1ae1f4e204e0ee36690c828ea4a66fb9427633Colin Walters          fprintf (stderr, "Error %s: %s\n",
522ab1ae1f4e204e0ee36690c828ea4a66fb9427633Colin Walters		   error.name,
523306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington                   error.message);
524306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington          exit (1);
525306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington        }
526306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington
527306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      if (reply)
528306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington        {
5292ca6e95764dc3491458dcf077ce77cbbabf00ddfColin Walters          print_message (reply, print_reply_literal);
530306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington          dbus_message_unref (reply);
531306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington        }
532306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington    }
533306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington  else
534306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington    {
535306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      dbus_connection_send (connection, message, NULL);
536306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      dbus_connection_flush (connection);
537306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington    }
5387c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
5397c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  dbus_message_unref (message);
5407c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
54189d97b47795b09a576f5cf9a40fd93eb6c9ce3f5Havoc Pennington  dbus_connection_unref (connection);
5427c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington
5437c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington  exit (0);
5447c434a849a161c4514f3759659ac7af9ecddc721Havoc Pennington}
545