1f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 2f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes/* activation-helper-bin.c Setuid helper for launching programs as a custom 3f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * user. This file is security sensitive. 4f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * 5f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * Copyright (C) 2007 Red Hat, Inc. 6f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * 7f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * Licensed under the Academic Free License version 2.1 8f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * 9f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * This program is free software; you can redistribute it and/or modify 10f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * it under the terms of the GNU General Public License as published by 11f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * the Free Software Foundation; either version 2 of the License, or 12f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * (at your option) any later version. 13f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * 14f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * This program is distributed in the hope that it will be useful, 15f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * but WITHOUT ANY WARRANTY; without even the implied warranty of 16f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * GNU General Public License for more details. 18f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * 19f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * You should have received a copy of the GNU General Public License 20f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * along with this program; if not, write to the Free Software 215baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes * 23f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes */ 24f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 25f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes#include <config.h> 26f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 27f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes#include "utils.h" 28f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes#include "activation-helper.h" 29f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes#include "activation-exit-codes.h" 30f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 31f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes#include <stdio.h> 32f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes#include <stdlib.h> 33f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes#include <string.h> 34f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 35f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughesstatic int 36f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughesconvert_error_to_exit_code (DBusError *error) 37f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes{ 38f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY)) 39f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_NO_MEMORY; 40f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 41f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_CONFIG_INVALID)) 42f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_CONFIG_INVALID; 43f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 44f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_SETUP_FAILED)) 45f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_SETUP_FAILED; 46f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 47f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_SERVICE_INVALID)) 48f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_SERVICE_NOT_FOUND; 49f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 50f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_PERMISSIONS_INVALID)) 51f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_PERMISSIONS_INVALID; 52f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 53f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_FILE_INVALID)) 54f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_FILE_INVALID; 55f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 56f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_EXEC_FAILED)) 57f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_EXEC_FAILED; 58f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 5979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington if (dbus_error_has_name (error, DBUS_ERROR_INVALID_ARGS)) 6079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington return BUS_SPAWN_EXIT_CODE_INVALID_ARGS; 61bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington 62bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington if (dbus_error_has_name (error, DBUS_ERROR_SPAWN_CHILD_SIGNALED)) 63bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington return BUS_SPAWN_EXIT_CODE_CHILD_SIGNALED; 6479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 65f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes /* should we assert? */ 6679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington fprintf(stderr, "%s: %s\n", error->name, error->message); 6779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 68f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return BUS_SPAWN_EXIT_CODE_SETUP_FAILED; 69f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes} 70f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 71f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughesint 72f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughesmain (int argc, char **argv) 73f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes{ 74f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes DBusError error; 75f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes int retval; 76f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 77f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes /* default is all okay */ 78f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes retval = 0; 79f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 80f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes /* have we used a help option or not specified the correct arguments? */ 81f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (argc != 2 || 82f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes strcmp (argv[1], "--help") == 0 || 83f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes strcmp (argv[1], "-h") == 0 || 84f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes strcmp (argv[1], "-?") == 0) 85f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes { 86f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes fprintf (stderr, "dbus-daemon-activation-helper service.to.activate\n"); 87f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes exit (0); 88f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes } 89f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 90f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes dbus_error_init (&error); 91f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes if (!run_launch_helper (argv[1], &error)) 92f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes { 93f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes /* convert error to an exit code */ 94f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes retval = convert_error_to_exit_code (&error); 95f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes dbus_error_free (&error); 96f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes } 97f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 98f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes return retval; 99f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes} 100f4082146e91014c56c6215fb4e471f9f1baa8f60Richard Hughes 101