Пример #1
0
int main(int argc, char **argv)
{
	// Default program parameters
	int port = 8080;
	char* pwd = "./static/";

	// Print help if needed
	if (argc >= 2 && strcmp(argv[1], "--help") == 0) {
		printf("Usage: nweb <port> <root_dir>\t\tversion %d\n\n"
			"\tnweb is a small and very safe mini web server\n"
			"\tnweb only servers out file/web pages with extensions named below\n"
			"\t and only from the root directory or its sub-directories.\n"
			"\tThere is no fancy features = safe and secure.\n\n"
			"\tExample: nweb 8080 /home/foo &\n\n"
			"\tOnly Supports:", VERSION);
		for(int i=0; extensions[i].ext != 0; i++)
			printf(" %s", extensions[i].ext);

		printf("\n\tNot Supported: URLs including \"..\", Java, Javascript, CGI\n"
			"\tNot Supported: directories / /etc /bin /lib /tmp /usr /dev /sbin \n"
			"\tNo warranty given or implied\n\tNigel Griffiths [email protected]\n");
		return 0;
	}

	fprintf(stderr, "The default port is %d; the default serving directory is `%s`.\n", port, pwd);
	fprintf(stderr, "For information, use --help flag.\n\n");

	if (argc > 1) port = atoi(argv[1]);
	if (argc > 2) {
		if(!strncmp(argv[2],"/",2 ) || !strncmp(argv[2],"/etc", 5 ) ||
			!strncmp(argv[2],"/bin",5 ) || !strncmp(argv[2],"/lib", 5 ) ||
			!strncmp(argv[2],"/tmp",5 ) || !strncmp(argv[2],"/usr", 5 ) ||
			!strncmp(argv[2],"/dev",5 ) || !strncmp(argv[2],"/sbin",6) ) {
			printf("ERROR: Bad top directory %s, see nweb -?\n", argv[2]);
			return -1;
		}
		pwd = argv[2];
	}

	init_event_loop();
	init_server(port, pwd);
	run_event_loop();
}
Пример #2
0
int main(int argc, const char *argv[])
{
    int opt;
    poptContext pc;
    int opt_daemon = 0;
    int opt_interactive = 0;
    int opt_version = 0;
    char *opt_config_file = NULL;
    int opt_debug = 0;
    verto_ctx *vctx;
    verto_ev *ev;
    int vflags;
    struct gssproxy_ctx *gpctx;
    struct gp_sock_ctx *sock_ctx;
    int wait_fd;
    int ret;
    int i;

    struct poptOption long_options[] = {
        POPT_AUTOHELP
        {"daemon", 'D', POPT_ARG_NONE, &opt_daemon, 0, \
         _("Become a daemon (default)"), NULL }, \
        {"interactive", 'i', POPT_ARG_NONE, &opt_interactive, 0, \
         _("Run interactive (not a daemon)"), NULL}, \
        {"config", 'c', POPT_ARG_STRING, &opt_config_file, 0, \
         _("Specify a non-default config file"), NULL}, \
        {"debug", 'd', POPT_ARG_NONE, &opt_debug, 0, \
         _("Enable debugging"), NULL}, \
         {"version", '\0', POPT_ARG_NONE, &opt_version, 0, \
          _("Print version number and exit"), NULL }, \
        POPT_TABLEEND
    };

    pc = poptGetContext(argv[0], argc, argv, long_options, 0);
    while((opt = poptGetNextOpt(pc)) != -1) {
        switch(opt) {
        default:
            fprintf(stderr, "\nInvalid option %s: %s\n\n",
                    poptBadOption(pc, 0), poptStrerror(opt));
            poptPrintUsage(pc, stderr, 0);
            return 1;
        }
    }

    if (opt_version) {
        puts(VERSION""DISTRO_VERSION""PRERELEASE_VERSION);
        return 0;
    }

    if (opt_debug) {
        gp_debug_enable();
    }

    if (opt_daemon && opt_interactive) {
        fprintf(stderr, "Option -i|--interactive is not allowed together with -D|--daemon\n");
        poptPrintUsage(pc, stderr, 0);
        return 1;
    }

    if (opt_interactive) {
        opt_daemon = 2;
    }

    gpctx = calloc(1, sizeof(struct gssproxy_ctx));

    gpctx->config = read_config(opt_config_file, opt_daemon);
    if (!gpctx->config) {
        exit(EXIT_FAILURE);
    }

    init_server(gpctx->config->daemonize, &wait_fd);

    write_pid();

    vctx = init_event_loop();
    if (!vctx) {
        fprintf(stderr, "Failed to initialize event loop. "
                        "Is there at least one libverto backend installed?\n");
        return 1;
    }
    gpctx->vctx = vctx;

    /* init main socket */
    sock_ctx = init_unix_socket(gpctx, gpctx->config->socket_name);
    if (!sock_ctx) {
        return 1;
    }

    vflags = VERTO_EV_FLAG_PERSIST | VERTO_EV_FLAG_IO_READ;
    ev = verto_add_io(vctx, vflags, accept_sock_conn, sock_ctx->fd);
    if (!ev) {
        return 1;
    }
    verto_set_private(ev, sock_ctx, NULL);

    /* init secondary sockets */
    for (i = 0; i < gpctx->config->num_svcs; i++) {
        if (gpctx->config->svcs[i]->socket != NULL) {
            sock_ctx = init_unix_socket(gpctx, gpctx->config->svcs[i]->socket);
            if (!sock_ctx) {
                return 1;
            }

            vflags = VERTO_EV_FLAG_PERSIST | VERTO_EV_FLAG_IO_READ;
            ev = verto_add_io(vctx, vflags, accept_sock_conn, sock_ctx->fd);
            if (!ev) {
                return 1;
            }
            verto_set_private(ev, sock_ctx, NULL);
        }
    }

    /* We need to tell nfsd that GSS-Proxy is available before it starts,
     * as nfsd needs to know GSS-Proxy is in use before the first time it
     * needs to call accept_sec_context. */
    init_proc_nfsd(gpctx->config);

    /* Now it is safe to tell the init system that we're done starting up,
     * so it can continue with dependencies and start nfsd */
    init_done(wait_fd);

    ret = drop_privs(gpctx->config);
    if (ret) {
        exit(EXIT_FAILURE);
    }

    ret = gp_workers_init(gpctx);
    if (ret) {
        exit(EXIT_FAILURE);
    }

    verto_run(vctx);

    gp_workers_free(gpctx->workers);

    fini_server();

    poptFreeContext(pc);

    free_config(&gpctx->config);

    return 0;
}