Currently many files (42) include misc.h, which is a lot. Also, misc.c
is among the biggest files in the codebase[1], so splitting it into
smaller files with good names and well-defined functionality makes sense:

"Oh, this include console.h, it must be using some console-related
functions"

Feature-vise I give this one an ACK. Somebody else might want to look at
the actual changes.

-- 
Samuli Seppänen
Community Manager
OpenVPN Technologies, Inc

irc freenode net: mattock

[1] For you own amusement, you can try something like this:

for i in `ls *.c`;do echo -n $i": ";cat $i|wc --lines;done|less
> Signed-off-by: Alon Bar-Lev <alon.bar...@gmail.com>
> ---
>  src/openvpn/Makefile.am    |    1 +
>  src/openvpn/console.c      |  238 
> ++++++++++++++++++++++++++++++++++++++++++++
>  src/openvpn/console.h      |   33 ++++++
>  src/openvpn/misc.c         |  125 +-----------------------
>  src/openvpn/misc.h         |    3 +-
>  src/openvpn/openvpn.vcproj |    8 ++
>  src/openvpn/pkcs11.c       |    1 +
>  src/openvpn/win32.c        |   87 +----------------
>  src/openvpn/win32.h        |    5 +-
>  9 files changed, 286 insertions(+), 215 deletions(-)
>  create mode 100644 src/openvpn/console.c
>  create mode 100644 src/openvpn/console.h
>
> diff --git a/src/openvpn/Makefile.am b/src/openvpn/Makefile.am
> index e170380..333eebc 100644
> --- a/src/openvpn/Makefile.am
> +++ b/src/openvpn/Makefile.am
> @@ -58,6 +58,7 @@ openvpn_SOURCES = \
>         mbuf.c mbuf.h \
>         memdbg.h \
>         misc.c misc.h \
> +       console.c console.h \
>         mroute.c mroute.h \
>         mss.c mss.h \
>         mstats.c mstats.h \
> diff --git a/src/openvpn/console.c b/src/openvpn/console.c
> new file mode 100644
> index 0000000..2464e7e
> --- /dev/null
> +++ b/src/openvpn/console.c
> @@ -0,0 +1,238 @@
> +/*
> + *  OpenVPN -- An application to securely tunnel IP networks
> + *             over a single UDP port, with support for SSL/TLS-based
> + *             session authentication and key exchange,
> + *             packet encryption, packet authentication, and
> + *             packet compression.
> + *
> + *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sa...@openvpn.net>
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License version 2
> + *  as published by the Free Software Foundation.
> + *
> + *  This program is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with this program (see the file COPYING included with this
> + *  distribution); if not, write to the Free Software Foundation, Inc.,
> + *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#elif defined(_MSC_VER)
> +#include "config-msvc.h"
> +#endif
> +
> +#include "syshead.h"
> +#include "console.h"
> +#include "error.h"
> +#include "buffer.h"
> +#include "misc.h"
> +
> +#ifdef WIN32
> +
> +#include "win32.h"
> +
> +/*
> + * Get input from console.
> + *
> + * Return false on input error, or if service
> + * exit event is signaled.
> + */
> +
> +static bool
> +get_console_input_win32 (const char *prompt, const bool echo, char *input, 
> const int capacity)
> +{
> +  HANDLE in = INVALID_HANDLE_VALUE;
> +  HANDLE err = INVALID_HANDLE_VALUE;
> +  DWORD len = 0;
> +
> +  ASSERT (prompt);
> +  ASSERT (input);
> +  ASSERT (capacity > 0);
> +
> +  input[0] = '\0';
> +
> +  in = GetStdHandle (STD_INPUT_HANDLE);
> +  err = get_orig_stderr ();
> +
> +  if (in != INVALID_HANDLE_VALUE
> +      && err != INVALID_HANDLE_VALUE
> +      && !win32_service_interrupt (&win32_signal)
> +      && WriteFile (err, prompt, strlen (prompt), &len, NULL))
> +    {
> +      bool is_console = (GetFileType (in) == FILE_TYPE_CHAR);
> +      DWORD flags_save = 0;
> +      int status = 0;
> +      WCHAR *winput;
> +
> +      if (is_console)
> +       {
> +         if (GetConsoleMode (in, &flags_save))
> +           {
> +             DWORD flags = ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT;
> +             if (echo)
> +               flags |= ENABLE_ECHO_INPUT;
> +             SetConsoleMode (in, flags);
> +           }
> +         else
> +           is_console = 0;
> +       }
> +
> +      if (is_console)
> +        {
> +          winput = malloc (capacity * sizeof (WCHAR));
> +          if (winput == NULL)
> +            return false;
> +
> +          status = ReadConsoleW (in, winput, capacity, &len, NULL);
> +          WideCharToMultiByte (CP_UTF8, 0, winput, len, input, capacity, 
> NULL, NULL);
> +          free (winput);
> +        }
> +      else
> +        status = ReadFile (in, input, capacity, &len, NULL);
> +
> +      string_null_terminate (input, (int)len, capacity);
> +      chomp (input);
> +
> +      if (!echo)
> +       WriteFile (err, "\r\n", 2, &len, NULL);
> +      if (is_console)
> +       SetConsoleMode (in, flags_save);
> +      if (status && !win32_service_interrupt (&win32_signal))
> +       return true;
> +    }
> +
> +  return false;
> +}
> +
> +#endif
> +
> +#ifdef HAVE_GETPASS
> +
> +static FILE *
> +open_tty (const bool write)
> +{
> +  FILE *ret;
> +  ret = fopen ("/dev/tty", write ? "w" : "r");
> +  if (!ret)
> +    ret = write ? stderr : stdin;
> +  return ret;
> +}
> +
> +static void
> +close_tty (FILE *fp)
> +{
> +  if (fp != stderr && fp != stdin)
> +    fclose (fp);
> +}
> +
> +#endif
> +
> +#ifdef ENABLE_SYSTEMD
> +
> +/*
> + * is systemd running
> + */
> +
> +static bool
> +check_systemd_running ()
> +{
> +  struct stat a, b;
> +
> +  /* We simply test whether the systemd cgroup hierarchy is
> +   * mounted */
> +
> +  return (lstat("/sys/fs/cgroup", &a) == 0)
> +         && (lstat("/sys/fs/cgroup/systemd", &b) == 0)
> +         && (a.st_dev != b.st_dev);
> +
> +}
> +
> +static bool
> +get_console_input_systemd (const char *prompt, const bool echo, char *input, 
> const int capacity)
> +{
> +  int std_out;
> +  bool ret = false;
> +  struct argv argv;
> +
> +  argv_init (&argv);
> +  argv_printf (&argv, "/bin/systemd-ask-password");
> +  argv_printf_cat (&argv, "%s", prompt);
> +
> +  if ((std_out = openvpn_popen (&argv, NULL)) < 0) {
> +         return false;
> +  }
> +  CLEAR (*input);
> +  if (read (std_out, input, capacity) != 0)
> +    {
> +       chomp (input);
> +       ret = true;
> +    }
> +  close (std_out);
> +
> +  argv_reset (&argv);
> +
> +  return ret;
> +}
> +
> +
> +#endif
> +
> +/*
> + * Get input from console
> + */
> +bool
> +get_console_input (const char *prompt, const bool echo, char *input, const 
> int capacity)
> +{
> +  bool ret = false;
> +  ASSERT (prompt);
> +  ASSERT (input);
> +  ASSERT (capacity > 0);
> +  input[0] = '\0';
> +
> +#ifdef ENABLE_SYSTEMD
> +  if (check_systemd_running ())
> +    return get_console_input_systemd (prompt, echo, input, capacity);
> +#endif
> +
> +#if defined(WIN32)
> +  return get_console_input_win32 (prompt, echo, input, capacity);
> +#elif defined(HAVE_GETPASS)
> +  if (echo)
> +    {
> +      FILE *fp;
> +
> +      fp = open_tty (true);
> +      fprintf (fp, "%s", prompt);
> +      fflush (fp);
> +      close_tty (fp);
> +
> +      fp = open_tty (false);
> +      if (fgets (input, capacity, fp) != NULL)
> +       {
> +         chomp (input);
> +         ret = true;
> +       }
> +      close_tty (fp);
> +    }
> +  else
> +    {
> +      char *gp = getpass (prompt);
> +      if (gp)
> +       {
> +         strncpynt (input, gp, capacity);
> +         memset (gp, 0, strlen (gp));
> +         ret = true;
> +       }
> +    }
> +#else
> +  msg (M_FATAL, "Sorry, but I can't get console input on this OS");
> +#endif
> +  return ret;
> +}
> diff --git a/src/openvpn/console.h b/src/openvpn/console.h
> new file mode 100644
> index 0000000..268f3fe
> --- /dev/null
> +++ b/src/openvpn/console.h
> @@ -0,0 +1,33 @@
> +/*
> + *  OpenVPN -- An application to securely tunnel IP networks
> + *             over a single UDP port, with support for SSL/TLS-based
> + *             session authentication and key exchange,
> + *             packet encryption, packet authentication, and
> + *             packet compression.
> + *
> + *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sa...@openvpn.net>
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License version 2
> + *  as published by the Free Software Foundation.
> + *
> + *  This program is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with this program (see the file COPYING included with this
> + *  distribution); if not, write to the Free Software Foundation, Inc.,
> + *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> + */
> +
> +#ifndef CONSOLE_H
> +#define CONSOLE_H
> +
> +#include "basic.h"
> +
> +bool
> +get_console_input (const char *prompt, const bool echo, char *input, const 
> int capacity);
> +
> +#endif
> diff --git a/src/openvpn/misc.c b/src/openvpn/misc.c
> index 07beaf0..2571194 100644
> --- a/src/openvpn/misc.c
> +++ b/src/openvpn/misc.c
> @@ -41,6 +41,7 @@
>  #include "manage.h"
>  #include "crypto.h"
>  #include "route.h"
> +#include "console.h"
>  #include "win32.h"
>
>  #include "memdbg.h"
> @@ -1373,130 +1374,6 @@ absolute_pathname (const char *pathname)
>      return false;
>  }
>
> -#ifdef HAVE_GETPASS
> -
> -static FILE *
> -open_tty (const bool write)
> -{
> -  FILE *ret;
> -  ret = fopen ("/dev/tty", write ? "w" : "r");
> -  if (!ret)
> -    ret = write ? stderr : stdin;
> -  return ret;
> -}
> -
> -static void
> -close_tty (FILE *fp)
> -{
> -  if (fp != stderr && fp != stdin)
> -    fclose (fp);
> -}
> -
> -#endif
> -
> -/*
> - * is systemd running
> - */
> -
> -#if defined(TARGET_LINUX) && defined(ENABLE_SYSTEMD)
> -bool
> -check_systemd_running ()
> -{
> -  struct stat a, b;
> -
> -  /* We simply test whether the systemd cgroup hierarchy is
> -   * mounted */
> -
> -  return (lstat("/sys/fs/cgroup", &a) == 0)
> -         && (lstat("/sys/fs/cgroup/systemd", &b) == 0)
> -         && (a.st_dev != b.st_dev);
> -
> -}
> -
> -bool
> -get_console_input_systemd (const char *prompt, const bool echo, char *input, 
> const int capacity)
> -{
> -  int std_out;
> -  char cmd[256];
> -  bool ret = false;
> -  struct argv argv;
> -
> -  argv_init (&argv);
> -  argv_printf (&argv, "/bin/systemd-ask-password");
> -  argv_printf_cat (&argv, "%s", prompt);
> -
> -  if ((std_out = openvpn_popen (&argv, NULL)) < 0) {
> -         return false;
> -  }
> -  CLEAR (*input);
> -  if (read (std_out, input, capacity) != 0)
> -    {
> -       chomp (input);
> -       ret = true;
> -    }
> -  close (std_out);
> -
> -  argv_reset (&argv);
> -
> -  return ret;
> -}
> -
> -
> -#endif
> -
> -/*
> - * Get input from console
> - */
> -bool
> -get_console_input (const char *prompt, const bool echo, char *input, const 
> int capacity)
> -{
> -  bool ret = false;
> -  ASSERT (prompt);
> -  ASSERT (input);
> -  ASSERT (capacity > 0);
> -  input[0] = '\0';
> -
> -#if defined(TARGET_LINUX) && defined(ENABLE_SYSTEMD)
> -  if (check_systemd_running ())
> -    return get_console_input_systemd (prompt, echo, input, capacity);
> -#endif
> -
> -#if defined(WIN32)
> -  return get_console_input_win32 (prompt, echo, input, capacity);
> -#elif defined(HAVE_GETPASS)
> -  if (echo)
> -    {
> -      FILE *fp;
> -
> -      fp = open_tty (true);
> -      fprintf (fp, "%s", prompt);
> -      fflush (fp);
> -      close_tty (fp);
> -
> -      fp = open_tty (false);
> -      if (fgets (input, capacity, fp) != NULL)
> -       {
> -         chomp (input);
> -         ret = true;
> -       }
> -      close_tty (fp);
> -    }
> -  else
> -    {
> -      char *gp = getpass (prompt);
> -      if (gp)
> -       {
> -         strncpynt (input, gp, capacity);
> -         memset (gp, 0, strlen (gp));
> -         ret = true;
> -       }
> -    }
> -#else
> -  msg (M_FATAL, "Sorry, but I can't get console input on this OS");
> -#endif
> -  return ret;
> -}
> -
>  /*
>   * Get and store a username/password
>   */
> diff --git a/src/openvpn/misc.h b/src/openvpn/misc.h
> index 9bb2fa2..12a8f71 100644
> --- a/src/openvpn/misc.h
> +++ b/src/openvpn/misc.h
> @@ -128,6 +128,7 @@ bool system_executed (int stat);
>  const char *system_error_message (int, struct gc_arena *gc);
>
>  /* wrapper around the execve() call */
> +int openvpn_popen (const struct argv *a,  const struct env_set *es);
>  int openvpn_execve (const struct argv *a, const struct env_set *es, const 
> unsigned int flags);
>  bool openvpn_execve_check (const struct argv *a, const struct env_set *es, 
> const unsigned int flags, const char *error_message);
>  bool openvpn_execve_allowed (const unsigned int flags);
> @@ -322,8 +323,6 @@ struct auth_challenge_info {};
>  struct static_challenge_info {};
>  #endif
>
> -bool get_console_input (const char *prompt, const bool echo, char *input, 
> const int capacity);
> -
>  /*
>   * Flags for get_user_pass and management_query_user_pass
>   */
> diff --git a/src/openvpn/openvpn.vcproj b/src/openvpn/openvpn.vcproj
> index 45c0a77..6c19621 100644
> --- a/src/openvpn/openvpn.vcproj
> +++ b/src/openvpn/openvpn.vcproj
> @@ -191,6 +191,10 @@
>                                 >
>                         </File>
>                         <File
> +                               RelativePath=".\console.c"
> +                               >
> +                       </File>
> +                       <File
>                                 RelativePath=".\crypto.c"
>                                 >
>                         </File>
> @@ -457,6 +461,10 @@
>                                 >
>                         </File>
>                         <File
> +                               RelativePath=".\console.h"
> +                               >
> +                       </File>
> +                       <File
>                                 RelativePath=".\crypto.h"
>                                 >
>                         </File>
> diff --git a/src/openvpn/pkcs11.c b/src/openvpn/pkcs11.c
> index 2189208..fd609d4 100644
> --- a/src/openvpn/pkcs11.c
> +++ b/src/openvpn/pkcs11.c
> @@ -40,6 +40,7 @@
>  #include "pkcs11.h"
>  #include "misc.h"
>  #include "otime.h"
> +#include "console.h"
>  #include "pkcs11_backend.h"
>
>  static
> diff --git a/src/openvpn/win32.c b/src/openvpn/win32.c
> index d7bf514..e94343b 100644
> --- a/src/openvpn/win32.c
> +++ b/src/openvpn/win32.c
> @@ -514,7 +514,7 @@ win32_signal_close (struct win32_signal *ws)
>  /*
>   * Return true if interrupt occurs in service mode.
>   */
> -static bool
> +bool
>  win32_service_interrupt (struct win32_signal *ws)
>  {
>    if (ws->mode == WSO_MODE_SERVICE)
> @@ -740,91 +740,6 @@ netcmd_semaphore_release (void)
>  }
>
>  /*
> - * Get input from console.
> - *
> - * Return false on input error, or if service
> - * exit event is signaled.
> - */
> -
> -bool
> -get_console_input_win32 (const char *prompt, const bool echo, char *input, 
> const int capacity)
> -{
> -  HANDLE in = INVALID_HANDLE_VALUE;
> -  HANDLE err = INVALID_HANDLE_VALUE;
> -  DWORD len = 0;
> -
> -  ASSERT (prompt);
> -  ASSERT (input);
> -  ASSERT (capacity > 0);
> -
> -  input[0] = '\0';
> -
> -  in = GetStdHandle (STD_INPUT_HANDLE);
> -  err = get_orig_stderr ();
> -
> -  if (in != INVALID_HANDLE_VALUE
> -      && err != INVALID_HANDLE_VALUE
> -      && !win32_service_interrupt (&win32_signal)
> -      && WriteFile (err, prompt, strlen (prompt), &len, NULL))
> -    {
> -      bool is_console = (GetFileType (in) == FILE_TYPE_CHAR);
> -      DWORD flags_save = 0;
> -      int status = 0;
> -      WCHAR *winput;
> -
> -      if (is_console)
> -       {
> -         if (GetConsoleMode (in, &flags_save))
> -           {
> -             DWORD flags = ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT;
> -             if (echo)
> -               flags |= ENABLE_ECHO_INPUT;
> -             SetConsoleMode (in, flags);
> -           }
> -         else
> -           is_console = 0;
> -       }
> -
> -      if (is_console)
> -        {
> -          winput = malloc (capacity * sizeof (WCHAR));
> -          if (winput == NULL)
> -            return false;
> -
> -          status = ReadConsoleW (in, winput, capacity, &len, NULL);
> -          WideCharToMultiByte (CP_UTF8, 0, winput, len, input, capacity, 
> NULL, NULL);
> -          free (winput);
> -        }
> -      else
> -        status = ReadFile (in, input, capacity, &len, NULL);
> -
> -      string_null_terminate (input, (int)len, capacity);
> -      chomp (input);
> -
> -      if (!echo)
> -       WriteFile (err, "\r\n", 2, &len, NULL);
> -      if (is_console)
> -       SetConsoleMode (in, flags_save);
> -      if (status && !win32_service_interrupt (&win32_signal))
> -       return true;
> -    }
> -
> -  return false;
> -}
> -
> -/* get password from console */
> -
> -char *
> -getpass (const char *prompt)
> -{
> -  static char line[256];
> -  if (get_console_input_win32 (prompt, false, line, sizeof (line)))
> -    return line;
> -  else
> -    return NULL;
> -}
> -
> -/*
>   * Return true if filename is safe to be used on Windows,
>   * by avoiding the following reserved names:
>   *
> diff --git a/src/openvpn/win32.h b/src/openvpn/win32.h
> index d87e987..cc18f02 100644
> --- a/src/openvpn/win32.h
> +++ b/src/openvpn/win32.h
> @@ -166,6 +166,8 @@ int win32_signal_get (struct win32_signal *ws);
>
>  void win32_pause (struct win32_signal *ws);
>
> +bool win32_service_interrupt (struct win32_signal *ws);
> +
>  /*
>   * Set the text on the window title bar
>   */
> @@ -246,9 +248,6 @@ void netcmd_semaphore_close (void);
>  void netcmd_semaphore_lock (void);
>  void netcmd_semaphore_release (void);
>
> -bool get_console_input_win32 (const char *prompt, const bool echo, char 
> *input, const int capacity);
> -char *getpass (const char *prompt);
> -
>  /* Set Win32 security attributes structure to allow all access */
>  bool init_security_attributes_allow_all (struct security_attributes *obj);
>
> --
> 1.7.3.4
>
>
> ------------------------------------------------------------------------------
> Virtualization & Cloud Management Using Capacity Planning
> Cloud computing makes use of virtualization - but cloud computing
> also focuses on allowing computing to be delivered as a service.
> http://www.accelacomm.com/jaw/sfnl/114/51521223/
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel


Reply via email to