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 long t = strtol(optarg, NULL, 0); 84 rpc_exec_timeout = (t > 0 && t <= 600) ? (int)(t * 1000) : -1; 85 break; 86 } 87 88 default: 89 break; 90 } 91 } 92 93 if (rpc_exec_timeout < 1000 || rpc_exec_timeout > 600000) { 94 fprintf(stderr, "Invalid execution timeout specified\n"); 95 return -1; 96 } 97 98 if (stat(RPC_UCI_DIR_PREFIX, &s)) 99 mkdir(RPC_UCI_DIR_PREFIX, 0700); 100 101 umask(0077); 102 103 signal(SIGPIPE, SIG_IGN); 104 signal(SIGHUP, handle_signal); 105 signal(SIGUSR1, handle_signal); 106 107 uloop_init(); 108 109 ctx = ubus_connect(ubus_socket); 110 if (!ctx) { 111 fprintf(stderr, "Failed to connect to ubus\n"); 112 return -1; 113 } 114 115 ubus_add_uloop(ctx); 116 117 rpc_session_api_init(ctx); 118 rpc_uci_api_init(ctx); 119 rpc_rc_api_init(ctx); 120 rpc_plugin_api_init(ctx); 121 122 hangup = getenv("RPC_HANGUP"); 123 124 if (!hangup || strcmp(hangup, "1")) 125 rpc_uci_purge_savedirs(); 126 else 127 rpc_session_thaw(); 128 129 uloop_run(); 130 ubus_free(ctx); 131 uloop_done(); 132 133 if (respawn) 134 exec_self(argc, argv); 135 136 return 0; 137 } 138
This page was automatically generated by LXR 0.3.1. • OpenWrt