You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/07/18 04:29:55 UTC

[incubator-nuttx-apps] branch master updated: system/hostname: Add an option to read the hostname from a file

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 5c84c47ca system/hostname: Add an option to read the hostname from a file
5c84c47ca is described below

commit 5c84c47cad82eb6d4a01c6954c0786c43b7734dc
Author: Norman Rasmussen <no...@rasmussen.co.za>
AuthorDate: Sun Jul 3 13:57:21 2022 -0700

    system/hostname: Add an option to read the hostname from a file
---
 system/hostname/hostname_main.c | 92 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 85 insertions(+), 7 deletions(-)

diff --git a/system/hostname/hostname_main.c b/system/hostname/hostname_main.c
index f56fd463f..6a597cf72 100644
--- a/system/hostname/hostname_main.c
+++ b/system/hostname/hostname_main.c
@@ -35,6 +35,19 @@
  * Private Data
  ****************************************************************************/
 
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: show_usage
+ ****************************************************************************/
+
+static void show_usage(FAR const char *progname)
+{
+  printf("Usage: %s [<hostname>|-F <file>]\n", progname);
+}
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -42,20 +55,85 @@
 int main(int argc, FAR char *argv[])
 {
   int ret;
-  char hostname[HOST_NAME_MAX + 1];
+  bool set = false;
+  FAR FILE *f;
+  char hostname[HOST_NAME_MAX + 2];
+
+  while ((ret = getopt(argc, argv, ":F:h")) != ERROR)
+    {
+      switch (ret)
+        {
+          case 'F':
+            set = true;
+            f = fopen(optarg, "r");
+            if (f == NULL)
+              {
+                fprintf(stderr, "ERROR: Failed to open '%s': %s\n", optarg,
+                        strerror(errno));
+                return EXIT_FAILURE;
+              }
+
+            if (fgets(hostname, sizeof(hostname), f) == NULL)
+              {
+                if (errno != 0)
+                  {
+                    fprintf(stderr, "ERROR: Failed to read '%s': %s\n",
+                            optarg, strerror(errno));
+                    fclose(f);
+                    return EXIT_FAILURE;
+                  }
+
+                hostname[0] = '\0';
+              }
+            else
+              {
+                *strchrnul(hostname, '\n') = '\0';
+              }
+
+            fclose(f);
+            break;
+
+          case 'h':
+            show_usage(argv[0]);
+            return EXIT_SUCCESS;
+
+          case ':':
+            fprintf(stderr, "ERROR: Option needs a value: '%c'\n", optopt);
+            show_usage(argv[0]);
+            return EXIT_FAILURE;
+
+          default:
+          case '?':
+            fprintf(stderr, "ERROR: Unrecognized option: '%c'\n", optopt);
+            show_usage(argv[0]);
+            return EXIT_FAILURE;
+        }
+    }
+
+  if (optind < argc && !set)
+    {
+      set = true;
+      strlcpy(hostname, argv[optind++], sizeof(hostname));
+    }
+
+  if (optind < argc)
+    {
+      fprintf(stderr, "ERROR: Too many arguments\n");
+      return -1;
+    }
 
-  if (argc > 1)
+  if (set)
     {
-      if (argc > 2)
+      if (strlen(hostname) == 0 || strlen(hostname) > HOST_NAME_MAX)
         {
-          fprintf(stderr, "ERROR: Too many arguments\n");
+          fprintf(stderr, "ERROR: The specified hostname is invalid\n");
           return EXIT_FAILURE;
         }
 
-      ret = sethostname(argv[1], strlen(argv[1]));
+      ret = sethostname(hostname, strlen(hostname));
       if (ret != 0)
         {
-          printf("sethostname() returned %d\n", ret);
+          fprintf(stderr, "sethostname() returned %d\n", ret);
           return EXIT_FAILURE;
         }
     }
@@ -64,7 +142,7 @@ int main(int argc, FAR char *argv[])
       ret = gethostname(hostname, HOST_NAME_MAX);
       if (ret != 0)
         {
-          printf("gethostname() returned %d\n", ret);
+          fprintf(stderr, "gethostname() returned %d\n", ret);
           return EXIT_FAILURE;
         }