43#define LOG_OPENVPN LOG_DAEMON 
   81static char *pgmname_syslog; 
 
  167#ifdef OPENVPN_DEBUG_COMMAND_LINE 
 
  215    va_start(arglist, format);
 
 
  229    return strerror(err);
 
 
  244    const char *prefix_sep;
 
  254    bool crt_error = 
false;
 
  313        prefix_sep = prefix = 
"";
 
  322            snprintf(m2, 
ERR_BUF_SIZE, 
"%s%s%s", prefix, prefix_sep, m1);
 
  332            syslog(level, 
"%s%s%s", prefix, prefix_sep, m1);
 
  343                gettimeofday(&tv, NULL);
 
  345                fprintf(fp, 
"%" PRIi64 
".%06ld %x %s%s%s%s", (int64_t)tv.tv_sec, (
long)tv.tv_usec,
 
  346                        flags, prefix, prefix_sep, m1, 
"\n");
 
  350                fprintf(fp, 
"%s%s%s%s", prefix, prefix_sep, m1, (flags & 
M_NOLF) ? 
"" : 
"\n");
 
  354                fprintf(fp, 
"%s %s%s%s%s", 
time_string(0, 0, show_usec, &
gc), prefix, prefix_sep,
 
  355                        m1, (flags & 
M_NOLF) ? 
"" : 
"\n");
 
  364        msg(
M_INFO, 
"Exiting due to fatal error");
 
 
  406                    "%d variation(s) on previous %d message(s) suppressed by --mute", suppressed,
 
 
  421        msg(
M_FATAL, 
"Assertion failed at %s:%d (%s)", filename, line, condition);
 
  425        msg(
M_FATAL, 
"Assertion failed at %s:%d", filename, line);
 
 
  437    fprintf(stderr, PACKAGE_NAME 
": Out of Memory\n");
 
 
  449            pgmname_syslog = 
string_alloc(pgmname ? pgmname : PACKAGE, NULL);
 
  450            openlog(pgmname_syslog, LOG_PID, LOG_OPENVPN);
 
  462        "Warning on use of --daemon: this operating system lacks daemon logging features, therefore when I become a daemon, I won't be able to log status or error messages");
 
 
  474        free(pgmname_syslog);
 
  475        pgmname_syslog = NULL;
 
 
  500        SECURITY_ATTRIBUTES saAttr;
 
  501        saAttr.nLength = 
sizeof(SECURITY_ATTRIBUTES);
 
  502        saAttr.bInheritHandle = TRUE;
 
  503        saAttr.lpSecurityDescriptor = NULL;
 
  505        log_handle = CreateFileW(
wide_string(file, &
gc), GENERIC_WRITE, FILE_SHARE_READ, &saAttr,
 
  506                                 append ? OPEN_ALWAYS : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 
  510        if (log_handle == INVALID_HANDLE_VALUE)
 
  519            if (SetFilePointer(log_handle, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER)
 
  521                msg(
M_ERR, 
"Error: cannot seek to end of --log file: %s", file);
 
  530                "Warning: cannot duplicate stderr, password prompts will appear in log file instead of console.");
 
  535        log_fd = _open_osfhandle((intptr_t)log_handle, _O_TEXT);
 
  538            msg(
M_ERR, 
"Error: --log redirect failed due to _open_osfhandle failure");
 
  543        msgfp = _fdopen(log_fd, 
"wt");
 
  546            msg(
M_ERR, 
"Error: --log redirect failed due to _fdopen");
 
  550        if (_dup2(log_fd, 1) == -1 || _dup2(log_fd, 2) == -1)
 
  552            msg(
M_WARN, 
"Error: --log redirect of stdout/stderr failed");
 
  557#elif defined(HAVE_DUP2) 
  560        int out = open(file, O_CREAT | O_WRONLY | (append ? O_APPEND : O_TRUNC), S_IRUSR | S_IWUSR);
 
  564            msg(
M_WARN | 
M_ERRNO, 
"Warning: Error redirecting stdout/stderr to --log file: %s",
 
  569        if (dup2(out, 1) == -1)
 
  571            msg(
M_ERR, 
"--log file redirection error on stdout");
 
  573        if (dup2(out, 2) == -1)
 
  575            msg(
M_ERR, 
"--log file redirection error on stderr");
 
  588        "WARNING: The --log option is not supported on this OS because it lacks the dup2 function");
 
 
  626    const char *extended_msg = NULL;
 
  628    bool crt_error = 
false;
 
  637#if EXTENDED_SOCKET_ERROR_CAPABILITY 
  642            extended_msg = format_extended_socket_error(sock->
sd, &mtu, &
gc);
 
  643            if (mtu > 0 && sock->
mtu != mtu)
 
 
  720            port_share_abort(port_share);
 
 
  783            return "General failure (ERROR_GEN_FAILURE)";
 
  786            return "I/O Operation in progress (ERROR_IO_PENDING)";
 
  789            return "I/O Operation in progress (WSA_IO_INCOMPLETE)";
 
  792            return "Interrupted system call (WSAEINTR)";
 
  795            return "Bad file number (WSAEBADF)";
 
  798            return "Permission denied (WSAEACCES)";
 
  801            return "Bad address (WSAEFAULT)";
 
  804            return "Invalid argument (WSAEINVAL)";
 
  807            return "Too many open files (WSAEMFILE)";
 
  810            return "Operation would block (WSAEWOULDBLOCK)";
 
  813            return "Operation now in progress (WSAEINPROGRESS)";
 
  816            return "Operation already in progress (WSAEALREADY)";
 
  819            return "Destination address required (WSAEDESTADDRREQ)";
 
  822            return "Message too long (WSAEMSGSIZE)";
 
  825            return "Protocol wrong type for socket (WSAEPROTOTYPE)";
 
  828            return "Bad protocol option (WSAENOPROTOOPT)";
 
  831            return "Protocol not supported (WSAEPROTONOSUPPORT)";
 
  834            return "Socket type not supported (WSAESOCKTNOSUPPORT)";
 
  837            return "Operation not supported on socket (WSAEOPNOTSUPP)";
 
  840            return "Protocol family not supported (WSAEPFNOSUPPORT)";
 
  843            return "Address family not supported by protocol family (WSAEAFNOSUPPORT)";
 
  846            return "Address already in use (WSAEADDRINUSE)";
 
  849            return "Network is down (WSAENETDOWN)";
 
  852            return "Network is unreachable (WSAENETUNREACH)";
 
  855            return "Net dropped connection or reset (WSAENETRESET)";
 
  858            return "Software caused connection abort (WSAECONNABORTED)";
 
  861            return "Connection reset by peer (WSAECONNRESET)";
 
  864            return "No buffer space available (WSAENOBUFS)";
 
  867            return "Socket is already connected (WSAEISCONN)";
 
  870            return "Socket is not connected (WSAENOTCONN)";
 
  873            return "Connection timed out (WSAETIMEDOUT)";
 
  876            return "Connection refused (WSAECONNREFUSED)";
 
  879            return "Too many levels of symbolic links (WSAELOOP)";
 
  882            return "File name too long (WSAENAMETOOLONG)";
 
  885            return "Host is down (WSAEHOSTDOWN)";
 
  888            return "No Route to Host (WSAEHOSTUNREACH)";
 
  891            return "Directory not empty (WSAENOTEMPTY)";
 
  894            return "Too many processes (WSAEPROCLIM)";
 
  897            return "Too many users (WSAEUSERS)";
 
  900            return "Disc Quota Exceeded (WSAEDQUOT)";
 
  903            return "Stale NFS file handle (WSAESTALE)";
 
  906            return "Network SubSystem is unavailable (WSASYSNOTREADY)";
 
  909            return "WINSOCK DLL Version out of range (WSAVERNOTSUPPORTED)";
 
  912            return "Successful WSASTARTUP not yet performed (WSANOTINITIALISED)";
 
  915            return "Too many levels of remote in path (WSAEREMOTE)";
 
  918            return "Host not found (WSAHOST_NOT_FOUND)";
 
  947                if (*
cp == 
'\n' || *
cp == 
'\r')
 
 
bool buf_printf(struct buffer *buf, const char *format,...)
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
char * string_alloc(const char *str, struct gc_arena *gc)
static void gc_init(struct gc_arena *a)
static void gc_free(struct gc_arena *a)
static struct gc_arena gc_new(void)
#define DEBUG_LEVEL_USEC_TIME
void remove_pid_file(void)
static int constrain_int(int x, int min, int max)
static SERVICE_STATUS status
void set_std_files_to_null(bool stdin_only)
const struct virtual_output * x_msg_virtual_output
msglvl_t get_debug_level(void)
void errors_to_stderr(void)
void open_syslog(const char *pgmname, bool stdio_to_null)
static FILE * default_err
unsigned int x_cs_info_level
void x_msg(const msglvl_t flags, const char *format,...)
const char * strerror_win32(DWORD errnum, struct gc_arena *gc)
const char * x_msg_prefix
bool dont_mute(msglvl_t flags)
Check muting filter.
void x_check_status(int status, const char *description, struct link_socket *sock, struct tuntap *tt)
int get_orig_stderr(void)
static FILE * default_out
void redirect_stdout_stderr(const char *file, bool append)
void assert_failed(const char *filename, int line, const char *condition)
bool set_mute_cutoff(const int cutoff)
void set_check_status(unsigned int info_level, unsigned int verbose_level)
static msglvl_t mute_category
unsigned int x_cs_verbose_level
void openvpn_exit(const int status)
void reset_check_status(void)
static bool machine_readable_output
void x_msg_va(const msglvl_t flags, const char *format, va_list arglist)
int get_mute_cutoff(void)
void set_suppress_timestamps(bool suppressed)
void set_machine_readable_output(bool parsable)
FILE * msg_fp(const msglvl_t flags)
static const char * openvpn_strerror(int err, bool crt_error, struct gc_arena *gc)
bool set_debug_level(const int level, const unsigned int flags)
static bool suppress_timestamps
const char * msg_flags_string(const msglvl_t flags, struct gc_arena *gc)
unsigned int x_cs_err_delay_ms
static bool check_debug_level(msglvl_t level)
#define OPENVPN_DEBUG_FILE
#define DECODE_MUTE_LEVEL(flags)
static const char * msg_get_prefix(void)
static bool msg_test(msglvl_t flags)
Return true if flags represent an enabled, not muted log level.
#define OPENVPN_EXIT_STATUS_CANNOT_OPEN_DEBUG_FILE
#define OPENVPN_EXIT_STATUS_ERROR
static bool ignore_sys_error(const int err, bool crt_error)
static int openvpn_errno_maybe_crt(bool *crt_error)
static const struct virtual_output * msg_get_virtual_output(void)
const char * time_string(time_t t, long usec, bool show_usec, struct gc_arena *gc)
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
static void virtual_output_print(const struct virtual_output *vo, const unsigned int flags, const char *str)
Wrapper structure for dynamically allocated memory.
int len
Length in bytes of the actual content within the allocated memory.
Garbage collection arena used to keep track of dynamically allocated memory.
struct link_socket_info info
const char * tap_win_getinfo(const struct tuntap *tt, struct gc_arena *gc)
static bool tuntap_defined(const struct tuntap *tt)
char * utf16to8(const wchar_t *utf16, struct gc_arena *gc)
WCHAR * wide_string(const char *utf8, struct gc_arena *gc)