Author: iratqq
Date: Sun Feb  8 19:03:37 2009
New Revision: 5833

Modified:
   trunk/scm/posix.scm
   trunk/uim/uim-posix.c

Log:
* scm/posix.scm (process-execute):
  - New function.
* uim/uim-posix.c (c_execve, c_execvp):
  - New function.
  (uim_init_posix_subrs):
  - Add (execve), (execvp).


Modified: trunk/scm/posix.scm
==============================================================================
--- trunk/scm/posix.scm (original)
+++ trunk/scm/posix.scm Sun Feb  8 19:03:37 2009
@@ -92,3 +92,10 @@
 (define (duplicate-fileno oldd . args)
   (let-optionals* args ((newd #f))
      (duplicate2-fileno oldd newd)))
+
+(define (process-execute file . args)
+  (let-optionals* args ((argv (list file))
+                        (envp #f))
+    (if envp
+        (execve file argv envp)
+        (execvp file argv))))

Modified: trunk/uim/uim-posix.c
==============================================================================
--- trunk/uim/uim-posix.c       (original)
+++ trunk/uim/uim-posix.c       Sun Feb  8 19:03:37 2009
@@ -661,6 +661,84 @@
   return MAKE_INT(daemon(C_BOOL(nochdir_), C_BOOL(noclose_)));
 }

+static uim_lisp
+c_execve(uim_lisp file_, uim_lisp argv_, uim_lisp envp_)
+{
+  char **argv;
+  char **envp;
+  int i;
+  int argv_len = uim_scm_length(argv_);
+  int envp_len;
+  uim_lisp ret_;
+
+  if (argv_len < 1)
+    return uim_scm_f();
+
+  argv = uim_malloc(sizeof(char *) * (argv_len + 1));
+
+  for (i = 0; i < argv_len; i++) {
+    argv[i] = uim_strdup(REFER_C_STR(CAR(argv_)));
+    argv_ = CDR(argv_);
+  }
+  argv[argv_len] = NULL;
+
+  if (FALSEP(envp_)) {
+    envp_len = 0;
+    envp = NULL;
+  } else {
+    envp_len = uim_scm_length(envp_);
+    envp = uim_malloc(sizeof(char *) * (envp_len + 1));
+
+    for (i = 0; i < envp_len; i++) {
+      uim_lisp env_ = CAR(envp_);
+
+ uim_asprintf(&envp[i], "%s=%s", REFER_C_STR(CAR(env_)), REFER_C_STR(CDR(env_)));
+      envp_ = CDR(envp_);
+    }
+    envp[envp_len] = NULL;
+  }
+
+  ret_ = MAKE_INT(execve(REFER_C_STR(file_), argv, envp));
+
+  for (i = 0; i < argv_len; i++)
+    free(argv[i]);
+  free(argv);
+
+  for (i = 0; i < envp_len; i++)
+    free(envp[i]);
+  free(envp);
+
+  return ret_;
+}
+
+static uim_lisp
+c_execvp(uim_lisp file_, uim_lisp argv_)
+{
+  char **argv;
+  int i;
+  int len = uim_scm_length(argv_);
+  uim_lisp ret_;
+
+  if (len < 1)
+    return uim_scm_f();
+
+  argv = uim_malloc(sizeof(char *) * (len + 1));
+
+  for (i = 0; i < len; i++) {
+    argv[i] = uim_strdup(REFER_C_STR(CAR(argv_)));
+    argv_ = CDR(argv_);
+  }
+  argv[len] = NULL;
+
+  ret_ = MAKE_INT(execvp(REFER_C_STR(file_), argv));
+
+  for (i = 0; i < len; i++)
+    free(argv[i]);
+  free(argv);
+
+  return ret_;
+}
+
 void
 uim_init_posix_subrs(void)
 {
@@ -723,4 +801,7 @@
uim_scm_eval_c_string("(define process-waitpid-options-alist (process-waitpid-options?))");

   uim_scm_init_proc2("daemon", c_daemon);
+
+  uim_scm_init_proc3("execve", c_execve);
+  uim_scm_init_proc2("execvp", c_execvp);
 }

Reply via email to