/
setenv.lisp
31 lines (25 loc) · 1.31 KB
/
setenv.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(in-package :cl-user)
;; This provides a way to set an environment variable in the running java process.
;; See https://stackoverflow.com/questions/28158116/call-libc-function-from-jna
;; I've found it useful to be able to set an environment variable some java library that queries for an environment variable
(defvar *jna-loaded* nil)
(defun ensure-jna-loaded ()
(or *jna-loaded*
(progn
(when (not (ignore-errors (find-java-class 'jna.nativelibrary)))
(add-to-classpath (ABCL-ASDF:RESOLVE "net.java.dev.jna/jna/LATEST")))
(setq *jna-loaded* t))))
(defun c-setenv (variable value)
(ensure-jna-loaded)
(#"invokeInt" (#"getFunction" (#"getInstance" 'jna.nativelibrary "c") "putenv")
(java:jnew-array-from-list "java.lang.Object" (list (format nil "~a=~a" variable value)))))
(defun c-getenv (variable)
(ensure-jna-loaded)
(let ((found (#"invokePointer" (#"getFunction" (#"getInstance" 'jna.nativelibrary "c") "getenv")
(java:jnew-array-from-list "java.lang.Object" (list variable)))))
(when found
(#"getString" found 0))))
(defun c-chdir (dir)
(ensure-jna-loaded)
(#"invokePointer" (#"getFunction" (#"getInstance" 'jna.nativelibrary "c") "chdir")
(java:jnew-array-from-list "java.lang.Object" (list dir))))