Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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();
}