/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

  • Committer: Teddy Hogeborn
  • Date: 2009-10-18 08:47:40 UTC
  • Revision ID: teddy@fukt.bsnet.se-20091018084740-fa1qgm22lg125r10
* plugins.d/splashy.c: Use exit codes from <sysexits.h>.

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
 
50
53
sig_atomic_t interrupted_by_signal = 0;
51
54
int signal_received;
52
55
 
65
68
  DIR *proc_dir = NULL;
66
69
  pid_t splashy_pid = 0;
67
70
  pid_t splashy_command_pid = 0;
 
71
  int exitstatus = EXIT_FAILURE;
68
72
  
69
73
  /* Create prompt string */
70
74
  {
90
94
    }
91
95
    if(ret == -1){
92
96
      prompt = NULL;
 
97
      exitstatus = EX_OSERR;
93
98
      goto failure;
94
99
    }
95
100
  }
99
104
    const char splashy_name[] = "/sbin/splashy";
100
105
    proc_dir = opendir("/proc");
101
106
    if(proc_dir == NULL){
 
107
      int e = errno;
102
108
      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
      }
103
124
      goto failure;
104
125
    }
105
126
    for(struct dirent *proc_ent = readdir(proc_dir);
127
148
        ret = asprintf(&exe_link, "/proc/%s/exe", proc_ent->d_name);
128
149
        if(ret == -1){
129
150
          perror("asprintf");
 
151
          exitstatus = EX_OSERR;
130
152
          goto failure;
131
153
        }
132
154
        
138
160
            free(exe_link);
139
161
            continue;
140
162
          }
 
163
          int e = errno;
141
164
          perror("lstat");
142
165
          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
          }
143
177
          goto failure;
144
178
        }
145
179
        if(not S_ISLNK(exe_stat.st_mode)
163
197
    proc_dir = NULL;
164
198
  }
165
199
  if(splashy_pid == 0){
 
200
    exitstatus = EX_UNAVAILABLE;
166
201
    goto failure;
167
202
  }
168
203
  
175
210
    ret = sigaddset(&new_action.sa_mask, SIGINT);
176
211
    if(ret == -1){
177
212
      perror("sigaddset");
 
213
      exitstatus = EX_OSERR;
178
214
      goto failure;
179
215
    }
180
216
    ret = sigaddset(&new_action.sa_mask, SIGHUP);
181
217
    if(ret == -1){
182
218
      perror("sigaddset");
 
219
      exitstatus = EX_OSERR;
183
220
      goto failure;
184
221
    }
185
222
    ret = sigaddset(&new_action.sa_mask, SIGTERM);
186
223
    if(ret == -1){
187
224
      perror("sigaddset");
 
225
      exitstatus = EX_OSERR;
188
226
      goto failure;
189
227
    }
190
228
    ret = sigaction(SIGINT, NULL, &old_action);
191
229
    if(ret == -1){
192
230
      perror("sigaction");
 
231
      exitstatus = EX_OSERR;
193
232
      goto failure;
194
233
    }
195
234
    if(old_action.sa_handler != SIG_IGN){
196
235
      ret = sigaction(SIGINT, &new_action, NULL);
197
236
      if(ret == -1){
198
237
        perror("sigaction");
 
238
        exitstatus = EX_OSERR;
199
239
        goto failure;
200
240
      }
201
241
    }
202
242
    ret = sigaction(SIGHUP, NULL, &old_action);
203
243
    if(ret == -1){
204
244
      perror("sigaction");
 
245
      exitstatus = EX_OSERR;
205
246
      goto failure;
206
247
    }
207
248
    if(old_action.sa_handler != SIG_IGN){
208
249
      ret = sigaction(SIGHUP, &new_action, NULL);
209
250
      if(ret == -1){
210
251
        perror("sigaction");
 
252
        exitstatus = EX_OSERR;
211
253
        goto failure;
212
254
      }
213
255
    }
214
256
    ret = sigaction(SIGTERM, NULL, &old_action);
215
257
    if(ret == -1){
216
258
      perror("sigaction");
 
259
      exitstatus = EX_OSERR;
217
260
      goto failure;
218
261
    }
219
262
    if(old_action.sa_handler != SIG_IGN){
220
263
      ret = sigaction(SIGTERM, &new_action, NULL);
221
264
      if(ret == -1){
222
265
        perror("sigaction");
 
266
        exitstatus = EX_OSERR;
223
267
        goto failure;
224
268
      }
225
269
    }
236
280
  }
237
281
  if(splashy_command_pid == -1){
238
282
    perror("fork");
 
283
    exitstatus = EX_OSERR;
239
284
    goto failure;
240
285
  }
241
286
  /* Child */
320
365
      ret = dup2(STDERR_FILENO, STDOUT_FILENO); /* replace stdout */
321
366
      if(ret == -1){
322
367
        perror("dup2");
323
 
        _exit(EXIT_FAILURE);
 
368
        _exit(EX_OSERR);
324
369
      }
325
 
    
 
370
      
326
371
      execl("/sbin/splashy", "/sbin/splashy", "boot", (char *)NULL);
327
 
      perror("execl");
328
 
      _exit(EXIT_FAILURE);
 
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
      }
329
390
    }
330
391
  }
331
392
  
348
409
    TEMP_FAILURE_RETRY(pause());
349
410
  }
350
411
  
351
 
  return EXIT_FAILURE;
 
412
  return exitstatus;
352
413
}