/[imapfilter]/imapfilter/file.c
ViewVC logotype

Diff of /imapfilter/file.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.16 by lefcha, Wed Sep 12 16:18:38 2001 UTC revision 1.17 by lefcha, Sun Sep 30 20:16:25 2001 UTC
# Line 41  int read_config(char *cfg) Line 41  int read_config(char *cfg)
41  #endif  #endif
42      fp = fopen(cfg, "r");      fp = fopen(cfg, "r");
43    
44      if (!fp) {      if (!fp)
45          error("imapfilter: opening config file %s; %s\n",          fatal(ERROR_FILE_OPEN, "imapfilter: opening config file %s; %s\n",
46                cfg, strerror(errno));                cfg, strerror(errno));
         return 1;  
     }  
47    
48      r = parse_config(fp);      if ((r = parse_config(fp)))
49            fatal(ERROR_CONFIG_PARSE,
50                  "imapfilter: parse error in config file at row %d\n", r);
51    
52      fclose(fp);      fclose(fp);
53    
# Line 55  int read_config(char *cfg) Line 55  int read_config(char *cfg)
55      printf("debug: options: %0#10x\n", options);      printf("debug: options: %0#10x\n", options);
56  #endif  #endif
57    
58      return r;      return 0;
59  }  }
60    
61    
# Line 70  int check_permissions(char *cfg) Line 70  int check_permissions(char *cfg)
70      if (stat(cfg, &fs)) {      if (stat(cfg, &fs)) {
71          error("imapfilter: getting file %s status; %s\n", cfg,          error("imapfilter: getting file %s status; %s\n", cfg,
72                strerror(errno));                strerror(errno));
73          return 1;          return ERROR_TRIVIAL;
74      }      }
75    
76      if (!S_ISREG(fs.st_mode)) {      if (!S_ISREG(fs.st_mode)) {
77          error("imapfilter: file %s not a regular file\n", cfg);          error("imapfilter: file %s not a regular file\n", cfg);
78          return 1;          return ERROR_TRIVIAL;
79      }      }
80    
81      if ((fs.st_mode & 00777) != (S_IRUSR | S_IWUSR)) {      if ((fs.st_mode & 00777) != (S_IRUSR | S_IWUSR)) {
82          fprintf(stderr,          error("imapfilter: warning: improper config file %s permissions\n"
83                  "imapfilter: warning: improper config file %s permissions\n"                "imapfilter: warning: file's mode should be 600 not %o\n",
84                  "imapfilter: warning: file's mode should be 600 not %o\n",                cfg, fs.st_mode & 00777);
85                  cfg, fs.st_mode & 00777);          return ERROR_TRIVIAL;
         return 1;  
86      }      }
87    
88      return 0;      return 0;
# Line 95  int check_permissions(char *cfg) Line 94  int check_permissions(char *cfg)
94   */   */
95  int parse_config(FILE * fp)  int parse_config(FILE * fp)
96  {  {
97      int i;      int i, r = 0;
98      unsigned int row = 0;      unsigned int row = 0;
99      char line[LINE_MAX];      char line[LINE_MAX];
100      regex_t creg[11];      regex_t creg[11];
101      regmatch_t match[7];      regmatch_t match[7];
102      const char *reg[11] = {      const char *reg[11] = {
103          "^([[:blank:]]*\n|#.*\n)$",          "^([[:blank:]]*\n|#.*\n)$",
104          "^[[:blank:]]*ACCOUNT[[:blank:]]+([[:graph:]]*):([[:graph:]]*)@([[:alnum:].-]+):?([[:digit:]]{0,5})[[:blank:]]*\n$",          "^[[:blank:]]*ACCOUNT[[:blank:]]+([[:graph:]]*):([[:graph:]]*)@([[:alnum:].-]+)(:[[:digit:]]{1,5})?[[:blank:]]*\n$",
105          "^[[:blank:]]*FOLDER[[:blank:]]+([[:alnum:]_-]+)[[:blank:]]+([[:graph:]]+)[[:blank:]]*\n$",          "^[[:blank:]]*FOLDER[[:blank:]]+([[:alnum:]_-]+)[[:blank:]]+([[:graph:]]+)[[:blank:]]*\n$",
106          "^[[:blank:]]*FILTER[[:blank:]]+([[:alnum:]_-]+)[[:blank:]]*([[:blank:]]OR|[[:blank:]]AND)?[[:blank:]]*\n$",          "^[[:blank:]]*FILTER[[:blank:]]+([[:alnum:]_-]+)[[:blank:]]*([[:blank:]]OR|[[:blank:]]AND)?[[:blank:]]*\n$",
107          "^[[:blank:]]*ACTION[[:blank:]]+(DELETE|COPY|MOVE|LIST)[[:blank:]]*([[:graph:]]*)[[:blank:]]*\n$",          "^[[:blank:]]*ACTION[[:blank:]]+(DELETE|COPY[[:blank:]]+([[:graph:]]+)|MOVE[[:blank:]]+([[:graph:]]+)|LIST)[[:blank:]]*([[:graph:]]*)[[:blank:]]*\n$",
108          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(ALL|ANSWERED|DELETED|DRAFT|FLAGGED|NEW|OLD|RECENT|SEEN|UNANSWERED|UNDELETED|UNDRAFT|UNFLAGGED|UNSEEN)[[:blank:]]*\n$",          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(ANSWERED|DELETED|DRAFT|FLAGGED|NEW|OLD|RECENT|SEEN|UNANSWERED|UNDELETED|UNDRAFT|UNFLAGGED|UNSEEN)[[:blank:]]*\n$",
109          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(BCC|BODY|CC|FROM|SUBJECT|TEXT|TO)[[:blank:]]+([[:print:]]+)\n$",          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(BCC|BODY|CC|FROM|SUBJECT|TEXT|TO)[[:blank:]]+(\"[[:print:]]*\"|[[:graph:]]+)[[:blank:]]*\n$",
110          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(HEADER)[[:blank:]]+([[:graph:]]+)[[:blank:]]+([[:print:]]+)\n$",          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(HEADER)[[:blank:]]+(\"[[:print:]]*\"|[[:graph:]]+)[[:blank:]]+(\"[[:print:]]*\"|[[:graph:]]+)[[:blank:]]*\n$",
111          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(LARGER|SMALLER)[[:blank:]]+([[:digit:]]+)[[:blank:]]*\n$",          "^[[:blank:]]*(MASK[[:blank:]])?[[:blank:]]*(OR[[:blank:]]|AND[[:blank:]])?[[:blank:]]*(NOT[[:blank:]])?[[:blank:]]*(LARGER|SMALLER)[[:blank:]]+([[:digit:]]+)[[:blank:]]*\n$",
112          "^[[:blank:]]*JOB[[:blank:]]+([[:alnum:],_-]+)[[:blank:]]+([[:alnum:],_-]+)[[:blank:]]*\n$",          "^[[:blank:]]*JOB[[:blank:]]+([[:alnum:],_-]+)[[:blank:]]+([[:alnum:],_-]+)[[:blank:]]*\n$",
113          "^[[:blank:]]*LOGFILE[[:blank:]]*=[[:blank:]]*([[:print:]]+)\n$"          "^[[:blank:]]*LOGFILE[[:blank:]]*=[[:blank:]]*([[:print:]]+)\n$"
# Line 124  int parse_config(FILE * fp) Line 123  int parse_config(FILE * fp)
123          else if (!regexec(&creg[1], line, 6, match, 0))          else if (!regexec(&creg[1], line, 6, match, 0))
124              set_account(line, match);              set_account(line, match);
125          else if (!regexec(&creg[2], line, 3, match, 0))          else if (!regexec(&creg[2], line, 3, match, 0))
126              set_mboxgrp(line, match);              r = set_mboxgrp(line, match);
127          else if (!regexec(&creg[3], line, 3, match, 0))          else if (!regexec(&creg[3], line, 3, match, 0))
128              set_filter(line, match);              r = set_filter(line, match);
129          else if (!regexec(&creg[4], line, 3, match, 0))          else if (!regexec(&creg[4], line, 5, match, 0))
130              set_action(line, match);              r = set_action(line, match);
131          else if (!regexec(&creg[5], line, 7, match, 0) ||          else if (!regexec(&creg[5], line, 7, match, 0) ||
132                     !regexec(&creg[6], line, 7, match, 0) ||                     !regexec(&creg[6], line, 7, match, 0) ||
133                     !regexec(&creg[7], line, 7, match, 0) ||                     !regexec(&creg[7], line, 7, match, 0) ||
134                     !regexec(&creg[8], line, 7, match, 0))                     !regexec(&creg[8], line, 7, match, 0))
135              set_mask(line, match);              r = set_mask(line, match);
136          else if (!regexec(&creg[9], line, 3, match, 0))          else if (!regexec(&creg[9], line, 3, match, 0))
137              set_job(line, match);              r = set_job(line, match);
138          else if (!regexec(&creg[10], line, 2, match, 0))          else if (!regexec(&creg[10], line, 2, match, 0))
139              set_options(line, match);              set_options(line, match);
140          else {          else
141              error("imapfilter: parse error in config file at row %d\n",              return row;
142                    row);          
143              return 1;          if (r == ERROR_CONFIG_PARSE)
144          }              return row;
145      }      }
146    
147      for (i = 0; i < 11; i++)      for (i = 0; i < 11; i++)
# Line 159  int parse_config(FILE * fp) Line 158  int parse_config(FILE * fp)
158   */   */
159  void set_options(char *line, regmatch_t * match)  void set_options(char *line, regmatch_t * match)
160  {  {
161      int s;      if (!*logfile)
162            strncat(logfile, line + match[1].rm_so,
163      if (!*logfile) {                  min((match[1].rm_eo - match[1].rm_so), PATH_MAX - 1));
         s = min((match[1].rm_eo - match[1].rm_so), PATH_MAX - 1);  
         strncpy(logfile, line + match[1].rm_so, s);  
         logfile[s] = 0;  
     }  
164  }  }

Legend:
Removed from v.1.16  
changed lines
  Added in v.1.17

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26