aboutsummaryrefslogtreecommitdiffstats
path: root/drm-lease-manager/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drm-lease-manager/main.c')
-rw-r--r--drm-lease-manager/main.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/drm-lease-manager/main.c b/drm-lease-manager/main.c
new file mode 100644
index 0000000..c3a933f
--- /dev/null
+++ b/drm-lease-manager/main.c
@@ -0,0 +1,120 @@
+/* Copyright 2020-2021 IGEL Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "lease-manager.h"
+#include "lease-server.h"
+#include "log.h"
+
+#include <assert.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+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",
+ progname);
+}
+
+const char *opts = "vh";
+const struct option options[] = {
+ {"help", no_argument, NULL, 'h'},
+ {"verbose", no_argument, NULL, 'v'},
+ {NULL, 0, NULL, 0},
+};
+
+int main(int argc, char **argv)
+{
+ char *device = "/dev/dri/card0";
+
+ bool debug_log = false;
+
+ int c;
+ while ((c = getopt_long(argc, argv, opts, options, NULL)) != -1) {
+ int ret = EXIT_FAILURE;
+ switch (c) {
+ case 'v':
+ debug_log = true;
+ break;
+ case 'h':
+ ret = EXIT_SUCCESS;
+ /* fall through */
+ default:
+ usage(argv[0]);
+ return ret;
+ }
+ }
+
+ if (optind < argc)
+ device = argv[optind];
+
+ dlm_log_enable_debug(debug_log);
+
+ struct lm *lm = lm_create(device);
+ if (!lm) {
+ ERROR_LOG("DRM Lease initialization failed\n");
+ return EXIT_FAILURE;
+ }
+
+ struct lease_handle **lease_handles = NULL;
+ int count_ids = lm_get_lease_handles(lm, &lease_handles);
+ assert(count_ids > 0);
+
+ struct ls *ls = ls_create(lease_handles, count_ids);
+ if (!ls) {
+ lm_destroy(lm);
+ ERROR_LOG("Client socket initialization failed\n");
+ return EXIT_FAILURE;
+ }
+
+ 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) {
+ ERROR_LOG(
+ "Can't fulfill lease request: lease=%s\n",
+ req.lease_handle->name);
+ ls_disconnect_client(ls, req.server);
+ break;
+ }
+
+ if (!ls_send_fd(ls, req.server, fd)) {
+ ERROR_LOG(
+ "Client communication error: lease=%s\n",
+ req.lease_handle->name);
+ ls_disconnect_client(ls, req.server);
+ lm_lease_revoke(lm, req.lease_handle);
+ }
+ break;
+ }
+ case LS_REQ_RELEASE_LEASE:
+ ls_disconnect_client(ls, req.server);
+ lm_lease_revoke(lm, req.lease_handle);
+ break;
+ default:
+ ERROR_LOG("Internal error: Invalid lease request\n");
+ goto done;
+ }
+ }
+done:
+ ls_destroy(ls);
+ lm_destroy(lm);
+ return EXIT_FAILURE;
+}