+
+static bool parse_cmdline(int ac, char *av[], struct NotifyParams *params)
+{
+ assert(av);
+ assert(params);
+
+ enum {
+ FLAG_CMDLINE = 1,
+ FLAG_CMDPATH,
+ FLAG_PID,
+ FLAG_TID,
+ FLAG_APPID,
+ FLAG_PKGID,
+ FLAG_REPORTPATH,
+ FLAG_PRSTATUS_FD,
+ };
+ static const struct option options[] = {
+ { .name = "cmdline", .has_arg = required_argument, .flag = NULL, .val = FLAG_CMDLINE },
+ { .name = "cmdpath", .has_arg = required_argument, .flag = NULL, .val = FLAG_CMDPATH },
+ { .name = "pid", .has_arg = required_argument, .flag = NULL, .val = FLAG_PID },
+ { .name = "tid", .has_arg = required_argument, .flag = NULL, .val = FLAG_TID },
+ { .name = "appid", .has_arg = required_argument, .flag = NULL, .val = FLAG_APPID },
+ { .name = "pkgid", .has_arg = required_argument, .flag = NULL, .val = FLAG_PKGID },
+ { .name = "reportpath", .has_arg = required_argument, .flag = NULL, .val = FLAG_REPORTPATH },
+ { .name = "prstatus_fd", .has_arg = required_argument, .flag = NULL, .val = FLAG_PRSTATUS_FD },
+ { NULL },
+ };
+
+ int val;
+ do {
+ val = getopt_long_only(ac, av, "", options, NULL);
+
+ if (FLAG_CMDLINE == val)
+ params->cmd_name = basename(optarg);
+ else if (FLAG_CMDPATH == val)
+ params->cmd_path = optarg;
+ else if (FLAG_PID == val)
+ params->pid = atoi(optarg);
+ else if (FLAG_TID == val)
+ params->tid = atoi(optarg);
+ else if (FLAG_APPID == val)
+ params->appid = optarg;
+ else if (FLAG_PKGID == val)
+ params->pkgid = optarg;
+ else if (FLAG_PRSTATUS_FD == val)
+ params->prstatus_fd = atoi(optarg);
+ } while (val != -1);
+
+ return params->cmd_name && params->cmd_path && params->appid && params->pkgid && params->prstatus_fd > 0;
+}
+
+static void usage(const char *const progname)
+{
+ assert(progname);
+
+ printf("%s --prstatus_fd N --pid PID --tid TID --cmdline CMDLINE --cmdpath CMDPATH --appid APPID --pkgid PKGID\n", progname);
+}
+
+int main(int ac, char *av[])
+{
+ struct NotifyParams params = {0, };
+
+ if (!parse_cmdline(ac, av, ¶ms)) {
+ usage(av[0]);
+ return EXIT_FAILURE;
+ }
+
+ GDBusConnection *conn = NULL;
+ if (!bus_get(&conn))
+ return EXIT_FAILURE;
+
+ send_notify(conn, ¶ms);
+ bus_put(conn);
+
+ return EXIT_SUCCESS;
+}