;; @module unix.lsp ;; @description Interface to various UNIX libc functions ;; @version 0.1 alpha - mostly untested ;; @version 0.2 alpha - eliminated getpid and getppid, included in 'sys-info' ;; @version 0.3 alpha - added diferent libc.so library path for UBUNTU 9.04 ;; @version 0.4 alpha - take care of overwrite protection of imports in ffilib versions ;; @version 0.5 alpha - precautions for multiple load of module because of overwritten symbols ;; @version 0.6 alpha - libc library path for Linux UBUNTU ;; @version 0.71 alpha - libc library path for several OS ;; @author L.M. 2006-Sep-12, 2012, 2013 lutz@nuevatec.com ;; ;; ;;

UNIX libc function support

;; To use this module include the following line at the beginning of ;; the program file: ;;
;; (load "/usr/share/newlisp/modules/unix.lsp")
;; ; or shorter
;; (module "unix.lsp")
;; 
;; All functions are named like the UNIX functions they implelement but with ;; the unix: namespace prefix. All functions work similar to the UNIX libc functions ;; they implement but return 'nil' instead of '-1' for failure and 'true' instead ;; of 0 for success. Note that in the implementaion most parameter types are casted ;; even though redundant in most situation. The addional cast avoids segfaulting ;; of the imported functions when supplied with wrong parameter types, i.e. for strings. ;; Some times the 'int' cast is used to supply default values of an argument, in case ;; the argument is not given. ;; ;; The arguments are given in, is the order used by the equivalent libc functions, not ;; the order as used by shell commandline utilities with the same name. ;; ;; Some of the wordings from functions descriptions are taken from BSD man pages. ;; ;; This module contains wrappers for the following libc functions: ;; 'getuid', 'geteuid', 'getgid', 'getegid', ;; 'setuid', 'seteuid', 'setgid', 'setegid', ;; 'kill', 'chmod', 'ioctl', 'mkfifo', 'mltemp', 'syslog' (context 'unix) (set 'files (list "/usr/lib/libc.dylib" ; MacOS/Darwin "/usr/lib/libc.so.51.0" ; OpenBSD 4.6 "/lib/x86_64-linux-gnu/libc.so.6" ; Ubuntu 12.04 LTS "/lib/i386-linux-gnu/libc.so.6" ; UBUNTU Linux "/lib/i686-linux-gnu/libc.so.6" ; UBUNTU Linux "/lib64/libc.so.6" ; CentOS 6.x "/lib/libc.so.6" ; UBUNTU Linux 9.04 "/usr/lib/libc.so" ; Linux, BSD, Solaris )) (set 'library (files (or (find true (map file? files)) (throw-error "cannot find standard C library (libc)")))) (unless module-is-loaded (import library "getuid") (import library "geteuid") (import library "getgid") (import library "getegid") (set '_setuid (import library "setuid")) (set '_seteuid (import library "seteuid")) (set '_setegid (import library "setegid")) (set '_setgid (import library "setgid")) (set '_kill (import library "kill")) (set '_chmod (import library "chmod")) (set '_ioctl (import library "ioctl")) (set '_mkfifo (import library "mkfifo")) (set '_mktemp (import library "mktemp")) (set '_syslog (import library "syslog")) (set 'module-is-loaded true) ) ;; @syntax (unix:getuid) ;; @return Returns the real and effective user ID ;; @syntax (unix:geteuid) ;; @return Returns the effective user ID ;; @syntax (unix:getgid) ;; @return Returns the real group ID. ;; @syntax (unix:getegid) ;; @return Returns the effective group ID ;; @syntax (unix:setuid ) ;; @param The number of the real and effective user IDs to set. ;; @return Returns 'true' or 'nil' depending on success ;; ;; Set the real and effective user IDs. ;; If no argument or the argument given is not a number then sets ;; current real and effective user IDs. (constant 'setuid (lambda (id) (zero? (_setuid (int id (getuid)))) )) ;; @syntax (unix:seteuid ) ;; @param The number of the effective user ID to set. ;; @return Returns 'true' or 'nil' depending on success ;; ;; Sets the effective user ID. ;; If no argument or the argument given is not a number then sets ;; current effective user ID. ;; (constant 'seteuid (lambda (id) (zero? (_seteuid (int id (geteuid)))) )) ;; @syntax (unix:setgid ) ;; @param The number of the real and effective group ID to set. ;; @return Returns 'true' or 'nil' depending on success ;; ;; Sets the real and effective group IDs. ;; If no argument or the argument given is not a number then sets ;; current real and effective group IDs. (constant 'setgid (lambda (id) (zero? (_setgid (int id (getgid)))) )) ;; @syntax (unix:setegid ) ;; @param the number of the effective group ID to set. ;; @return Returns 'true' or 'nil' depending on success ;; ;; Sets the effective group ID. ;; If no argument or the argument given is not a number then sets ;; current effective group ID. (constant 'setegid (lambda (id) (zero? (_setegid (int id (getegid)))) )) ;; @syntax (unix:kill ) ;; @param The process ID of the process to send a signal to. ;; @param The signal to send to the process in ;; @return Returns 'true' or 'nil' depending on success ;; ;; Send a signal to a process. ;; If no argument is given for or is zero, then ;; the validiy of the is checked and 'nil' is returned for ;; an invalid . ;; Note that kill works has parameters backwards compared to the ;; kill used in on the shell command line. '(unix:kill ...)' works ;; like the libc 'kill()' counterpart. (constant 'kill (lambda (pid sig) (zero? (_kill (int pid 0) (int sig 0))) )) ;; @example ;; (unix:kill 2652 9) ;; Sends the 'SIGKILL' signal 9 to process ID '2652' ;; @syntax (unix:chmod ) ;; @param The path name of the file or directory ;; @param The permission pattern as a number ;; @return Returns 'true' or 'nil' depending on success ;; ;; Sets the permission pattern for a UNIX filesystem node. The ;; pattern is best given as an octal number, i.e.: '0755' for ;; a -rwxr-xr-x permission pattern, '0644' for '-rw-r--r--' etc. ;; If no is given unix:chmod assumes '0644'. (constant 'chmod (lambda (file-path option) (zero? (_chmod (string file-path) (int option 0644))) )) ;; @example ;; (unix:chmod "myfile.txt" 0644) ;; Gives '-rw-r--r--' permission to the file 'myfile.txt' ;; @syntax (unix:ioctl ) ;; @param A number for file descriptor. ;; @param A number for a request. ;; @param An argument string. ;; @return Returns 'true' or 'nil' depending on success ;; ;; Manipulates the underlying device parameters of special ;; files. ;; (constant 'ioctl (lambda (id request argp) (zero? (_ioctl (int id 0) (int request 0) (string argp))) )) ;; @syntax (unix:mkfifo ) ;; @param The path of the new fifo filename. ;; @param The persmissions mode number. ;; @return Returns 'true' or 'nil' depending on success ;; ;; Creates a new fifo file with name path. The access permissions ;; are specified by mode and restricted by the 'umask(2)' of the calling ;; process. (constant 'mkfifo (lambda (file-path mode) (zero? (_mkfifo (string file-path) (int mode))) )) ;; @example ;; (unix:mkfifo "myfifo" 0755) ;; This will create a fifo node with 'prwxr-xr-x' permissions ;; @syntax (unix:mktemp ) ;; @param A file template with Xs appended, i.e. '/tmp/temp.XXXX'. ;; @return Returns 'true' or 'nil' depending on success ;; ;; The function takes the given file name template and overwrites a ;; portion of it to create a file name. This file name is guaranteed not to ;; exist at the time of function invocation and is suitable for use by the ;; application. The template may be any file name with some number of 'X's ;; appended to it, for example '/tmp/temp.XXXXXX'. The trailing 'X's are ;; replaced with a unique alphanumeric combination. (constant 'mktemp (lambda (template) (zero? (_mktemp (string template))) )) ;; @syntax (unix:syslog ...) ;; @param The priority of the message. ;; @param The message string and template in printf format. ;; @return Returns 'true' or 'nil' depending on success ;; ;; The function writes message to the system message logger. The ;; message is then written to the system console, log files, logged-in ;; users, or forwarded to other machines as appropriate. (constant 'syslog (lambda (priority message) (zero? (_syslog (int priority 0) (string message))) )) ; eof