43#define LOG_OPENVPN LOG_DAEMON
81static char *pgmname_syslog;
100#if defined(__GNUC__) || defined(__clang__)
101#pragma GCC diagnostic push
102#pragma GCC diagnostic ignored "-Wsign-compare"
121#if defined(__GNUC__) || defined(__clang__)
122#pragma GCC diagnostic pop
176#ifdef OPENVPN_DEBUG_COMMAND_LINE
224 va_start(arglist, format);
238 return strerror(err);
253 const char *prefix_sep;
263 bool crt_error =
false;
322 prefix_sep = prefix =
"";
331 snprintf(m2,
ERR_BUF_SIZE,
"%s%s%s", prefix, prefix_sep, m1);
341 syslog(level,
"%s%s%s", prefix, prefix_sep, m1);
352 gettimeofday(&tv, NULL);
354 fprintf(fp,
"%" PRIi64
".%06ld %x %s%s%s%s", (int64_t)tv.tv_sec, (
long)tv.tv_usec,
355 flags, prefix, prefix_sep, m1,
"\n");
359 fprintf(fp,
"%s%s%s%s", prefix, prefix_sep, m1, (flags &
M_NOLF) ?
"" :
"\n");
363 fprintf(fp,
"%s %s%s%s%s",
time_string(0, 0, show_usec, &
gc), prefix, prefix_sep,
364 m1, (flags &
M_NOLF) ?
"" :
"\n");
373 msg(
M_INFO,
"Exiting due to fatal error");
415 "%d variation(s) on previous %d message(s) suppressed by --mute", suppressed,
430 msg(
M_FATAL,
"Assertion failed at %s:%d (%s)", filename, line, condition);
434 msg(
M_FATAL,
"Assertion failed at %s:%d", filename, line);
446 fprintf(stderr, PACKAGE_NAME
": Out of Memory\n");
458 pgmname_syslog =
string_alloc(pgmname ? pgmname : PACKAGE, NULL);
459 openlog(pgmname_syslog, LOG_PID, LOG_OPENVPN);
471 "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");
483 free(pgmname_syslog);
484 pgmname_syslog = NULL;
509 SECURITY_ATTRIBUTES saAttr;
510 saAttr.nLength =
sizeof(SECURITY_ATTRIBUTES);
511 saAttr.bInheritHandle = TRUE;
512 saAttr.lpSecurityDescriptor = NULL;
514 log_handle = CreateFileW(
wide_string(file, &
gc), GENERIC_WRITE, FILE_SHARE_READ, &saAttr,
515 append ? OPEN_ALWAYS : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
519 if (log_handle == INVALID_HANDLE_VALUE)
528 if (SetFilePointer(log_handle, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER)
530 msg(
M_ERR,
"Error: cannot seek to end of --log file: %s", file);
539 "Warning: cannot duplicate stderr, password prompts will appear in log file instead of console.");
544 log_fd = _open_osfhandle((intptr_t)log_handle, _O_TEXT);
547 msg(
M_ERR,
"Error: --log redirect failed due to _open_osfhandle failure");
552 msgfp = _fdopen(log_fd,
"wt");
555 msg(
M_ERR,
"Error: --log redirect failed due to _fdopen");
559 if (_dup2(log_fd, 1) == -1 || _dup2(log_fd, 2) == -1)
561 msg(
M_WARN,
"Error: --log redirect of stdout/stderr failed");
566#elif defined(HAVE_DUP2)
569 int out = open(file, O_CREAT | O_WRONLY | (append ? O_APPEND : O_TRUNC), S_IRUSR | S_IWUSR);
573 msg(
M_WARN |
M_ERRNO,
"Warning: Error redirecting stdout/stderr to --log file: %s",
578 if (dup2(out, 1) == -1)
580 msg(
M_ERR,
"--log file redirection error on stdout");
582 if (dup2(out, 2) == -1)
584 msg(
M_ERR,
"--log file redirection error on stderr");
597 "WARNING: The --log option is not supported on this OS because it lacks the dup2 function");
624#if defined(__GNUC__) || defined(__clang__)
625#pragma GCC diagnostic push
626#pragma GCC diagnostic ignored "-Wsign-compare"
640 const char *extended_msg = NULL;
642 bool crt_error =
false;
651#if EXTENDED_SOCKET_ERROR_CAPABILITY
656 extended_msg = format_extended_socket_error(sock->
sd, &mtu, &
gc);
657 if (mtu > 0 && sock->
mtu != mtu)
697#if defined(__GNUC__) || defined(__clang__)
698#pragma GCC diagnostic pop
738 port_share_abort(port_share);
801 return "General failure (ERROR_GEN_FAILURE)";
804 return "I/O Operation in progress (ERROR_IO_PENDING)";
807 return "I/O Operation in progress (WSA_IO_INCOMPLETE)";
810 return "Interrupted system call (WSAEINTR)";
813 return "Bad file number (WSAEBADF)";
816 return "Permission denied (WSAEACCES)";
819 return "Bad address (WSAEFAULT)";
822 return "Invalid argument (WSAEINVAL)";
825 return "Too many open files (WSAEMFILE)";
828 return "Operation would block (WSAEWOULDBLOCK)";
831 return "Operation now in progress (WSAEINPROGRESS)";
834 return "Operation already in progress (WSAEALREADY)";
837 return "Destination address required (WSAEDESTADDRREQ)";
840 return "Message too long (WSAEMSGSIZE)";
843 return "Protocol wrong type for socket (WSAEPROTOTYPE)";
846 return "Bad protocol option (WSAENOPROTOOPT)";
849 return "Protocol not supported (WSAEPROTONOSUPPORT)";
852 return "Socket type not supported (WSAESOCKTNOSUPPORT)";
855 return "Operation not supported on socket (WSAEOPNOTSUPP)";
858 return "Protocol family not supported (WSAEPFNOSUPPORT)";
861 return "Address family not supported by protocol family (WSAEAFNOSUPPORT)";
864 return "Address already in use (WSAEADDRINUSE)";
867 return "Network is down (WSAENETDOWN)";
870 return "Network is unreachable (WSAENETUNREACH)";
873 return "Net dropped connection or reset (WSAENETRESET)";
876 return "Software caused connection abort (WSAECONNABORTED)";
879 return "Connection reset by peer (WSAECONNRESET)";
882 return "No buffer space available (WSAENOBUFS)";
885 return "Socket is already connected (WSAEISCONN)";
888 return "Socket is not connected (WSAENOTCONN)";
891 return "Connection timed out (WSAETIMEDOUT)";
894 return "Connection refused (WSAECONNREFUSED)";
897 return "Too many levels of symbolic links (WSAELOOP)";
900 return "File name too long (WSAENAMETOOLONG)";
903 return "Host is down (WSAEHOSTDOWN)";
906 return "No Route to Host (WSAEHOSTUNREACH)";
909 return "Directory not empty (WSAENOTEMPTY)";
912 return "Too many processes (WSAEPROCLIM)";
915 return "Too many users (WSAEUSERS)";
918 return "Disc Quota Exceeded (WSAEDQUOT)";
921 return "Stale NFS file handle (WSAESTALE)";
924 return "Network SubSystem is unavailable (WSASYSNOTREADY)";
927 return "WINSOCK DLL Version out of range (WSAVERNOTSUPPORTED)";
930 return "Successful WSASTARTUP not yet performed (WSANOTINITIALISED)";
933 return "Too many levels of remote in path (WSAEREMOTE)";
936 return "Host not found (WSAHOST_NOT_FOUND)";
965 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)
void x_check_status(ssize_t status, const char *description, struct link_socket *sock, struct tuntap *tt)
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.
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, tv_usec_t 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)