/* fileline.c -- Get file and line number information in a backtrace.
   Copyright (C) 2012-2016 Free Software Foundation, Inc.
   Written by Ian Lance Taylor, Google.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    (1) Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    (2) Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

    (3) The name of the author may not be used to
    endorse or promote products derived from this software without
    specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.  */

#include "config.h"

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
//#include <fcntl.h>
#include <stdlib.h>

#include "backtrace.h"
#include "internal.h"

#ifndef HAVE_GETEXECNAME
#define getexecname() NULL
#endif

/* Initialize the fileline information from the executable.  Returns 1
   on success, 0 on failure.  */

static int
fileline_initialize(struct backtrace_state* state,
                    backtrace_error_callback error_callback, void* data) {
    int failed = 0;
    fileline fileline_fn = NULL;
    int pass = 0;
    int called_error_callback = 0;
    int descriptor = 0;

    if (!state->threaded) {
        failed = state->fileline_initialization_failed;
    } else {
        failed = backtrace_atomic_load_int(&state->fileline_initialization_failed);
    }

    if (failed) {
        error_callback(data, "failed to read executable information", -1);
        return 0;
    }

    if (!state->threaded) {
        fileline_fn = state->fileline_fn;
    } else {
        fileline_fn = backtrace_atomic_load_pointer(&state->fileline_fn);
    }

    if (fileline_fn != NULL) {
        return 1;
    }

    /* We have not initialized the information.  Do it now.  */

    descriptor = -1;
    called_error_callback = 0;

    for (pass = 0; pass < 4; ++pass) {
        const char* filename = NULL;
        int does_not_exist = 0;

        switch (pass) {
        case 0:
            filename = state->filename;
            break;

        case 1:
            filename = getexecname();
            break;

        case 2:
            filename = "/proc/self/exe";
            break;

        case 3:
            filename = "/proc/curproc/file";
            break;

        default:
            abort();
        }

        if (filename == NULL) {
            continue;
        }

        descriptor = backtrace_open(filename, error_callback, data, &does_not_exist);

        if (descriptor < 0 && !does_not_exist) {
            called_error_callback = 1;
            break;
        }

        if (descriptor >= 0) {
            break;
        }
    }

    if (descriptor < 0) {
        if (!called_error_callback) {
            if (state->filename != NULL) {
                error_callback(data, state->filename, ENOENT);
            } else
                error_callback(data,
                               "libbacktrace could not find enclave to open",
                               0);
        }

        failed = 1;
    }

    if (!failed) {
        if (!backtrace_initialize(state, descriptor, error_callback, data, &fileline_fn)) {
            failed = 1;
        }
    }

    if (failed) {
        if (!state->threaded) {
            state->fileline_initialization_failed = 1;
        } else {
            backtrace_atomic_store_int(&state->fileline_initialization_failed, 1);
        }

        return 0;
    }

    if (!state->threaded) {
        state->fileline_fn = fileline_fn;
    } else {
        backtrace_atomic_store_pointer(&state->fileline_fn, fileline_fn);

        /* Note that if two threads initialize at once, one of the data
            sets may be leaked.  */
    }

    return 1;
}

/* Given a PC, find the file name, line number, and function name.  */

int
backtrace_pcinfo(struct backtrace_state* state, uintptr_t pc,
                 backtrace_full_callback callback,
                 backtrace_error_callback error_callback, void* data) {
    if (!fileline_initialize(state, error_callback, data)) {
        return 0;
    }

    if (state->fileline_initialization_failed) {
        return 0;
    }

    return state->fileline_fn(state, pc, callback, error_callback, data);
}

/* Given a PC, find the symbol for it, and its value.  */

int
backtrace_syminfo(struct backtrace_state* state, uintptr_t pc,
                  backtrace_syminfo_callback callback,
                  backtrace_error_callback error_callback, void* data) {
    if (!fileline_initialize(state, error_callback, data)) {
        return 0;
    }

    if (state->fileline_initialization_failed) {
        return 0;
    }

    state->syminfo_fn(state, pc, callback, error_callback, data);
    return 1;
}
