1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
32 #include "bus-error.h"
34 bool bus_error_is_dirty(sd_bus_error *e) {
38 return e->name || e->message || e->need_free;
41 void sd_bus_error_free(sd_bus_error *e) {
46 free((void*) e->name);
47 free((void*) e->message);
50 e->name = e->message = NULL;
54 int sd_bus_error_set(sd_bus_error *e, const char *name, const char *message) {
59 if (bus_error_is_dirty(e))
81 int sd_bus_error_setf(sd_bus_error *e, const char *name, const char *format, ...) {
88 if (bus_error_is_dirty(e))
99 r = vasprintf(&m, format, ap);
115 int sd_bus_error_copy(sd_bus_error *dest, const sd_bus_error *e) {
120 if (bus_error_is_dirty(dest))
122 if (!sd_bus_error_is_set(e))
130 y = strdup(e->message);
139 dest->need_free = true;
143 void sd_bus_error_set_const(sd_bus_error *e, const char *name, const char *message) {
146 if (bus_error_is_dirty(e))
149 *e = SD_BUS_ERROR_MAKE(name, message);
152 int sd_bus_error_is_set(const sd_bus_error *e) {
159 int sd_bus_error_has_name(const sd_bus_error *e, const char *name) {
163 return streq_ptr(e->name, name);
166 int bus_error_to_errno(const sd_bus_error* e) {
168 /* Better replce this with a gperf table */
176 if (streq(e->name, "org.freedesktop.DBus.Error.NoMemory"))
179 if (streq(e->name, "org.freedesktop.DBus.Error.AuthFailed") ||
180 streq(e->name, "org.freedesktop.DBus.Error.AccessDenied"))
183 if (streq(e->name, "org.freedesktop.DBus.Error.InvalidArgs"))
186 if (streq(e->name, "org.freedesktop.DBus.Error.UnixProcessIdUnknown"))
189 if (streq(e->name, "org.freedesktop.DBus.Error.FileNotFound"))
192 if (streq(e->name, "org.freedesktop.DBus.Error.FileExists"))
195 if (streq(e->name, "org.freedesktop.DBus.Error.Timeout"))
198 if (streq(e->name, "org.freedesktop.DBus.Error.IOError"))
201 if (streq(e->name, "org.freedesktop.DBus.Error.Disconnected"))
204 if (streq(e->name, "org.freedesktop.DBus.Error.NotSupported"))
210 int bus_error_from_errno(sd_bus_error *e, int error) {
217 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.NoMemory", "Out of memory");
222 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.AccessDenied", "Access denied");
226 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.InvalidArgs", "Invalid argument");
230 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.UnixProcessIdUnknown", "No such process");
234 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.FileNotFound", "File not found");
238 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.FileExists", "File exists");
243 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.Timeout", "Timed out");
247 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.IOError", "Input/output error");
253 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.Disconnected", "Disconnected");
257 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.NotSupported", "Not supported");
261 sd_bus_error_set_const(e, "org.freedesktop.DBus.Error.Failed", "Operation failed");
265 const char *bus_error_message(const sd_bus_error *e, int error) {
269 return strerror(error);