Moved set/get tty process group code to tty.scm.
Added open-control-tty.
This commit is contained in:
		
							parent
							
								
									b453a05b92
								
							
						
					
					
						commit
						6ff4d51074
					
				
							
								
								
									
										39
									
								
								scsh/tty.c
								
								
								
								
							
							
						
						
									
										39
									
								
								scsh/tty.c
								
								
								
								
							|  | @ -6,6 +6,7 @@ | |||
| #include <stdlib.h> /* For malloc. */ | ||||
| #include "libcig.h" | ||||
| 
 | ||||
| #include <unistd.h> | ||||
| #include <termios.h> | ||||
| 
 | ||||
| /* Make sure foreign-function stubs interface to the C funs correctly: */ | ||||
|  | @ -106,3 +107,41 @@ scheme_value df_tcflow(long nargs, scheme_value *args) | |||
|     return ret1; | ||||
|     } | ||||
| 
 | ||||
| scheme_value df_tcsetpgrp(long nargs, scheme_value *args) | ||||
| { | ||||
|     extern int tcsetpgrp(int , pid_t ); | ||||
|     scheme_value ret1; | ||||
|     int r1; | ||||
| 
 | ||||
|     cig_check_nargs(2, nargs, "tcsetpgrp"); | ||||
|     r1 = tcsetpgrp(EXTRACT_FIXNUM(args[1]), EXTRACT_FIXNUM(args[0])); | ||||
|     ret1 = errno_or_false(r1); | ||||
|     return ret1; | ||||
|     } | ||||
| 
 | ||||
| scheme_value df_tcgetpgrp(long nargs, scheme_value *args) | ||||
| { | ||||
|     extern pid_t tcgetpgrp(int ); | ||||
|     scheme_value ret1; | ||||
|     pid_t r1; | ||||
| 
 | ||||
|     cig_check_nargs(2, nargs, "tcgetpgrp"); | ||||
|     r1 = tcgetpgrp(EXTRACT_FIXNUM(args[1])); | ||||
|     ret1 = errno_or_false(r1); | ||||
|     VECTOR_REF(*args,0) = ENTER_FIXNUM(r1); | ||||
|     return ret1; | ||||
|     } | ||||
| 
 | ||||
| scheme_value df_open_ctty(long nargs, scheme_value *args) | ||||
| { | ||||
|     extern int open_ctty(const char *, int ); | ||||
|     scheme_value ret1; | ||||
|     int r1; | ||||
| 
 | ||||
|     cig_check_nargs(3, nargs, "open_ctty"); | ||||
|     r1 = open_ctty(cig_string_body(args[2]), EXTRACT_FIXNUM(args[1])); | ||||
|     ret1 = errno_or_false(r1); | ||||
|     VECTOR_REF(*args,0) = ENTER_FIXNUM(r1); | ||||
|     return ret1; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										57
									
								
								scsh/tty.scm
								
								
								
								
							
							
						
						
									
										57
									
								
								scsh/tty.scm
								
								
								
								
							|  | @ -14,6 +14,7 @@ | |||
| ;;; Rehacked by Olin 8/95. | ||||
| 
 | ||||
| (foreign-source | ||||
|  "#include <unistd.h>" | ||||
|  "#include <termios.h>" | ||||
|  "" | ||||
|  "/* Make sure foreign-function stubs interface to the C funs correctly: */" | ||||
|  | @ -280,3 +281,59 @@ | |||
| 
 | ||||
| (define (decode-baud-rate code)		; value of BAUD/9600 -> 9600 | ||||
|   (car (vector-ref baud-rates code))) | ||||
| 
 | ||||
| 
 | ||||
| ;;; Set/Get tty process group | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| 
 | ||||
| (define (set-tty-process-group port/fd proc-group) | ||||
|   (call/fdes port/fd | ||||
|     (lambda (fd) | ||||
|       (%set-tty-process-group fd (if (integer? proc-group) | ||||
| 				     proc-group | ||||
| 				     (proc:pid proc-group)))))) | ||||
| 
 | ||||
| (define-simple-errno-syscall (%set-tty-process-group fdes pid) | ||||
|   %set-tty-process-group/errno) | ||||
| 
 | ||||
| (define-foreign %set-tty-process-group/errno (tcsetpgrp (fixnum fdes) | ||||
| 						        (pid_t pid)) | ||||
|   (to-scheme integer errno_or_false)) | ||||
| 
 | ||||
| (define (tty-process-group port/fd) | ||||
|   (call/fdes port/fd %tty-process-group)) | ||||
| 
 | ||||
| (define-errno-syscall (%tty-process-group fd) %tty-process-group/errno | ||||
|   pid) | ||||
| 
 | ||||
| (define-foreign %tty-process-group/errno (tcgetpgrp (fixnum fdes)) | ||||
|   (multi-rep (to-scheme pid_t errno_or_false) | ||||
|              pid_t)) | ||||
| 
 | ||||
| ;;; (open-control-tty fname [flags]) | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| ;;; Open a control tty, return a port. | ||||
| ;;; This procedure is only guaranteed to work when the process doesn't already | ||||
| ;;; have a control tty -- e.g., right after a (BECOME-PROCESS-LEADER) call. | ||||
| ;;; This limted functionality is about all we can provide portably across BSD, | ||||
| ;;; SunOS, and SVR4. | ||||
| 
 | ||||
| (define (open-control-tty ttyname maybe-flags) | ||||
|   (let ((flags (optional-arg maybe-flags open/read+write))) | ||||
|     (receive (errno fd) (open-control-tty/errno ttyname flags) | ||||
|       (if errno | ||||
| 	  (errno-error errno open-control-tty ttyname flags) | ||||
| 
 | ||||
| 	  (let* ((access (bitwise-and flags open/access-mask)) | ||||
| 		 (port ((if (or (= access open/read) (= access open/read+write)) | ||||
| 			    make-input-fdport | ||||
| 			    make-output-fdport) | ||||
| 			fd))) | ||||
| 	    (%install-port fd port) | ||||
| 	    port))))) | ||||
| 
 | ||||
| (define-foreign open-control-tty/errno (open_ctty (string ttyname) | ||||
| 						  (fixnum flags)) | ||||
|   (multi-rep (to-scheme integer errno_or_false) | ||||
|              integer)) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 shivers
						shivers