コード例 #1
0
ファイル: sockets.c プロジェクト: jinzhangf/wldbg
int
server_mode_change_sockets(struct wldbg *wldbg)
{
	int fd;
	char *orig_socket;
	char *new_socket;
	const char *wayland_display = getenv("WAYLAND_DISPLAY");

	if (!wayland_display)
		wayland_display = "wayland-0";

	orig_socket = get_socket_path(wayland_display);
	new_socket = get_socket_path(WLDBG_SERVER_MODE_SOCKET_NAME);

	if (!orig_socket || ! new_socket)
		goto err;

	dbg("Renaming wayland socket: %s -> %s\n",
	    orig_socket, new_socket);

	/* rename the socket */
	if (rename(orig_socket, new_socket) < 0) {
		perror("renaming wayland socket");
		fprintf(stderr, "Is any wayland compositor running? "
		        "If so, try setting WAYLAND_DISPLAY\n");
		goto err;
	}

	/* this will make new clients connect to new_socket
	 * instead of orig_socket */
	wldbg->server_mode.old_socket_path = orig_socket;
	wldbg->server_mode.wldbg_socket_path = new_socket;
	wldbg->server_mode.old_socket_name = strdup(wayland_display);
	wldbg->server_mode.wldbg_socket_name = strdup(WLDBG_SERVER_MODE_SOCKET_NAME);

	dbg("Creating fake socket: %s\n", orig_socket);

	/* create new fake socket */
	fd = server_mode_add_socket(wldbg, orig_socket);
	if (fd == -1)
		goto err;

	wldbg->server_mode.fd = fd;

	return fd;

err:
	free(orig_socket);
	free(new_socket);
	return -1;
}
コード例 #2
0
ファイル: server.c プロジェクト: gordio/ccode
void server_main()
{
	struct sigaction sa;
	int sock;

	sock_path = get_socket_path();
	sock = create_server_socket(sock_path);
	if (sock == -1) {
		fprintf(stderr, "Error! Failed to create a server socket: %s\n",
			sock_path->data);
		exit(1);
	}

	sa.sa_handler = handle_sigint;
	sa.sa_flags = 0;
	sigaction(SIGINT, &sa, 0);

	clang_index = clang_createIndex(0, 0);
	server_loop(sock);
	if (clang_tu)
		clang_disposeTranslationUnit(clang_tu);
	clang_disposeIndex(clang_index);

	close(sock);
	unlink(sock_path->data);
	str_free(sock_path);
}
コード例 #3
0
ファイル: eal_pci_vfio_mp_sync.c プロジェクト: dex/dpdk
/* connect socket_fd in secondary process to the primary process's socket */
int
vfio_mp_sync_connect_to_primary(void)
{
	struct sockaddr_un addr;
	socklen_t sockaddr_len;
	int socket_fd;

	/* set up a socket */
	socket_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
	if (socket_fd < 0) {
		RTE_LOG(ERR, EAL, "Failed to create socket!\n");
		return -1;
	}

	get_socket_path(addr.sun_path, sizeof(addr.sun_path));
	addr.sun_family = AF_UNIX;

	sockaddr_len = sizeof(struct sockaddr_un);

	if (connect(socket_fd, (struct sockaddr *) &addr, sockaddr_len) == 0)
		return socket_fd;

	/* if connect failed */
	close(socket_fd);
	return -1;
}
コード例 #4
0
ファイル: daemon.c プロジェクト: kbob/kerfburn
static void shutdown_service(void)
{
    const char *sockdir = get_socket_dir();
    const char *sockpath = get_socket_path();
    (void)close(listen_socket);
    (void)unlink(sockpath);
    (void)rmdir(sockdir);
}
コード例 #5
0
ファイル: eal_pci_vfio_mp_sync.c プロジェクト: dex/dpdk
static int
vfio_mp_sync_socket_setup(void)
{
	int ret, socket_fd;
	struct sockaddr_un addr;
	socklen_t sockaddr_len;

	/* set up a socket */
	socket_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
	if (socket_fd < 0) {
		RTE_LOG(ERR, EAL, "Failed to create socket!\n");
		return -1;
	}

	get_socket_path(addr.sun_path, sizeof(addr.sun_path));
	addr.sun_family = AF_UNIX;

	sockaddr_len = sizeof(struct sockaddr_un);

	unlink(addr.sun_path);

	ret = bind(socket_fd, (struct sockaddr *) &addr, sockaddr_len);
	if (ret) {
		RTE_LOG(ERR, EAL, "Failed to bind socket: %s!\n", strerror(errno));
		close(socket_fd);
		return -1;
	}

	ret = listen(socket_fd, 50);
	if (ret) {
		RTE_LOG(ERR, EAL, "Failed to listen: %s!\n", strerror(errno));
		close(socket_fd);
		return -1;
	}

	/* save the socket in local configuration */
	mp_socket_fd = socket_fd;

	return 0;
}
コード例 #6
0
int cmd_main(int argc, const char **argv)
{
	char *socket_path = NULL;
	int timeout = 900;
	const char *op;
	const char * const usage[] = {
		"git credential-cache [<options>] <action>",
		NULL
	};
	struct option options[] = {
		OPT_INTEGER(0, "timeout", &timeout,
			    "number of seconds to cache credentials"),
		OPT_STRING(0, "socket", &socket_path, "path",
			   "path of cache-daemon socket"),
		OPT_END()
	};

	argc = parse_options(argc, argv, NULL, options, usage, 0);
	if (!argc)
		usage_with_options(usage, options);
	op = argv[0];

	if (!socket_path)
		socket_path = get_socket_path();
	if (!socket_path)
		die("unable to find a suitable socket path; use --socket");

	if (!strcmp(op, "exit"))
		do_cache(socket_path, op, timeout, 0);
	else if (!strcmp(op, "get") || !strcmp(op, "erase"))
		do_cache(socket_path, op, timeout, FLAG_RELAY);
	else if (!strcmp(op, "store"))
		do_cache(socket_path, op, timeout, FLAG_RELAY|FLAG_SPAWN);
	else
		; /* ignore unknown operation */

	return 0;
}
コード例 #7
0
ファイル: client.c プロジェクト: gordio/ccode
static int connect_or_die()
{
	str_t *path;
	int sock;

	path = get_socket_path();

	if (!file_exists(path->data))
		run_server_and_wait(path->data);

	sock = create_client_socket();
	if (sock == -1) {
		fprintf(stderr, "Error! Failed to create a client socket: %s\n", path->data);
		exit(1);
	}

	if (-1 == try_connect(sock, (char*)path->data)) {
		fprintf(stderr, "Error! Failed to connect to a server at: %s\n", path->data);
		exit(1);
	}
	str_free(path);
	return sock;
}
コード例 #8
0
ファイル: sockets.c プロジェクト: jinzhangf/wldbg
int server_mode_add_socket_with_lock(struct wldbg *wldbg, const char *name)
{
	int sock;
	char *path;

	path = get_socket_path(name);
	if (!path)
		return -1;

	wldbg->server_mode.wldbg_socket_path = path;

	sock = server_mode_add_socket(wldbg, path);
	if (sock < 0)
		return -1;

	dbg("Taking lock on socket: %s\n", path);
	if (socket_lock(wldbg, path) < 0) {
		fprintf(stderr, "Failed locking socket\n");
		close(sock);
		return -1;
	}

	return sock;
}
コード例 #9
0
ファイル: daemon.c プロジェクト: kbob/kerfburn
static int init_service(void)
{
    int r = 0;
    const char *sockdir = get_socket_dir();
    const char *sockpath = get_socket_path();
    struct sockaddr_un sun;
    if (strlen(sockpath) >= sizeof sun.sun_path) {
        fprintf(stderr, "port name too long\n");
        return -1;
    }
    struct stat s;
    if (lstat(sockdir, &s) < 0 || !S_ISDIR(s.st_mode)) {
        (void)unlink(sockdir);
        (void)rmdir(sockdir);
        if (mkdir(sockdir, 0700) < 0 && errno != EEXIST) {
            syslog(LOG_ERR, "mkdir %s failed: %m", sockdir);
            return -1;
        }
        if (lstat(sockdir, &s) < 0) {
            syslog(LOG_ERR, "lstat %s failed: %m", sockdir);
            return -1;
        }
        if (s.st_mode != 040700 || s.st_uid != geteuid()) {
            syslog(LOG_ERR,
                   "%s has wrong user/mode.  Expected %d/%0o, got %d/%0o.",
                   sockdir, geteuid(), 040700, s.st_uid, s.st_mode);
            return -1;
        }
    }
    (void)unlink(sockpath);
    listen_socket = socket(AF_UNIX, SOCK_STREAM, 0);
    if (listen_socket < 0) {
        syslog(LOG_ERR, "listener socket failed: %m");
        (void)rmdir(sockdir);
        return -1;
    }
    sun.sun_family = AF_UNIX;
    strncpy(sun.sun_path, sockpath, sizeof sun.sun_path);
    if (bind(listen_socket, (struct sockaddr *)&sun, sizeof sun) < 0) {
        syslog(LOG_ERR, "bind to %s failed: %m", sun.sun_path);
        (void)rmdir(sockdir);
        return -1;
    }
    if (atexit(shutdown_service) != 0) {
        syslog(LOG_ERR, "atexit failed: %m");
        shutdown_service();
        return -1;
    }
    if (listen(listen_socket, 1)) {
        syslog(LOG_ERR, "listen failed: %m");
        return -1;
    }

    // Start acceptor thread.
    r = pthread_create(&acceptor_thread, NULL, acceptor_thread_main, NULL);
    if (r) {
        syslog(LOG_ERR, "can't create acceptor thread: %s", strerror(r));
        return -1;
    }    

    r = pthread_detach(acceptor_thread);
    if (r) {
        syslog(LOG_ERR, "can't detach acceptor thread: %s", strerror(r));
        return -1;
    }

    return 0;
}