/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/plymouth.c

  • Committer: Teddy Hogeborn
  • Date: 2011-12-31 20:07:11 UTC
  • mfrom: (535.1.9 wireless-network-hook)
  • Revision ID: teddy@recompile.se-20111231200711-6dli3r8drftem57r
Merge new wireless network hook.  Fix bridge network hook to use
hardware addresses instead of interface names.  Implement and document
new "CONNECT" environment variable for network hooks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 * along with this program.  If not, see
20
20
 * <http://www.gnu.org/licenses/>.
21
21
 * 
22
 
 * Contact the authors at <mandos@fukt.bsnet.se>.
 
22
 * Contact the authors at <mandos@recompile.se>.
23
23
 */
24
24
 
25
25
#define _GNU_SOURCE             /* asprintf(), TEMP_FAILURE_RETRY() */
54
54
#include <stdarg.h>             /* va_list, va_start(), ... */
55
55
 
56
56
sig_atomic_t interrupted_by_signal = 0;
57
 
const char plymouth_pid[] = "/dev/.initramfs/plymouth.pid";
 
57
 
 
58
/* Used by Ubuntu 11.04 (Natty Narwahl) */
 
59
const char plymouth_old_pid[] = "/dev/.initramfs/plymouth.pid";
 
60
/* Used by Ubuntu 11.10 (Oneiric Ocelot) */
 
61
const char plymouth_pid[] = "/run/initramfs/plymouth.pid";
 
62
 
58
63
const char plymouth_path[] = "/bin/plymouth";
59
64
const char plymouthd_path[] = "/sbin/plymouthd";
60
65
const char *plymouthd_default_argv[] = {"/sbin/plymouthd",
61
66
                                        "--mode=boot",
62
67
                                        "--attach-to-session",
63
 
                                        "--pid-file="
64
 
                                        "/dev/.initramfs/"
65
 
                                        "plymouth.pid",
66
68
                                        NULL };
67
69
 
68
70
static void termination_handler(__attribute__((unused))int signum){
73
75
}
74
76
 
75
77
/* Function to use when printing errors */
 
78
__attribute__((format (gnu_printf, 3, 4)))
76
79
void error_plus(int status, int errnum, const char *formatstring,
77
80
                ...){
78
81
  va_list ap;
151
154
  return true;
152
155
}
153
156
 
 
157
__attribute__((nonnull (2, 3)))
154
158
bool exec_and_wait(pid_t *pid_return, const char *path,
155
159
                   const char **argv, bool interruptable,
156
160
                   bool daemonize){
210
214
  return false;
211
215
}
212
216
 
 
217
__attribute__((nonnull))
213
218
int is_plymouth(const struct dirent *proc_entry){
214
219
  int ret;
215
220
  {
216
 
    uintmax_t maxvalue;
 
221
    uintmax_t proc_id;
217
222
    char *tmp;
218
223
    errno = 0;
219
 
    maxvalue = strtoumax(proc_entry->d_name, &tmp, 10);
 
224
    proc_id = strtoumax(proc_entry->d_name, &tmp, 10);
220
225
 
221
226
    if(errno != 0 or *tmp != '\0'
222
 
       or maxvalue != (uintmax_t)((pid_t)maxvalue)){
 
227
       or proc_id != (uintmax_t)((pid_t)proc_id)){
223
228
      return 0;
224
229
    }
225
230
  }
260
265
 
261
266
pid_t get_pid(void){
262
267
  int ret;
 
268
  uintmax_t proc_id = 0;
263
269
  FILE *pidfile = fopen(plymouth_pid, "r");
264
 
  uintmax_t maxvalue = 0;
 
270
  /* Try the new pid file location */
265
271
  if(pidfile != NULL){
266
 
    ret = fscanf(pidfile, "%" SCNuMAX, &maxvalue);
 
272
    ret = fscanf(pidfile, "%" SCNuMAX, &proc_id);
267
273
    if(ret != 1){
268
 
      maxvalue = 0;
 
274
      proc_id = 0;
269
275
    }
270
276
    fclose(pidfile);
271
277
  }
272
 
  if(maxvalue == 0){
 
278
  /* Try the old pid file location */
 
279
  if(proc_id == 0){
 
280
    pidfile = fopen(plymouth_pid, "r");
 
281
    if(pidfile != NULL){
 
282
      ret = fscanf(pidfile, "%" SCNuMAX, &proc_id);
 
283
      if(ret != 1){
 
284
        proc_id = 0;
 
285
      }
 
286
      fclose(pidfile);
 
287
    }
 
288
  }
 
289
  /* Look for a plymouth process */
 
290
  if(proc_id == 0){
273
291
    struct dirent **direntries = NULL;
274
292
    ret = scandir("/proc", &direntries, is_plymouth, alphasort);
275
293
    if (ret == -1){
276
294
      error_plus(0, errno, "scandir");
277
295
    }
278
296
    if (ret > 0){
279
 
      ret = sscanf(direntries[0]->d_name, "%" SCNuMAX, &maxvalue);
 
297
      ret = sscanf(direntries[0]->d_name, "%" SCNuMAX, &proc_id);
280
298
      if (ret < 0){
281
299
        error_plus(0, errno, "sscanf");
282
300
      }
286
304
    free(direntries);
287
305
  }
288
306
  pid_t pid;
289
 
  pid = (pid_t)maxvalue;
290
 
  if((uintmax_t)pid == maxvalue){
 
307
  pid = (pid_t)proc_id;
 
308
  if((uintmax_t)pid == proc_id){
291
309
    return pid;
292
310
  }
293
311