diff options
author | Markus Pargmann <mpa@pengutronix.de> | 2015-02-10 13:55:36 +0100 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2015-02-12 17:16:03 +0100 |
commit | 074ef5b43965d549d2c4cf2c978371494828258c (patch) | |
tree | 7f03b045f44276e866e001346126ebde63541ba2 | |
parent | e915a99187d37b24debe454c175c6484f14fa4e4 (diff) | |
download | kmsfbwrap-074ef5b43965d549d2c4cf2c978371494828258c.tar.gz kmsfbwrap-074ef5b43965d549d2c4cf2c978371494828258c.tar.xz |
args: Use /etc/kmsfb-manage.conf when no arguments were passed
This patch adds support for a default arguments file. It parses the
given file as commandline arguments. If the file does not exist, the
help is printed.
Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
-rw-r--r-- | src/kmsfb-manage.c | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/src/kmsfb-manage.c b/src/kmsfb-manage.c index 0fbad75..0edecf7 100644 --- a/src/kmsfb-manage.c +++ b/src/kmsfb-manage.c @@ -1276,12 +1276,69 @@ static void usage(const char *prgname) exit(1); } +#define MAX_ARGS 256 + int main(int argc, char *argv[]) { int fd; int c; struct drm_resource *res; int err; + char **parse_args; + char *cmdline; + char *cmdlinev[MAX_ARGS]; + + if (argc <= 1) { + int f; + int ret; + ssize_t read_bytes; + struct stat st; + const char *fname = "/etc/kmsfb-manage.conf"; + char *cmdline_ptr; + + f = open(fname, O_RDONLY); + if (f == -1) { + fprintf(stderr, "Failed to open '%s' (%s)!\n", fname, strerror(errno)); + usage(argv[0]); + return 1; + } + + ret = fstat(f, &st); + if (ret) { + fprintf(stderr, "Failed to stat '%s' (%s)!\n", fname, strerror(errno)); + return 1; + } + + cmdline = malloc(st.st_size + 1); + if (!cmdline) { + fprintf(stderr, "Failed to allocate memory to read in default arguments!\n"); + return 1; + } + + read_bytes = read(f, cmdline, st.st_size); + close(f); + if (read_bytes != st.st_size) { + fprintf(stderr, "kmsfb-manage could not read from file!\n"); + return 1; + } + cmdline[st.st_size] = '\0'; + + cmdlinev[0] = argv[0]; + argc = 1; + cmdline_ptr = strtok(cmdline, " \n\r"); + while (cmdline_ptr && argc < MAX_ARGS) { + cmdlinev[argc] = cmdline_ptr; + cmdline_ptr = strtok(NULL, " \n\r"); + ++argc; + } + if (argc == MAX_ARGS) { + fprintf(stderr, "too many arguments (max %d)!\n", MAX_ARGS); + return 1; + } + parse_args = cmdlinev; + } else { + parse_args = argv; + } fd = open("/dev/dri/card0", O_RDWR); if (fd < 0) { @@ -1293,14 +1350,11 @@ int main(int argc, char *argv[]) } } - if (argc == 1) - usage(argv[0]); - drmfd = fd; while (1) { int option_index = 0; - c = getopt_long(argc, argv, "f:w:o:hsd", + c = getopt_long(argc, parse_args, "f:w:o:hsd", long_options, &option_index); if (c == -1) break; @@ -1329,7 +1383,7 @@ int main(int argc, char *argv[]) exit(1); break; case 'h': - usage(argv[0]); + usage(parse_args[0]); break; case 'd': debug = 1; |