1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* dbus-launch-win.c dbus-launch utility
*
* Copyright (C) 2007 Ralf Habacker <ralf.habacker@freenet.de>
*
* SPDX-License-Identifier: AFL-2.1 OR GPL-2.0-or-later
*
* Licensed under the Academic Free License version 2.1
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include <config.h>
#ifndef UNICODE
#define UNICODE 1
#endif
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
/* Save string functions. Instead of figuring out the exact _MSC_VER
that work, override for everybody. */
#define errno_t int
#define wcscat_s my_wcscat_s
#define wcscpy_s my_wcscpy_s
static errno_t
wcscat_s (wchar_t *dest, size_t size, const wchar_t *src)
{
assert (sizeof (wchar_t) * (wcslen (dest) + wcslen (src) + 1) <= size);
wcscat (dest, src);
return 0;
}
static errno_t
wcscpy_s (wchar_t *dest, size_t size, const wchar_t *src)
{
assert (sizeof (wchar_t) * (wcslen (src) + 1) <= size);
wcscpy (dest, src);
return 0;
}
/* TODO (tl): This Windows version of dbus-launch is curretly rather
* pointless as it doesn't take the same command-line options as the
* UNIX dbus-launch does. A main point of the dbus-launch command is
* to pass it for instance a --config-file option to make the started
* dbus-daemon use that config file.
*
* This version also doesn't print out any information, which is a
* main point of the UNIX one. It should at least support the
* --sh-syntax option, and maybe also a --cmd-syntax to print out the
* variable settings in cmd.exe syntax?
*
* NOTE (rh): The main task of dbus-launch is (from the man page) to start
* a session bus and this is archieved by the current implemention.
*
* Additional on windows the session bus starting in not integrated
* into the logon process, so there is no need for any --syntax option.
* In fact (at least for kde on windows) the session bus is autostarted
* with the first application requesting a session bus.
*
*/
#define AUTO_ACTIVATE_CONSOLE_WHEN_VERBOSE_MODE 1
#define DIM(x) (sizeof(x) / sizeof(x[0]))
#define WCSTRINGIFY_(x) L ## x
#define WCSTRINGIFY(x) WCSTRINGIFY_(x)
int
main (int argc, char **argv)
{
wchar_t dbusDaemonPath[MAX_PATH * 2 + 1];
wchar_t command[MAX_PATH * 2 + 1];
wchar_t *p;
const wchar_t *daemon_name;
int result;
#ifdef DBUS_WINCE
char *s = NULL;
#else
char *s = getenv("DBUS_VERBOSE");
#endif
int verbose = s && *s != '\0' ? 1 : 0;
PROCESS_INFORMATION pi;
STARTUPINFOW si;
BOOL inherit = TRUE;
DWORD flags = 0;
GetModuleFileNameW (NULL, dbusDaemonPath, DIM (dbusDaemonPath));
daemon_name = WCSTRINGIFY(DBUS_DAEMON_NAME) L".exe";
if ((p = wcsrchr (dbusDaemonPath, L'\\')))
{
p[1] = L'\0';
wcscat_s (dbusDaemonPath, sizeof (dbusDaemonPath), daemon_name);
}
else
{
if (verbose)
fprintf (stderr, "error: could not extract path from current "
"applications module filename\n");
return 1;
}
#ifdef DBUS_WINCE
/* Windows CE has a different interpretation of cmdline: Start with argv[1]. */
wcscpy_s (command, sizeof (command), L"--session");
if (verbose)
fprintf (stderr, "%ls %ls\n", dbusDaemonPath, command);
#else
command[0] = L'\0';
/* Windows cmdline starts with path, which can contain spaces. */
wcscpy_s (command, sizeof (command), L"\"");
wcscat_s (command, sizeof (command), dbusDaemonPath);
wcscat_s (command, sizeof (command), L"\" --session");
if (verbose)
fprintf (stderr, "%ls\n", command);
#endif
memset (&si, 0, sizeof (si));
memset (&pi, 0, sizeof (pi));
si.cb = sizeof (si);
if (verbose)
flags |= CREATE_NEW_CONSOLE;
#ifdef DBUS_WINCE
inherit = FALSE;
#else
flags |= NORMAL_PRIORITY_CLASS;
if (!verbose)
flags |= DETACHED_PROCESS;
#endif
result = CreateProcessW (dbusDaemonPath, command, 0, 0,
inherit, flags, 0, 0, &si, &pi);
if (result == 0)
{
if (verbose)
fprintf (stderr, "Could not start " DBUS_DAEMON_NAME ". error=%u\n",
(unsigned)GetLastError ());
return 4;
}
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
return 0;
}
|