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; }
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); }
/* 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; }
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); }
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; }
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; }
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; }
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; }
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; }