1 /* 2 * rpcd - UBUS RPC server 3 * 4 * Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org> 5 * Copyright (C) 2013-2014 Jo-Philipp Wich <jow@openwrt.org> 6 * 7 * Permission to use, copy, modify, and/or distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #include <unistd.h> 21 #include <stdlib.h> 22 23 #include <libubox/blobmsg_json.h> 24 #include <libubus.h> 25 #include <signal.h> 26 #include <sys/stat.h> 27 28 #include <rpcd/exec.h> 29 #include <rpcd/plugin.h> 30 #include <rpcd/rc.h> 31 #include <rpcd/session.h> 32 #include <rpcd/uci.h> 33 34 static struct ubus_context *ctx; 35 static bool respawn = false; 36 37 int rpc_exec_timeout = RPC_EXEC_DEFAULT_TIMEOUT; 38 39 static void 40 handle_signal(int sig) 41 { 42 rpc_session_freeze(); 43 uloop_cancelled = true; 44 respawn = (sig == SIGHUP); 45 } 46 47 static void 48 exec_self(int argc, char **argv) 49 { 50 int i; 51 const char *cmd; 52 char **args; 53 54 cmd = rpc_exec_lookup(argv[0]); 55 if (!cmd) 56 return; 57 58 args = calloc(argc + 1, sizeof(char *)); 59 if (!args) 60 return; 61 62 for (i = 0; i < argc; i++) 63 args[i] = argv[i]; 64 65 setenv("RPC_HANGUP", "1", 1); 66 execv(cmd, (char * const *)args); 67 } 68 69 int main(int argc, char **argv) 70 { 71 struct stat s; 72 const char *hangup; 73 const char *ubus_socket = NULL; 74 int ch; 75 76 while ((ch = getopt(argc, argv, "s:t:")) != -1) { 77 switch (ch) { 78 case 's': 79 ubus_socket = optarg; 80 break; 81 82 case 't': 83 rpc_exec_timeout = 1000 * strtol(optarg, NULL, 0); 84 break; 85 86 default: 87 break; 88 } 89 } 90 91 if (rpc_exec_timeout < 1000 || rpc_exec_timeout > 600000) { 92 fprintf(stderr, "Invalid execution timeout specified\n"); 93 return -1; 94 } 95 96 if (stat(RPC_UCI_DIR_PREFIX, &s)) 97 mkdir(RPC_UCI_DIR_PREFIX, 0700); 98 99 umask(0077); 100 101 signal(SIGPIPE, SIG_IGN); 102 signal(SIGHUP, handle_signal); 103 signal(SIGUSR1, handle_signal); 104 105 uloop_init(); 106 107 ctx = ubus_connect(ubus_socket); 108 if (!ctx) { 109 fprintf(stderr, "Failed to connect to ubus\n"); 110 return -1; 111 } 112 113 ubus_add_uloop(ctx); 114 115 rpc_session_api_init(ctx); 116 rpc_uci_api_init(ctx); 117 rpc_rc_api_init(ctx); 118 rpc_plugin_api_init(ctx); 119 120 hangup = getenv("RPC_HANGUP"); 121 122 if (!hangup || strcmp(hangup, "1")) 123 rpc_uci_purge_savedirs(); 124 else 125 rpc_session_thaw(); 126 127 uloop_run(); 128 ubus_free(ctx); 129 uloop_done(); 130 131 if (respawn) 132 exec_self(argc, argv); 133 134 return 0; 135 } 136
This page was automatically generated by LXR 0.3.1. • OpenWrt