X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=drm-lease-manager%2Fmain.c;h=5ac3600480b6fed1dae401b662918928e5a92d51;hb=refs%2Ftags%2Fneedlefish%2F13.93.0;hp=491c80c6b6520967cd1a341b0543e0fd58ac5a3f;hpb=ecaaf9e2ad40181d916049510823ce8557ecd91e;p=src%2Fdrm-lease-manager.git diff --git a/drm-lease-manager/main.c b/drm-lease-manager/main.c index 491c80c..5ac3600 100644 --- a/drm-lease-manager/main.c +++ b/drm-lease-manager/main.c @@ -13,6 +13,8 @@ * limitations under the License. */ +#include "config.h" +#include "lease-config.h" #include "lease-manager.h" #include "lease-server.h" #include "log.h" @@ -22,27 +24,41 @@ #include #include +#ifdef HAVE_SYSTEMD_DAEMON +#include +#endif + static void usage(const char *progname) { printf("Usage: %s [OPTIONS] []\n\n" "Options:\n" "-h, --help \tPrint this help\n" - "-v, --verbose \tEnable verbose debug messages\n", + "-c, --config \t path to configuration file (default " + "/etc/drm-lease-manager.toml)\n" + "-v, --verbose \tEnable verbose debug messages\n" + "-t, --lease-transfer \tAllow lease transfter to new clients\n" + "-k, --keep-on-crash \tDon't close lease on client crash\n", progname); } -const char *opts = "vh"; +const char *opts = "vtkhc:"; const struct option options[] = { {"help", no_argument, NULL, 'h'}, {"verbose", no_argument, NULL, 'v'}, + {"lease-transfer", no_argument, NULL, 't'}, + {"keep-on-crash", no_argument, NULL, 'k'}, + {"config", required_argument, NULL, 'c'}, {NULL, 0, NULL, 0}, }; int main(int argc, char **argv) { - char *device = "/dev/dri/card0"; + char *device = NULL; + char *config_file = "/etc/drm-lease-manager.toml"; bool debug_log = false; + bool can_transfer_leases = false; + bool keep_on_crash = false; int c; while ((c = getopt_long(argc, argv, opts, options, NULL)) != -1) { @@ -51,6 +67,15 @@ int main(int argc, char **argv) case 'v': debug_log = true; break; + case 't': + can_transfer_leases = true; + break; + case 'k': + keep_on_crash = true; + break; + case 'c': + config_file = optarg; + break; case 'h': ret = EXIT_SUCCESS; /* fall through */ @@ -65,7 +90,12 @@ int main(int argc, char **argv) dlm_log_enable_debug(debug_log); - struct lm *lm = lm_create(device); + struct lease_config *lease_configs = NULL; + int num_configs = parse_config(config_file, &lease_configs); + + struct lm *lm = + lm_create_with_config(device, num_configs, lease_configs); + if (!lm) { ERROR_LOG("DRM Lease initialization failed\n"); return EXIT_FAILURE; @@ -82,11 +112,19 @@ int main(int argc, char **argv) return EXIT_FAILURE; } +#ifdef HAVE_SYSTEMD_DAEMON + sd_notify(1, "READY=1"); +#endif + struct ls_req req; while (ls_get_request(ls, &req)) { switch (req.type) { case LS_REQ_GET_LEASE: { int fd = lm_lease_grant(lm, req.lease_handle); + + if (fd < 0 && can_transfer_leases) + fd = lm_lease_transfer(lm, req.lease_handle); + if (fd < 0) { ERROR_LOG( "Can't fulfill lease request: lease=%s\n", @@ -95,6 +133,13 @@ int main(int argc, char **argv) break; } + struct ls_client *active_client = + req.lease_handle->user_data; + if (active_client) + ls_disconnect_client(ls, active_client); + + req.lease_handle->user_data = req.client; + if (!ls_send_fd(ls, req.client, fd)) { ERROR_LOG( "Client communication error: lease=%s\n", @@ -105,8 +150,14 @@ int main(int argc, char **argv) break; } case LS_REQ_RELEASE_LEASE: + case LS_REQ_CLIENT_DISCONNECT: ls_disconnect_client(ls, req.client); + req.lease_handle->user_data = NULL; lm_lease_revoke(lm, req.lease_handle); + + if (!keep_on_crash || req.type == LS_REQ_RELEASE_LEASE) + lm_lease_close(req.lease_handle); + break; default: ERROR_LOG("Internal error: Invalid lease request\n"); @@ -116,5 +167,6 @@ int main(int argc, char **argv) done: ls_destroy(ls); lm_destroy(lm); + release_config(num_configs, lease_configs); return EXIT_FAILURE; }