~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to bin/trampoline/trampoline.c

  • Committer: William Grant
  • Date: 2010-02-25 07:34:50 UTC
  • Revision ID: grantw@unimelb.edu.au-20100225073450-zcl8ev5hlyhbszeu
Activate the Storm C extensions if possible. Moar speed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 * Scripts (such as Python programs) should be executed by supplying
28
28
 * "/usr/bin/python" as the program, and the script as the first argument.
29
29
 *
30
 
 * Usage: trampoline uid jail-path working-path program [args...]
31
30
 * Must run as root. Will safely setuid to the supplied uid, checking that it
32
31
 * is not root. Recommended that the file is set up as follows:
33
32
 *  sudo chown root:root trampoline; sudo chroot +s trampoline
34
33
 */
35
34
 
36
35
#define _XOPEN_SOURCE
 
36
#define _BSD_SOURCE
37
37
 
38
38
#include <stdio.h>
39
39
#include <stdlib.h>
45
45
#include <sys/stat.h>
46
46
#include <sys/time.h>
47
47
#include <sys/resource.h>
 
48
#include <grp.h>
48
49
#include <limits.h>
49
50
#include <signal.h>
50
51
 
122
123
{
123
124
    fprintf(stderr,
124
125
        "usage: %s [-d] [-u] <uid> <base> <src> <system> <jail> <cwd> <program> [args...]\n", nm);
 
126
    fprintf(stderr, "  -d       \tDaemonize\n");
 
127
    fprintf(stderr, "  -u       \tPrint usage\n");
 
128
    fprintf(stderr, "  <uid>    \tUID to run program as\n");
 
129
    fprintf(stderr, "  <base>   \tDirectory that jails will be mounted in\n");
 
130
    fprintf(stderr, "  <src>    \tDirectory containing users jail data\n");
 
131
    fprintf(stderr, "  <system> \tDirectory containing main jail file system\n");
 
132
    fprintf(stderr, "  <jail>   \tDirectory of users mounted jail\n");
 
133
    fprintf(stderr, "  <cwd>    \tDirectory inside the jail to change dir to\n");
 
134
    fprintf(stderr, "  <program>\tProgram inside jail to execute\n");
125
135
    exit(1);
126
136
}
127
137
 
250
260
    char* prog;
251
261
    char* const * args;
252
262
    int uid;
 
263
    gid_t groups[1];
253
264
    int arg_num = 1;
254
265
    int daemon_mode = 0;
255
266
    int unlimited = 0;
349
360
        perror("could not setgid");
350
361
        exit(1);
351
362
    }
 
363
    
 
364
    groups[0] = uid;
 
365
    if (setgroups(1, groups))
 
366
    {
 
367
        perror("could not setgroups");
 
368
        exit(1);
 
369
    }
352
370
 
353
371
    if (setuid(uid))
354
372
    {
361
379
    {
362
380
        struct rlimit l;
363
381
        /* Process adress space in memory */
364
 
        l.rlim_cur = 192 * 1024 * 1024; /* 192MiB */
365
 
        l.rlim_max = 256 * 1024 * 1024; /* 256MiB */
 
382
        l.rlim_cur = 448 * 1024 * 1024; /* 512MiB - 64MiB */
 
383
        l.rlim_max = 512 * 1024 * 1024; /* 512MiB */
366
384
        if (setrlimit(RLIMIT_AS, &l))
367
385
        {
368
386
            perror("could not setrlimit/RLIMIT_AS");
373
391
         * Note: This requires a kernel patch to work correctly otherwise it is  
374
392
         * ineffective (thus you are only limited by RLIMIT_AS)
375
393
         */
376
 
        l.rlim_cur = 192 * 1024 * 1024; /* 192MiB */
377
 
        l.rlim_max = 256 * 1024 * 1024; /* 256MiB */
 
394
        l.rlim_cur = 448 * 1024 * 1024; /* 512MiB - 64MiB */
 
395
        l.rlim_max = 512 * 1024 * 1024; /* 512MiB */
378
396
        if (setrlimit(RLIMIT_DATA, &l))
379
397
        {
380
398
            perror("could not setrlimit/RLIMIT_DATA");
402
420
        /* File Size */
403
421
        l.rlim_cur = 64 * 1024 * 1024; /* 64MiB */
404
422
        l.rlim_max = 72 * 1024 * 1024; /* 72MiB */
405
 
if (setrlimit(RLIMIT_FSIZE, &l))
 
423
        if (setrlimit(RLIMIT_FSIZE, &l))
406
424
        {
407
425
            perror("could not setrlimit/RLIMIT_FSIZE");
408
426
            exit(1);
409
427
        }
 
428
        
 
429
        /* Number of Processes */
 
430
        l.rlim_cur = 50;
 
431
        l.rlim_max = 50;
 
432
        if (setrlimit(RLIMIT_NPROC, &l))
 
433
        {
 
434
            perror("could not setrlimit/RLIMIT_NPROC");
 
435
            exit(1);
 
436
        }
410
437
    }
411
438
 
412
439
    /* Remove any signal handler masks so we can send signals to the child */