/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release

« back to all changes in this revision

Viewing changes to plugbasedclient.c

  • Committer: Teddy Hogeborn
  • Date: 2008-07-31 19:51:44 UTC
  • mfrom: (24.1.5 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20080731195144-yb37wz2sr1e6b3m4
Merge.

Show diffs side-by-side

added added

removed removed

Lines of Context:
53
53
  char *name;           /* can be "global" and any plugin name */
54
54
  char **argv;
55
55
  int argc;
 
56
  bool disable;
56
57
  struct plugin *next;
57
58
} plugin;
58
59
 
78
79
  new_plugin->argv[0] = name;
79
80
  new_plugin->argv[1] = NULL;
80
81
  new_plugin->argc = 1;
 
82
  new_plugin->disable = false;
 
83
  new_plugin->next = *plugin_list;
81
84
  /* Append the new plugin to the list */
82
 
  new_plugin->next = *plugin_list;
83
85
  *plugin_list = new_plugin;
84
86
  return new_plugin;
85
87
}
107
109
static char args_doc[] = "";
108
110
 
109
111
int main(int argc, char *argv[]){
110
 
  char plugindir[] = "plugins.d";
111
 
  size_t d_name_len, plugindir_len = sizeof(plugindir)-1;
 
112
  const char *plugindir = "plugins.d";
 
113
  size_t d_name_len;
112
114
  DIR *dir;
113
115
  struct dirent *dirst;
114
116
  struct stat st;
115
117
  fd_set rfds_orig;
116
118
  int ret, maxfd = 0;
117
119
  process *process_list = NULL;
118
 
  
 
120
 
119
121
  /* The options we understand. */
120
122
  struct argp_option options[] = {
121
123
    { .name = "global-options", .key = 'g',
124
126
    { .name = "options-for", .key = 'o',
125
127
      .arg = "plugin:option[,option[,...]]", .flags = 0,
126
128
      .doc = "Options effecting only specified plugins" },
 
129
    { .name = "disable-plugin", .key = 'd',
 
130
      .arg = "Plugin[,Plugin[,...]]", .flags = 0,
 
131
      .doc = "Option to disable specififed plugins" },
 
132
    { .name = "plugin-dir", .key = 128,
 
133
      .arg = "Directory", .flags = 0,
 
134
      .doc = "Option to change directory to search for plugins" },
127
135
    { .name = NULL }
128
136
  };
129
137
  
152
160
        } while (p);
153
161
      }
154
162
      break;
 
163
    case 'd':
 
164
      if (arg != NULL){
 
165
        char *p = strtok(arg, ",");
 
166
        do{
 
167
          getplugin(p, plugins)->disable = true;
 
168
          p = strtok(NULL, ",");
 
169
        } while (p);
 
170
      }
 
171
      break;
 
172
    case 128:
 
173
      plugindir = arg;
 
174
      break;
155
175
    case ARGP_KEY_ARG:
156
176
      argp_usage (state);
157
177
      break;
178
198
/*   } */
179
199
  
180
200
/*   return 0; */
181
 
  
 
201
 
182
202
  dir = opendir(plugindir);
183
203
  
184
204
  if(dir == NULL){
204
224
      continue;
205
225
    }
206
226
 
207
 
    char *filename = malloc(d_name_len + plugindir_len + 2);
 
227
    char *filename = malloc(d_name_len + strlen(plugindir) + 2);
208
228
    strcpy(filename, plugindir);
209
229
    strcat(filename, "/");
210
230
    strcat(filename, dirst->d_name);    
211
231
 
212
232
    stat(filename, &st);
213
233
 
214
 
    if (S_ISREG(st.st_mode) and (access(filename, X_OK) == 0)){
 
234
    if (S_ISREG(st.st_mode)
 
235
        and (access(filename, X_OK) == 0)
 
236
        and not (getplugin(dirst->d_name, &plugin_list)->disable)){
215
237
      // Starting a new process to be watched
216
238
      process *new_process = malloc(sizeof(process));
217
 
      int pipefd[2];
 
239
      int pipefd[2]; 
218
240
      ret = pipe(pipefd);
219
241
      if (ret == -1){
220
242
        perror(argv[0]);
226
248
        closedir(dir);
227
249
        close(pipefd[0]);       /* close unused read end of pipe */
228
250
        dup2(pipefd[1], STDOUT_FILENO); /* replace our stdout */
229
 
        char *basename;
230
 
        basename = strrchr(filename, '/');
231
 
        if (basename == NULL){
232
 
          basename = filename;
233
 
        } else {
234
 
          basename++;
235
 
        }
236
 
        plugin *p = getplugin(basename, &plugin_list);
237
251
 
 
252
        plugin *p = getplugin(dirst->d_name, &plugin_list);
238
253
        plugin *g = getplugin(NULL, &plugin_list);
239
254
        for(char **a = g->argv + 1; *a != NULL; a++){
240
255
          addarguments(p, *a);