Introducing a new wrapper function in iprconfig that invokes an editor
chosen by the user for log viewing.

Signed-off-by: Heitor Ricardo Alves de Siqueira <hal...@linux.vnet.ibm.com>
---
 iprconfig.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 5 deletions(-)

diff --git a/iprconfig.c b/iprconfig.c
index 644ba1de37da..1af5af5a722f 100644
--- a/iprconfig.c
+++ b/iprconfig.c
@@ -11920,6 +11920,51 @@ int log_menu(i_container *i_con)
        return rc;
 }
 
+#define EDITOR_MAX_ARGS 32
+static int invoke_editor(char* filename)
+{
+       int i;
+       int rc, pid, status;
+
+       /* if editor not set, use secure pager */
+       if (strcmp(editor, DEFAULT_EDITOR) == 0) {
+               rc = invoke_pager(filename);
+               return rc;
+       }
+
+       pid = fork();
+       if (pid == 0) {
+               char *tok;
+               char *argv[EDITOR_MAX_ARGS];
+               char cmnd[MAX_CMD_LENGTH];
+
+               /* copy editor name to argv[0] */
+               strncpy(cmnd, editor, sizeof(cmnd) - 1);
+               tok = strtok(cmnd, " ");
+               argv[0] = malloc(strlen(tok));
+               strcpy(argv[0], tok);
+
+               /* handle editor arguments, if any */
+               for (i = 1; i < EDITOR_MAX_ARGS - 2; ++i) {
+                       tok = strtok(NULL, " ");
+                       if (tok == NULL)
+                               break;
+                       argv[i] = malloc(strlen(tok));
+                       strcpy(argv[i], tok);
+               }
+               argv[i] = filename;
+               argv[i+1] = NULL;
+
+               execvp(argv[0], argv);
+               _exit(errno);
+       } else {
+               waitpid(pid, &status, 0);
+       }
+
+       return WEXITSTATUS(status);
+}
+
+
 /**
  * ibm_storage_log_tail -
  * @i_con:             i_container struct
@@ -11996,7 +12041,7 @@ int ibm_storage_log_tail(i_container *i_con)
 
        fclose(logsource);
        close(log_fd);
-       rc = invoke_pager(logfile);
+       rc = invoke_editor(logfile);
 
        if ((rc != 0) && (rc != 127)) {
                /* "Editor returned %d. Try setting the default editor" */
@@ -12148,7 +12193,7 @@ int ibm_storage_log(i_container *i_con)
        }
 
        close(log_fd);
-       rc = invoke_pager(logfile);
+       rc = invoke_editor(logfile);
 
        if (num_dir_entries) {
                while (num_dir_entries--)
@@ -12228,7 +12273,7 @@ int kernel_log(i_container *i_con)
        }
 
        close(log_fd);
-       rc = invoke_pager(logfile);
+       rc = invoke_editor(logfile);
 
        if (num_dir_entries > 0) {
                while (num_dir_entries--)
@@ -12313,7 +12358,7 @@ int iprconfig_log(i_container *i_con)
        }
 
        close(log_fd);
-       rc = invoke_pager(logfile);
+       rc = invoke_editor(logfile);
 
        if (num_dir_entries) {
                while (num_dir_entries--)
@@ -12568,7 +12613,7 @@ int ibm_boot_log(i_container *i_con)
 
        fclose(logsource);
        close(log_fd);
-       rc = invoke_pager(logfile);
+       rc = invoke_editor(logfile);
 
        if ((rc != 0) && (rc != 127)) {
                s_status.num = rc;
-- 
2.4.3


------------------------------------------------------------------------------
_______________________________________________
Iprdd-devel mailing list
Iprdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iprdd-devel

Reply via email to