1 /* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
2 file accompanying popt source distributions, available from
3 ftp://ftp.redhat.com/pub/code/popt */
8 static void configLine(poptContext con, char * line) {
9 int nameLength = strlen(con->appName);
11 struct poptAlias alias;
13 char * longName = NULL;
14 char shortName = '\0';
16 if (strncmp(line, con->appName, nameLength)) return;
18 if (!*line || !isspace(*line)) return;
19 while (*line && isspace(*line)) line++;
22 while (!*line || !isspace(*line)) line++;
24 while (*line && isspace(*line)) line++;
28 while (!*line || !isspace(*line)) line++;
30 while (*line && isspace(*line)) line++;
33 if (opt[0] == '-' && opt[1] == '-')
35 else if (opt[0] == '-' && !opt[2])
38 if (!strcmp(entryType, "alias")) {
39 if (poptParseArgvString(line, &alias.argc, &alias.argv)) return;
40 alias.longName = longName, alias.shortName = shortName;
41 poptAddAlias(con, alias, 0);
42 } else if (!strcmp(entryType, "exec")) {
43 con->execs = realloc(con->execs,
44 sizeof(*con->execs) * (con->numExecs + 1));
46 con->execs[con->numExecs].longName = xstrdup(longName);
48 con->execs[con->numExecs].longName = NULL;
50 con->execs[con->numExecs].shortName = shortName;
51 con->execs[con->numExecs].script = xstrdup(line);
57 int poptReadConfigFile(poptContext con, const char * fn) {
58 char * file, * chptr, * end;
63 fd = open(fn, O_RDONLY);
68 return POPT_ERROR_ERRNO;
71 fileLength = lseek(fd, 0, SEEK_END);
72 (void) lseek(fd, 0, 0);
74 file = alloca(fileLength + 1);
75 if (read(fd, file, fileLength) != fileLength) {
79 return POPT_ERROR_ERRNO;
83 dst = buf = alloca(fileLength + 1);
86 end = (file + fileLength);
92 while (*dst && isspace(*dst)) dst++;
93 if (*dst && *dst != '#') {
103 /* \ at the end of a line does not insert a \n */
117 int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv) {
121 if (!con->appName) return 0;
123 rc = poptReadConfigFile(con, "/etc/popt");
125 if (getuid() != geteuid()) return 0;
127 if ((home = getenv("HOME"))) {
128 fn = alloca(strlen(home) + 20);
130 strcat(fn, "/.popt");
131 rc = poptReadConfigFile(con, fn);