/mandos/trunk

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

« back to all changes in this revision

Viewing changes to plugins.d/splashy.c

added documentation todo

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
#include <sys/wait.h>           /* waitpid(), WIFEXITED(),
48
48
                                   WEXITSTATUS() */
49
49
 
50
 
#include <sysexits.h>           /* EX_OSERR, EX_OSFILE,
51
 
                                   EX_UNAVAILABLE */
52
 
 
53
50
sig_atomic_t interrupted_by_signal = 0;
54
51
int signal_received;
55
52
 
68
65
  DIR *proc_dir = NULL;
69
66
  pid_t splashy_pid = 0;
70
67
  pid_t splashy_command_pid = 0;
71
 
  int exitstatus = EXIT_FAILURE;
72
68
  
73
69
  /* Create prompt string */
74
70
  {
94
90
    }
95
91
    if(ret == -1){
96
92
      prompt = NULL;
97
 
      exitstatus = EX_OSERR;
98
93
      goto failure;
99
94
    }
100
95
  }
104
99
    const char splashy_name[] = "/sbin/splashy";
105
100
    proc_dir = opendir("/proc");
106
101
    if(proc_dir == NULL){
107
 
      int e = errno;
108
102
      perror("opendir");
109
 
      switch(e){
110
 
      case EACCES:
111
 
      case ENOTDIR:
112
 
      case ELOOP:
113
 
      case ENOENT:
114
 
      default:
115
 
        exitstatus = EX_OSFILE;
116
 
        break;
117
 
      case ENAMETOOLONG:
118
 
      case EMFILE:
119
 
      case ENFILE:
120
 
      case ENOMEM:
121
 
        exitstatus = EX_OSERR;
122
 
        break;
123
 
      }
124
103
      goto failure;
125
104
    }
126
105
    for(struct dirent *proc_ent = readdir(proc_dir);
148
127
        ret = asprintf(&exe_link, "/proc/%s/exe", proc_ent->d_name);
149
128
        if(ret == -1){
150
129
          perror("asprintf");
151
 
          exitstatus = EX_OSERR;
152
130
          goto failure;
153
131
        }
154
132
        
160
138
            free(exe_link);
161
139
            continue;
162
140
          }
163
 
          int e = errno;
164
141
          perror("lstat");
165
142
          free(exe_link);
166
 
          switch(e){
167
 
          case EACCES:
168
 
          case ENOTDIR:
169
 
          case ELOOP:
170
 
          default:
171
 
            exitstatus = EX_OSFILE;
172
 
            break;
173
 
          case ENAMETOOLONG:
174
 
            exitstatus = EX_OSERR;
175
 
            break;
176
 
          }
177
143
          goto failure;
178
144
        }
179
145
        if(not S_ISLNK(exe_stat.st_mode)
197
163
    proc_dir = NULL;
198
164
  }
199
165
  if(splashy_pid == 0){
200
 
    exitstatus = EX_UNAVAILABLE;
201
166
    goto failure;
202
167
  }
203
168
  
210
175
    ret = sigaddset(&new_action.sa_mask, SIGINT);
211
176
    if(ret == -1){
212
177
      perror("sigaddset");
213
 
      exitstatus = EX_OSERR;
214
178
      goto failure;
215
179
    }
216
180
    ret = sigaddset(&new_action.sa_mask, SIGHUP);
217
181
    if(ret == -1){
218
182
      perror("sigaddset");
219
 
      exitstatus = EX_OSERR;
220
183
      goto failure;
221
184
    }
222
185
    ret = sigaddset(&new_action.sa_mask, SIGTERM);
223
186
    if(ret == -1){
224
187
      perror("sigaddset");
225
 
      exitstatus = EX_OSERR;
226
188
      goto failure;
227
189
    }
228
190
    ret = sigaction(SIGINT, NULL, &old_action);
229
191
    if(ret == -1){
230
192
      perror("sigaction");
231
 
      exitstatus = EX_OSERR;
232
193
      goto failure;
233
194
    }
234
195
    if(old_action.sa_handler != SIG_IGN){
235
196
      ret = sigaction(SIGINT, &new_action, NULL);
236
197
      if(ret == -1){
237
198
        perror("sigaction");
238
 
        exitstatus = EX_OSERR;
239
199
        goto failure;
240
200
      }
241
201
    }
242
202
    ret = sigaction(SIGHUP, NULL, &old_action);
243
203
    if(ret == -1){
244
204
      perror("sigaction");
245
 
      exitstatus = EX_OSERR;
246
205
      goto failure;
247
206
    }
248
207
    if(old_action.sa_handler != SIG_IGN){
249
208
      ret = sigaction(SIGHUP, &new_action, NULL);
250
209
      if(ret == -1){
251
210
        perror("sigaction");
252
 
        exitstatus = EX_OSERR;
253
211
        goto failure;
254
212
      }
255
213
    }
256
214
    ret = sigaction(SIGTERM, NULL, &old_action);
257
215
    if(ret == -1){
258
216
      perror("sigaction");
259
 
      exitstatus = EX_OSERR;
260
217
      goto failure;
261
218
    }
262
219
    if(old_action.sa_handler != SIG_IGN){
263
220
      ret = sigaction(SIGTERM, &new_action, NULL);
264
221
      if(ret == -1){
265
222
        perror("sigaction");
266
 
        exitstatus = EX_OSERR;
267
223
        goto failure;
268
224
      }
269
225
    }
280
236
  }
281
237
  if(splashy_command_pid == -1){
282
238
    perror("fork");
283
 
    exitstatus = EX_OSERR;
284
239
    goto failure;
285
240
  }
286
241
  /* Child */
365
320
      ret = dup2(STDERR_FILENO, STDOUT_FILENO); /* replace stdout */
366
321
      if(ret == -1){
367
322
        perror("dup2");
368
 
        _exit(EX_OSERR);
 
323
        _exit(EXIT_FAILURE);
369
324
      }
370
 
      
 
325
    
371
326
      execl("/sbin/splashy", "/sbin/splashy", "boot", (char *)NULL);
372
 
      {
373
 
        int e = errno;
374
 
        perror("execl");
375
 
        switch(e){
376
 
        case EACCES:
377
 
        case ENOENT:
378
 
        case ENOEXEC:
379
 
        default:
380
 
          _exit(EX_UNAVAILABLE);
381
 
        case ENAMETOOLONG:
382
 
        case E2BIG:
383
 
        case ENOMEM:
384
 
          _exit(EX_OSERR);
385
 
        case ENOTDIR:
386
 
        case ELOOP:
387
 
          _exit(EX_OSFILE);
388
 
        }
389
 
      }
 
327
      perror("execl");
 
328
      _exit(EXIT_FAILURE);
390
329
    }
391
330
  }
392
331
  
409
348
    TEMP_FAILURE_RETRY(pause());
410
349
  }
411
350
  
412
 
  return exitstatus;
 
351
  return EXIT_FAILURE;
413
352
}