static int log_open_syslog(void) { static const union sockaddr_union sa = { .un.sun_family = AF_UNIX, .un.sun_path = "/dev/log", }; int r; if (syslog_fd >= 0) return 0; syslog_fd = create_log_socket(SOCK_DGRAM); if (syslog_fd < 0) { r = syslog_fd; goto fail; } if (connect(syslog_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)) < 0) { safe_close(syslog_fd); /* Some legacy syslog systems still use stream * sockets. They really shouldn't. But what can we * do... */ syslog_fd = create_log_socket(SOCK_STREAM); if (syslog_fd < 0) { r = syslog_fd; goto fail; } if (connect(syslog_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)) < 0) { r = -errno; goto fail; } syslog_is_stream = true; } else syslog_is_stream = false; return 0; fail: log_close_syslog(); return r; } void log_close_journal(void) { journal_fd = safe_close(journal_fd); }
int setup_var_pid_and_sock(char *src, char *dst) { char pid_str[32]; char desc_file[64]; // By using the size of sun_path, we seek to avoid buffer overflows in file // names. struct sockaddr_un t; char sockfile[sizeof(t.sun_path)]; // Create the directory if (mkdir("/tmp/cloudmig", 0755) == -1) { if (errno != EEXIST) { PRINTERR("Could not create /tmp/cloudmig directory : %s.\n", strerror(errno)); return (EXIT_FAILURE); } } sprintf(pid_str, "/tmp/cloudmig/%hi", getpid()); if (mkdir(pid_str, 0755) == -1) { PRINTERR("Could not create %s directory : %s.\n", pid_str, strerror(errno)); if (rmdir("/tmp/cloudmig") == -1) { if (errno != ENOTEMPTY) { PRINTERR("Could not remove /tmp/cloudmig directory : %s. \ Please remove it manually.\n", strerror(errno)); } } return (EXIT_FAILURE); } snprintf(desc_file, sizeof(desc_file), "%s/description.txt", pid_str); FILE* desc = fopen(desc_file, "w"); if (desc == NULL) return EXIT_FAILURE; fprintf(desc, "%s to %s", src, dst); fclose(desc); snprintf(sockfile, sizeof(sockfile), "%s/display.sock", pid_str); // First, save the file name into a global string ptr. gl_sockfile = strdup(sockfile); if (gl_sockfile == NULL) return EXIT_FAILURE; gl_accept_sock = create_log_socket(sockfile); if (gl_accept_sock == -1) return (EXIT_FAILURE); return (EXIT_SUCCESS); }
static int log_open_journal(void) { static const union sockaddr_union sa = { .un.sun_family = AF_UNIX, .un.sun_path = "/run/systemd/journal/socket", }; int r; if (journal_fd >= 0) return 0; journal_fd = create_log_socket(SOCK_DGRAM); if (journal_fd < 0) { r = journal_fd; goto fail; } if (connect(journal_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)) < 0) { r = -errno; goto fail; } return 0; fail: log_close_journal(); return r; } int log_open(void) { int r; /* If we don't use the console we close it here, to not get * killed by SAK. If we don't use syslog we close it here so * that we are not confused by somebody deleting the socket in * the fs. If we don't use /dev/kmsg we still keep it open, * because there is no reason to close it. */ if (log_target == LOG_TARGET_NULL) { log_close_journal(); log_close_syslog(); log_close_console(); return 0; } if ((log_target != LOG_TARGET_AUTO && log_target != LOG_TARGET_SAFE) || getpid() == 1 || isatty(STDERR_FILENO) <= 0) { if (log_target == LOG_TARGET_AUTO || log_target == LOG_TARGET_JOURNAL_OR_KMSG || log_target == LOG_TARGET_JOURNAL) { r = log_open_journal(); if (r >= 0) { log_close_syslog(); log_close_console(); return r; } } if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_SYSLOG) { r = log_open_syslog(); if (r >= 0) { log_close_journal(); log_close_console(); return r; } } if (log_target == LOG_TARGET_AUTO || log_target == LOG_TARGET_SAFE || log_target == LOG_TARGET_JOURNAL_OR_KMSG || log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_KMSG) { r = log_open_kmsg(); if (r >= 0) { log_close_journal(); log_close_syslog(); log_close_console(); return r; } } } log_close_journal(); log_close_syslog(); return log_open_console(); }