コード例 #1
0
ファイル: netlink_handler.c プロジェクト: CHINA-F802B6B0D/god
void
Init_netlink_handler_ext()
{ 
  proc_exit = rb_intern("proc_exit");
  proc_fork = rb_intern("proc_fork");
  m_call = rb_intern("call");
  m_watching_pid = rb_intern("watching_pid?");
  
  mGod = rb_const_get(rb_cObject, rb_intern("God"));
  cEventHandler = rb_const_get(mGod, rb_intern("EventHandler"));
  cNetlinkHandler = rb_define_class_under(mGod, "NetlinkHandler", rb_cObject);
  rb_define_singleton_method(cNetlinkHandler, "handle_events", nlh_handle_events, 0);
  
  connect_to_netlink();
}
コード例 #2
0
ファイル: dev9.c プロジェクト: kyuba/dev9
int cmain() {
    int i;
    struct dfs *fs;
    char use_stdio = 0;
    char mount_self = 0;
    char *use_socket = (char *)0;
    char next_socket = 0;
    char had_rules_file = 0;
    char initialise_common = 0;
    char o_foreground = 0;

//    terminate_on_allocation_errors();

    multiplex_io();
    dfs_update_ids();

    multiplex_sexpr();

    for (i = 1; curie_argv[i]; i++) {
        if (curie_argv[i][0] == '-')
        {
            int j;
            for (j = 1; curie_argv[i][j] != (char)0; j++) {
                switch (curie_argv[i][j])
                {
                    case 'o': use_stdio = 1; break;
                    case 'p':
                        sys_mount ("proc", "/proc", "proc", 0, (char *)0);
                        sys_mount ("sys", "/sys", "sysfs", 0, (char *)0);
                        break;
                    case 'i': initialise_common = 1; break;
                    case 'm': mount_self = 1; break;
                    case 's': next_socket = 1; break;
                    case 'f': o_foreground = 1; break;
                    default:
                        print_help();
                }
            }
            continue;
        }

        if (next_socket)
        {
            use_socket = curie_argv[i];
            next_socket = 0;
            continue;
        }

        multiplex_add_sexpr(sx_open_io (io_open_read (curie_argv[i]),
                                        io_open (-1)),
                            on_rules_read, (void *)0);
        while (multiplex() != mx_nothing_to_do);
        had_rules_file = 1;
    }

    if ((use_socket == (char *)0) && (use_stdio == 0) && (mount_self == 0))
    {
        print_help();
    }

    if (!had_rules_file)
    {
        multiplex_add_sexpr(sx_open_io (io_open_read (DEFAULT_RULES), io_open (-1)),
                            on_rules_read, (void *)0);
        while (multiplex() != mx_nothing_to_do);
    }

    fs = dfs_create ((void *)0, (void *)0);
    fs->root->c.mode |= 0111;

    struct dfs_directory *d_dev9 = dfs_mk_directory (fs->root, "dev9");
    struct dfs_file *d_dev9_ctl  = dfs_mk_file (d_dev9, "control", (char *)0,
            (int_8 *)"(nop)\n", 6, (void *)0, (void *)0, on_control_write);

    queue_io = io_open_special();
    d_dev9->c.mode     = 0550;
    d_dev9->c.uid      = "dev9";
    d_dev9->c.gid      = "dev9";
    d_dev9_ctl->c.mode = 0660;
    d_dev9_ctl->c.uid  = "dev9";
    d_dev9_ctl->c.gid  = "dev9";

    queue = sx_open_io (queue_io, queue_io);

    multiplex_add_sexpr (queue, mx_sx_ctl_queue_read, (void *)0);

    if (initialise_common)
    {
        struct dfs_directory *d;
        d = dfs_mk_directory (fs->root, "pts");
        d->c.mode |= 0111;
        d = dfs_mk_directory (fs->root, "shm");
        d->c.mode |= 0111;

        dfs_mk_symlink (fs->root, "fd",     "/proc/self/fd");
        dfs_mk_symlink (fs->root, "stdin",  "fd/0");
        dfs_mk_symlink (fs->root, "stdout", "fd/1");
        dfs_mk_symlink (fs->root, "stderr", "fd/2");
    }

    connect_to_netlink(fs);

    multiplex_all_processes();

    multiplex_d9s();

    if (use_stdio)
    {
        multiplex_add_d9s_stdio (fs);
    }
    else if (o_foreground == 0)
    {
        struct exec_context *context
                = execute(EXEC_CALL_NO_IO, (char **)0, (char **)0);

        switch (context->pid)
        {
            case -1:
                cexit (11);
            case 0:
                break;
            default:
                cexit (0);
        }
    }

    if (use_socket != (char *)0) {
        multiplex_add_d9s_socket (use_socket, fs);
    }

    if (mount_self)
    {
        static char options[] =
                "access=any,trans=fd,rfdno=000000,wfdno=000000";
        struct io *in, *out;
        int fdi[2], fdo[2];

        if ((sys_pipe (fdi) != -1) && (sys_pipe (fdo) != -1))
        {
            struct exec_context *context;
            in  = io_open(fdi[0]);
            out = io_open(fdo[1]);

            multiplex_add_d9s_io(in, out, fs);

            if (!((fdo[0] > 999999) || (fdi[1] > 999999) ||
                  (fdo[0] < 1)      || (fdi[1] < 1)))
            {
                int tj, ti, mn, s2 = 44;

                for (tj = 31, ti = fdo[0], mn = 6; ti > 0; tj--, ti /= 10, mn--)
                {
                    options[tj] = '0' + (ti % 10);
                }

                for (tj = 26, ti = tj + mn; options[ti]; tj++, ti++)
                {
                    options[tj] = options[ti];
                }
                options[tj] = options[ti];

                s2 -= mn;

                for (tj = s2, ti = fdi[1], mn = 6; ti > 0; tj--, ti /= 10, mn--)
                {
                    options[tj] = '0' + (ti % 10);
                }

                for (tj = s2-5, ti = tj + mn; options[ti]; tj++, ti++)
                {
                    options[tj] = options[ti];
                }
                options[tj] = options[ti];

                context = execute(EXEC_CALL_NO_IO, (char **)0, (char **)0);
                switch (context->pid)
                {
                    case -1:
                        cexit (30);
                    case 0:
                        sys_close (fdi[0]);
                        sys_close (fdo[1]);
                        sys_mount ("dev9",   "/dev",     "9p",     0, options);
                        if (initialise_common)
                        {
                            sys_mount ("devpts", "/dev/pts", "devpts", 0, (void *)0);
                            sys_mount ("shm",    "/dev/shm", "tmpfs",  0, (void *)0);
                        }
                        cexit (0);
                    default:
                        sys_close (fdo[0]);
                        sys_close (fdi[1]);
                        multiplex_add_process(context, mx_on_subprocess_death, (void *)0);
                }
            }
        }
    }

    while (multiplex() != mx_nothing_to_do);

    return 0;
}