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 */
23 static void configLine(poptContext con, char * line) {
24 int nameLength = strlen(con->appName);
26 struct poptAlias alias;
28 char * longName = NULL;
29 char shortName = '\0';
31 if (strncmp(line, con->appName, nameLength)) return;
33 if (!*line || !isspace(*line)) return;
34 while (*line && isspace(*line)) line++;
37 while (!*line || !isspace(*line)) line++;
39 while (*line && isspace(*line)) line++;
43 while (!*line || !isspace(*line)) line++;
45 while (*line && isspace(*line)) line++;
48 if (opt[0] == '-' && opt[1] == '-')
50 else if (opt[0] == '-' && !opt[2])
53 if (!strcmp(entryType, "alias")) {
54 if (poptParseArgvString(line, &alias.argc, &alias.argv)) return;
55 alias.longName = longName, alias.shortName = shortName;
56 poptAddAlias(con, alias, 0);
57 } else if (!strcmp(entryType, "exec")) {
58 con->execs = realloc(con->execs,
59 sizeof(*con->execs) * (con->numExecs + 1));
61 con->execs[con->numExecs].longName = strdup(longName);
63 con->execs[con->numExecs].longName = NULL;
65 con->execs[con->numExecs].shortName = shortName;
66 con->execs[con->numExecs].script = strdup(line);
72 int poptReadConfigFile(poptContext con, char * fn) {
73 char * file, * chptr, * end;
78 fd = open(fn, O_RDONLY);
83 return POPT_ERROR_ERRNO;
86 fileLength = lseek(fd, 0, SEEK_END);
89 file = alloca(fileLength + 1);
90 if ((fd = read(fd, file, fileLength)) != fileLength) {
94 return POPT_ERROR_ERRNO;
98 dst = buf = alloca(fileLength + 1);
101 end = (file + fileLength);
102 while (chptr < end) {
107 while (*dst && isspace(*dst)) dst++;
108 if (*dst && *dst != '#') {
109 configLine(con, dst);
118 /* \ at the end of a line does not insert a \n */
131 int poptReadDefaultConfig(poptContext con, int useEnv) {
135 if (!con->appName) return 0;
137 rc = poptReadConfigFile(con, "/etc/popt");
139 if (getuid() != geteuid()) return 0;
141 if ((home = getenv("HOME"))) {
142 fn = alloca(strlen(home) + 20);
144 strcat(fn, "/.popt");
145 rc = poptReadConfigFile(con, fn);