Default to first modesettable DRM device
[src/drm-lease-manager.git] / drm-lease-manager / main.c
index c3a933f..b4ad379 100644 (file)
@@ -13,6 +13,7 @@
  * limitations under the License.
  */
 
+#include "lease-config.h"
 #include "lease-manager.h"
 #include "lease-server.h"
 #include "log.h"
@@ -27,22 +28,32 @@ static void usage(const char *progname)
        printf("Usage: %s [OPTIONS] [<DRM device>]\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 +62,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 +85,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;
@@ -87,26 +112,43 @@ int main(int argc, char **argv)
                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",
                                    req.lease_handle->name);
-                               ls_disconnect_client(ls, req.server);
+                               ls_disconnect_client(ls, req.client);
                                break;
                        }
 
-                       if (!ls_send_fd(ls, req.server, fd)) {
+                       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",
                                    req.lease_handle->name);
-                               ls_disconnect_client(ls, req.server);
+                               ls_disconnect_client(ls, req.client);
                                lm_lease_revoke(lm, req.lease_handle);
                        }
                        break;
                }
                case LS_REQ_RELEASE_LEASE:
-                       ls_disconnect_client(ls, req.server);
+               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 +158,6 @@ int main(int argc, char **argv)
 done:
        ls_destroy(ls);
        lm_destroy(lm);
+       release_config(num_configs, lease_configs);
        return EXIT_FAILURE;
 }