summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Pargmann <mpa@pengutronix.de>2015-02-10 13:55:36 +0100
committerMichael Olbrich <m.olbrich@pengutronix.de>2015-02-12 17:16:03 +0100
commit074ef5b43965d549d2c4cf2c978371494828258c (patch)
tree7f03b045f44276e866e001346126ebde63541ba2
parente915a99187d37b24debe454c175c6484f14fa4e4 (diff)
downloadkmsfbwrap-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.c64
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;