WiringPi: Bring back all of the stuffs I removed to do with peripherals

Imported from the official WiringPi repository, version 2.60.

Signed-off-by: Deokgyu Yang <secugyu@gmail.com>
Change-Id: I82dc00ab9f038f9bc4c6a9c4ca3affe5a5d33ae1
diff --git a/wiringPiD/wiringpid.c b/wiringPiD/wiringpid.c
new file mode 100644
index 0000000..8dde1cd
--- /dev/null
+++ b/wiringPiD/wiringpid.c
@@ -0,0 +1,382 @@
+/*
+ * wiringPiD.c:
+ *	Copyright (c) 2012-2017 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi is free software: you can redistribute it and/or modify
+ *    it under the terms of the GNU Lesser General Public License as published by
+ *    the Free Software Foundation, either version 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 Lesser General Public License for more details.
+ *
+ *    You should have received a copy of the GNU Lesser General Public License
+ *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdarg.h>
+#include <syslog.h>
+#include <signal.h>
+#include <errno.h>
+
+#include <wiringPi.h>
+#include <wpiExtensions.h>
+
+#include "drcNetCmd.h"
+#include "network.h"
+#include "runRemote.h"
+#include "daemonise.h"
+
+
+#define	PIDFILE	"/var/run/wiringPiD.pid"
+
+
+// Globals
+
+static const char *usage = "[-h] [-d] [-g | -1 | -z] [[-x extension:pin:params] ...] password" ;
+static int doDaemon = FALSE ;
+
+//
+
+static void logMsg (const char *message, ...)
+{
+  va_list argp ;
+  char buffer [1024] ;
+
+  va_start (argp, message) ;
+    vsnprintf (buffer, 1023, message, argp) ;
+  va_end (argp) ;
+
+  if (doDaemon)
+    syslog (LOG_DAEMON | LOG_INFO, "%s", buffer) ;
+  else
+    printf ("%s\n", buffer) ;
+}
+
+
+/*
+ * sigHandler:
+ * setupSigHandler:
+ *      Somehing has happened that would normally terminate the program so try
+ *	to close down nicely.
+ *********************************************************************************
+ */
+
+void sigHandler (int sig)
+{
+  logMsg ("Exiting on signal %d: %s", sig, strsignal (sig)) ;
+  (void)unlink (PIDFILE) ;
+  exit (EXIT_FAILURE) ;
+}
+
+void setupSigHandler (void)
+{
+  struct sigaction action ;
+
+  sigemptyset (&action.sa_mask) ;
+  action.sa_flags = 0 ;
+
+// Ignore what we can
+
+  action.sa_handler = SIG_IGN ;
+
+  sigaction (SIGHUP,  &action, NULL) ;
+  sigaction (SIGTTIN, &action, NULL) ;
+  sigaction (SIGTTOU, &action, NULL) ;
+
+// Trap what we can to exit gracefully
+
+  action.sa_handler = sigHandler ;
+
+  sigaction (SIGINT,  &action, NULL) ;
+  sigaction (SIGQUIT, &action, NULL) ;
+  sigaction (SIGILL,  &action, NULL) ;
+  sigaction (SIGABRT, &action, NULL) ;
+  sigaction (SIGFPE,  &action, NULL) ;
+  sigaction (SIGSEGV, &action, NULL) ;
+  sigaction (SIGPIPE, &action, NULL) ;
+  sigaction (SIGALRM, &action, NULL) ;
+  sigaction (SIGTERM, &action, NULL) ;
+  sigaction (SIGUSR1, &action, NULL) ;
+  sigaction (SIGUSR2, &action, NULL) ;
+  sigaction (SIGCHLD, &action, NULL) ;
+  sigaction (SIGTSTP, &action, NULL) ;
+  sigaction (SIGBUS,  &action, NULL) ;
+}
+
+
+/*
+ * The works...
+ *********************************************************************************
+ */
+
+int main (int argc, char *argv [])
+{
+  int clientFd ;
+  char *p, *password ;
+  int i ;
+  int port = DEFAULT_SERVER_PORT ;
+  int wpiSetup = 0 ;
+
+  if (argc < 2)
+  {
+    fprintf (stderr, "Usage: %s %s\n", argv [0], usage) ;
+    exit (EXIT_FAILURE) ;
+  }
+
+// Help?
+
+  if (strcasecmp (argv [1], "-h") == 0)
+  {
+    printf ("Usage: %s %s\n", argv [0], usage) ;
+    return 0 ;
+  }
+
+// Daemonize?
+//	Must come before the other args as e.g. some extensions
+//	open files which get closed on daemonise...
+
+  if (strcasecmp (argv [1], "-d") == 0)
+  {
+    if (geteuid () != 0)
+    {
+      fprintf (stderr, "%s: Must be root to run as a daemon.\n", argv [0]) ;
+      exit (EXIT_FAILURE) ;
+    }
+
+    doDaemon = TRUE ;
+    daemonise (PIDFILE) ;
+
+    for (i = 2 ; i < argc ; ++i)
+      argv [i - 1] = argv [i] ;
+    --argc ;
+  }
+
+// Scan all other arguments
+
+  while (*argv [1] == '-')
+  {
+
+// Look for wiringPi setup arguments:
+//	Same as the gpio command and rtb.
+
+//	-g - bcm_gpio
+
+    if (strcasecmp (argv [1], "-g") == 0)
+    {
+      if (wpiSetup == 0)
+      {
+	logMsg ("BCM_GPIO mode selected") ;
+	wiringPiSetupGpio () ;
+      }
+
+      for (i = 2 ; i < argc ; ++i)
+	argv [i - 1] = argv [i] ;
+      --argc ;
+      ++wpiSetup ;
+      continue ;
+    }
+
+//	-1 - physical pins
+
+    if (strcasecmp (argv [1], "-1") == 0)
+    {
+      if (wpiSetup == 0)
+      {
+	logMsg ("GPIO-PHYS mode selected") ;
+	wiringPiSetupPhys () ;
+      }
+
+      for (i = 2 ; i < argc ; ++i)
+	argv [i - 1] = argv [i] ;
+      --argc ;
+      ++wpiSetup ;
+      continue ;
+    }
+
+//	-z  - no wiringPi - blocks remotes accessing local pins
+
+    if (strcasecmp (argv [1], "-z") == 0)
+    {
+      if (wpiSetup == 0)
+	logMsg ("No GPIO mode selected") ;
+
+      for (i = 2 ; i < argc ; ++i)
+	argv [i - 1] = argv [i] ;
+      --argc ;
+      noLocalPins = TRUE ;
+      ++wpiSetup ;
+      continue ;
+    }
+
+// -p to select the port
+
+    if (strcasecmp (argv [1], "-p") == 0)
+    {
+      if (argc < 3)
+      {
+	logMsg ("-p missing extension port") ;
+	exit (EXIT_FAILURE) ;
+      }
+
+      logMsg ("Setting port to: %s", argv [2]) ;
+
+      port = atoi (argv [2]) ;
+      if ((port < 1) || (port > 65535))
+      {
+	logMsg ("Invalid server port: %d", port) ;
+	exit (EXIT_FAILURE) ;
+      }
+
+// Shift args down by 2
+
+      for (i = 3 ; i < argc ; ++i)
+	argv [i - 2] = argv [i] ;
+      argc -= 2 ;
+
+      continue ;
+    }
+
+// Check for -x argument to load in a new extension
+//	-x extension:base:args
+//	Can load many modules to extend the daemon.
+
+    if (strcasecmp (argv [1], "-x") == 0)
+    {
+      if (argc < 3)
+      {
+	logMsg ("-x missing extension name:data:etc.") ;
+	exit (EXIT_FAILURE) ;
+      }
+
+      logMsg ("Loading extension: %s", argv [2]) ;
+
+      if (!loadWPiExtension (argv [0], argv [2], TRUE))
+      {
+	logMsg ("Extension load failed: %s", strerror (errno)) ;
+	exit (EXIT_FAILURE) ;
+      }
+
+// Shift args down by 2
+
+      for (i = 3 ; i < argc ; ++i)
+	argv [i - 2] = argv [i] ;
+      argc -= 2 ;
+
+      continue ;
+    }
+
+    logMsg ("Invalid parameter: %s", argv [1]) ;
+    exit (EXIT_FAILURE) ;
+  }
+
+// Default to wiringPi mode
+
+  if (wpiSetup == 0)
+  {
+    logMsg ("WiringPi GPIO mode selected") ;
+    wiringPiSetup () ;
+  }
+
+// Finally, should just be one arg left - the password...
+
+  if (argc != 2)
+  {
+    logMsg ("No password supplied") ;
+    exit (EXIT_FAILURE) ;
+  }
+
+  if (strlen (argv [1]) < 6)
+  {
+    logMsg ("Password too short - at least 6 chars, not %d", strlen (argv [1])) ;
+    exit (EXIT_FAILURE) ;
+  }
+
+  if ((password = malloc (strlen (argv [1]) + 1)) == NULL)
+  {
+    logMsg ("Out of memory") ;
+    exit (EXIT_FAILURE) ;
+  }
+  strcpy (password, argv [1]) ;
+
+// Wipe out the password on the command-line in a vague attempt to try to
+//	hide it from snoopers
+
+  for (p = argv [1] ; *p ; ++p)
+    *p = ' ' ;
+
+  setupSigHandler () ;
+ 
+// Enter our big loop
+
+  for (;;)
+  {
+
+    if (!doDaemon)
+      printf ("-=-\nWaiting for a new connection...\n") ;
+
+    if ((clientFd = setupServer (port)) < 0)
+    {
+      logMsg ("Unable to setup server: %s", strerror (errno)) ;
+      exit (EXIT_FAILURE) ;
+    }
+
+    logMsg ("New connection from: %s.", getClientIP ()) ;
+
+    if (!doDaemon)
+      printf ("Sending Greeting.\n") ;
+
+    if (sendGreeting (clientFd) < 0)
+    {
+      logMsg ("Unable to send greeting message: %s", strerror (errno)) ;
+      closeServer (clientFd) ;
+      continue ;
+    }
+
+    if (!doDaemon)
+      printf ("Sending Challenge.\n") ;
+
+    if (sendChallenge (clientFd) < 0)
+    {
+      logMsg ("Unable to send challenge message: %s", strerror (errno)) ;
+      closeServer (clientFd) ;
+      continue ;
+    }
+
+    if (!doDaemon)
+      printf ("Waiting for response.\n") ;
+
+    if (getResponse (clientFd) < 0)
+    {
+      logMsg ("Connection closed waiting for response: %s", strerror (errno)) ;
+      closeServer (clientFd) ;
+      continue ;
+    }
+
+    if (!passwordMatch (password))
+    {
+      logMsg ("Password failure") ;
+      closeServer (clientFd) ;
+      continue ;
+    }
+
+    logMsg ("Password OK - Starting") ;
+
+    runRemoteCommands (clientFd) ;
+    closeServer       (clientFd) ;
+  }
+
+  return 0 ;
+}