vdr  2.2.0
args.c
Go to the documentation of this file.
1 /*
2  * args.c: Read arguments from files
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * Original version written by Lars Hanisch <dvb@flensrocker.de>.
8  *
9  * $Id: args.c 1.1 2014/04/14 12:02:38 kls Exp $
10  */
11 
12 #include "args.h"
13 #include <unistd.h>
14 
15 cArgs::cArgs(const char *Argv0)
16 {
17  argv0 = Argv0;
18  argc = 0;
19  argv = NULL;
20 }
21 
23 {
24  if (argv != NULL)
25  delete [] argv;
26 }
27 
28 bool cArgs::AddArg(const char *s)
29 {
30  if (inVdrSection)
31  args.Append(strdup(s));
32  else if (*lastArg == NULL)
33  return false;
34  else
35  lastArg = cString::sprintf("%s %s", *lastArg, s);
36  return true;
37 }
38 
39 bool cArgs::ReadDirectory(const char *Directory)
40 {
41  if (argv != NULL)
42  delete [] argv;
43  argc = 0;
44  argv = NULL;
45  args.Clear();
46  lastArg = NULL;
47  inVdrSection = false;
48  cFileNameList files(Directory, false);
49  if (files.Size() == 0)
50  return false;
51  for (int i = 0; i < files.Size(); i++) {
52  const char *fileName = files.At(i);
53  if (startswith(fileName, ".") || !endswith(fileName, ".conf"))
54  continue;
55  cString fullFileName = AddDirectory(Directory, fileName);
56  struct stat fs;
57  if ((access(*fullFileName, F_OK) != 0) || (stat(*fullFileName, &fs) != 0) || S_ISDIR(fs.st_mode))
58  continue;
59  bool ok = true;
60  int line = 0;
61  FILE *f = fopen(*fullFileName, "r");
62  if (f) {
63  char *s;
64  cReadLine ReadLine;
65  while ((s = ReadLine.Read(f)) != NULL) {
66  line++;
67  s = stripspace(skipspace(s));
68  if (!isempty(s) && (s[0] != '#')) {
69  if (startswith(s, "[") && endswith(s, "]")) {
70  s[strlen(s) - 1] = 0;
71  s++;
72  if (*lastArg) {
73  args.Append(strdup(*lastArg));
74  lastArg = NULL;
75  }
76  if (strcmp(s, "vdr") == 0)
77  inVdrSection = true;
78  else {
79  inVdrSection = false;
80  lastArg = cString::sprintf("--plugin=%s", s);
81  }
82  }
83  else {
84  if ((strlen(s) > 2) && (s[0] == '-') && (s[1] != '-')) { // short option, split at first space
85  char *p = strchr(s, ' ');
86  if (p == NULL) {
87  ok = AddArg(s);
88  if (!ok)
89  break;
90  }
91  else {
92  *p = 0;
93  p++;
94  ok = AddArg(s);
95  if (!ok)
96  break;
97  ok = AddArg(p);
98  if (!ok)
99  break;
100  }
101  }
102  else {
103  ok = AddArg(s);
104  if (!ok)
105  break;
106  }
107  }
108  }
109  }
110  fclose(f);
111  }
112  if (!ok) {
113  esyslog("ERROR: args file %s, line %d", *fullFileName, line);
114  return false;
115  }
116  }
117  if (*lastArg) {
118  args.Append(strdup(*lastArg));
119  lastArg = NULL;
120  }
121  argv = new char*[args.Size() + 1];
122  argv[0] = strdup(*argv0);
123  argc = 1;
124  for (int i = 0; i < args.Size(); i++) {
125  argv[argc] = args.At(i);
126  argc++;
127  }
128  return true;
129 }
cArgs(const char *Argv0)
Definition: args.c:15
virtual void Clear(void)
Definition: tools.c:1493
bool isempty(const char *s)
Definition: tools.c:297
cString AddDirectory(const char *DirName, const char *FileName)
Definition: tools.c:350
char * stripspace(char *s)
Definition: tools.c:201
bool endswith(const char *s, const char *p)
Definition: tools.c:286
static cString sprintf(const char *fmt,...) __attribute__((format(printf
Definition: tools.c:1080
virtual void Append(T Data)
Definition: tools.h:571
cString lastArg
Definition: args.h:21
#define esyslog(a...)
Definition: tools.h:34
char * Read(FILE *f)
Definition: tools.c:1398
~cArgs(void)
Definition: args.c:22
int argc
Definition: args.h:23
cStringList args
Definition: args.h:20
bool ReadDirectory(const char *Directory)
Definition: args.c:39
bool inVdrSection
Definition: args.h:22
int Size(void) const
Definition: tools.h:551
char ** argv
Definition: args.h:24
bool AddArg(const char *s)
Definition: args.c:28
bool startswith(const char *s, const char *p)
Definition: tools.c:277
char * skipspace(const char *s)
Definition: tools.h:200
T & At(int Index) const
Definition: tools.h:528
cString argv0
Definition: args.h:19
Definition: tools.h:168