mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* ext/pty/pty.c (MasterDevice, SlaveDevice, deviceNo): constified.
* ext/pty/pty.c (SlaveName): removed static buffer. * ext/pty/expect_sample.rb: support for autologin. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@12898 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									ecf6101e9b
								
							
						
					
					
						commit
						0d197c00b3
					
				
					 3 changed files with 44 additions and 43 deletions
				
			
		|  | @ -1,3 +1,11 @@ | ||||||
|  | Tue Aug  7 14:56:50 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org> | ||||||
|  | 
 | ||||||
|  | 	* ext/pty/pty.c (MasterDevice, SlaveDevice, deviceNo): constified. | ||||||
|  | 
 | ||||||
|  | 	* ext/pty/pty.c (SlaveName): removed static buffer. | ||||||
|  | 
 | ||||||
|  | 	* ext/pty/expect_sample.rb: support for autologin. | ||||||
|  | 
 | ||||||
| Tue Aug  7 12:45:13 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org> | Tue Aug  7 12:45:13 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org> | ||||||
| 
 | 
 | ||||||
| 	* configure.in (ac_cv_func_isinf): set yes also on OpenSolaris. | 	* configure.in (ac_cv_func_isinf): set yes also on OpenSolaris. | ||||||
|  |  | ||||||
|  | @ -15,10 +15,6 @@ PTY.spawn("ftp ftp.ruby-lang.org") do |r_f,w_f,pid| | ||||||
|    |    | ||||||
|   $expect_verbose = false |   $expect_verbose = false | ||||||
|    |    | ||||||
|   r_f.expect(/^Name.*: /) do |  | ||||||
|     w_f.print "ftp\n" |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   if !ENV['USER'].nil? |   if !ENV['USER'].nil? | ||||||
|     username = ENV['USER'] |     username = ENV['USER'] | ||||||
|   elsif !ENV['LOGNAME'].nil? |   elsif !ENV['LOGNAME'].nil? | ||||||
|  | @ -27,11 +23,8 @@ PTY.spawn("ftp ftp.ruby-lang.org") do |r_f,w_f,pid| | ||||||
|     username = 'guest' |     username = 'guest' | ||||||
|   end |   end | ||||||
|    |    | ||||||
|   r_f.expect('word:') do |   r_f.expect(/^(Name).*: |(word):|> /) do | ||||||
|     w_f.print username+"@\n" |     w_f.puts($1 ? "ftp" : $2 ? "#{username}@" : "cd pub/ruby") | ||||||
|   end |  | ||||||
|   r_f.expect("> ") do |  | ||||||
|     w_f.print "cd pub/ruby\n" |  | ||||||
|   end |   end | ||||||
|   r_f.expect("> ") do |   r_f.expect("> ") do | ||||||
|     w_f.print "dir\n" |     w_f.print "dir\n" | ||||||
|  |  | ||||||
|  | @ -39,10 +39,10 @@ | ||||||
| 
 | 
 | ||||||
| #if !defined(HAVE_OPENPTY) | #if !defined(HAVE_OPENPTY) | ||||||
| #if defined(__hpux) | #if defined(__hpux) | ||||||
| static | static const | ||||||
| char	*MasterDevice = "/dev/ptym/pty%s", | char	MasterDevice[] = "/dev/ptym/pty%s", | ||||||
| 	*SlaveDevice =  "/dev/pty/tty%s", | 	SlaveDevice[] =  "/dev/pty/tty%s", | ||||||
| 	*deviceNo[] = { | 	*const deviceNo[] = { | ||||||
| 		"p0","p1","p2","p3","p4","p5","p6","p7", | 		"p0","p1","p2","p3","p4","p5","p6","p7", | ||||||
| 		"p8","p9","pa","pb","pc","pd","pe","pf", | 		"p8","p9","pa","pb","pc","pd","pe","pf", | ||||||
| 		"q0","q1","q2","q3","q4","q5","q6","q7", | 		"q0","q1","q2","q3","q4","q5","q6","q7", | ||||||
|  | @ -62,10 +62,10 @@ char	*MasterDevice = "/dev/ptym/pty%s", | ||||||
| 		0, | 		0, | ||||||
| 	}; | 	}; | ||||||
| #elif defined(_IBMESA)  /* AIX/ESA */ | #elif defined(_IBMESA)  /* AIX/ESA */ | ||||||
| static | static const | ||||||
| char	*MasterDevice = "/dev/ptyp%s", | char	MasterDevice[] = "/dev/ptyp%s", | ||||||
|   	*SlaveDevice = "/dev/ttyp%s", |   	SlaveDevice[] = "/dev/ttyp%s", | ||||||
| 	*deviceNo[] = { | 	*const deviceNo[] = { | ||||||
| "00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f", | "00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f", | ||||||
| "10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f", | "10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f", | ||||||
| "20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f", | "20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f", | ||||||
|  | @ -84,10 +84,10 @@ char	*MasterDevice = "/dev/ptyp%s", | ||||||
| "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff", | "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff", | ||||||
| 		}; | 		}; | ||||||
| #elif !defined(HAVE_PTSNAME) | #elif !defined(HAVE_PTSNAME) | ||||||
| static | static const | ||||||
| char	*MasterDevice = "/dev/pty%s", | char	MasterDevice[] = "/dev/pty%s", | ||||||
| 	*SlaveDevice = "/dev/tty%s", | 	SlaveDevice[] = "/dev/tty%s", | ||||||
| 	*deviceNo[] = { | 	*const deviceNo[] = { | ||||||
| 		"p0","p1","p2","p3","p4","p5","p6","p7", | 		"p0","p1","p2","p3","p4","p5","p6","p7", | ||||||
| 		"p8","p9","pa","pb","pc","pd","pe","pf", | 		"p8","p9","pa","pb","pc","pd","pe","pf", | ||||||
| 		"q0","q1","q2","q3","q4","q5","q6","q7", | 		"q0","q1","q2","q3","q4","q5","q6","q7", | ||||||
|  | @ -101,8 +101,6 @@ char	*MasterDevice = "/dev/pty%s", | ||||||
| #endif | #endif | ||||||
| #endif /* !defined(HAVE_OPENPTY) */ | #endif /* !defined(HAVE_OPENPTY) */ | ||||||
| 
 | 
 | ||||||
| static char SlaveName[DEVICELEN]; |  | ||||||
| 
 |  | ||||||
| #ifndef HAVE_SETEUID | #ifndef HAVE_SETEUID | ||||||
| # ifdef HAVE_SETREUID | # ifdef HAVE_SETREUID | ||||||
| #  define seteuid(e)	setreuid(-1, (e)) | #  define seteuid(e)	setreuid(-1, (e)) | ||||||
|  | @ -155,17 +153,15 @@ pty_syswait(info) | ||||||
| 	cpid = rb_waitpid(info->child_pid, &status, WUNTRACED); | 	cpid = rb_waitpid(info->child_pid, &status, WUNTRACED); | ||||||
| 	if (cpid == -1) return Qnil; | 	if (cpid == -1) return Qnil; | ||||||
| 
 | 
 | ||||||
| #if defined(IF_STOPPED) | #if defined(WIFSTOPPED) | ||||||
| 	if (IF_STOPPED(status)) { /* suspend */ | #elif defined(IF_STOPPED) | ||||||
| 	    raise_from_wait("stopped", info); | #define WIFSTOPPED(status) IF_STOPPED(status) | ||||||
| 	} |  | ||||||
| #elif defined(WIFSTOPPED) |  | ||||||
| 	if (WIFSTOPPED(status)) { /* suspend */ |  | ||||||
| 	    raise_from_wait("stopped", info); |  | ||||||
| 	} |  | ||||||
| #else | #else | ||||||
| ---->> Either IF_STOPPED or WIFSTOPPED is needed <<---- | ---->> Either IF_STOPPED or WIFSTOPPED is needed <<---- | ||||||
| #endif /* WIFSTOPPED | IF_STOPPED */ | #endif /* WIFSTOPPED | IF_STOPPED */ | ||||||
|  | 	if (WIFSTOPPED(status)) { /* suspend */ | ||||||
|  | 	    raise_from_wait("stopped", info); | ||||||
|  | 	} | ||||||
| 	else if (kill(info->child_pid, 0) == 0) { | 	else if (kill(info->child_pid, 0) == 0) { | ||||||
| 	    raise_from_wait("changed", info); | 	    raise_from_wait("changed", info); | ||||||
| 	} | 	} | ||||||
|  | @ -176,7 +172,7 @@ pty_syswait(info) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void getDevice _((int*, int*)); | static void getDevice _((int*, int*, char [DEVICELEN])); | ||||||
| 
 | 
 | ||||||
| struct exec_info { | struct exec_info { | ||||||
|     int argc; |     int argc; | ||||||
|  | @ -194,10 +190,11 @@ pty_exec(v) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| establishShell(argc, argv, info) | establishShell(argc, argv, info, SlaveName) | ||||||
|     int argc; |     int argc; | ||||||
|     VALUE *argv; |     VALUE *argv; | ||||||
|     struct pty_info *info; |     struct pty_info *info; | ||||||
|  |     char SlaveName[DEVICELEN]; | ||||||
| { | { | ||||||
|     int 		i,master,slave; |     int 		i,master,slave; | ||||||
|     char		*p,*getenv(); |     char		*p,*getenv(); | ||||||
|  | @ -223,7 +220,7 @@ establishShell(argc, argv, info) | ||||||
| 	argc = 1; | 	argc = 1; | ||||||
| 	argv = &v; | 	argv = &v; | ||||||
|     } |     } | ||||||
|     getDevice(&master,&slave); |     getDevice(&master, &slave, SlaveName); | ||||||
| 
 | 
 | ||||||
|     info->thread = rb_thread_current(); |     info->thread = rb_thread_current(); | ||||||
|     if((i = fork()) < 0) { |     if((i = fork()) < 0) { | ||||||
|  | @ -305,8 +302,9 @@ pty_finalize_syswait(info) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| get_device_once(master, slave, fail) | get_device_once(master, slave, SlaveName, fail) | ||||||
|     int *master, *slave, fail; |     int *master, *slave, fail; | ||||||
|  |     char SlaveName[DEVICELEN]; | ||||||
| { | { | ||||||
| #if defined HAVE_OPENPTY | #if defined HAVE_OPENPTY | ||||||
| /*
 | /*
 | ||||||
|  | @ -329,7 +327,7 @@ get_device_once(master, slave, fail) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     *slave = open(name, O_RDWR); |     *slave = open(name, O_RDWR); | ||||||
|     strcpy(SlaveName, name); |     strncpy(SlaveName, name, sizeof SlaveName); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| #else /* HAVE__GETPTY */ | #else /* HAVE__GETPTY */ | ||||||
|  | @ -356,7 +354,7 @@ get_device_once(master, slave, fail) | ||||||
| #endif | #endif | ||||||
| 				*master = i; | 				*master = i; | ||||||
| 				*slave = j; | 				*slave = j; | ||||||
| 				strcpy(SlaveName, pn); | 				strncpy(SlaveName, pn, sizeof SlaveName); | ||||||
| 				return 0; | 				return 0; | ||||||
| #if defined I_PUSH && !defined linux | #if defined I_PUSH && !defined linux | ||||||
| 			    } | 			    } | ||||||
|  | @ -375,10 +373,10 @@ get_device_once(master, slave, fail) | ||||||
|     char MasterName[DEVICELEN]; |     char MasterName[DEVICELEN]; | ||||||
| 
 | 
 | ||||||
|     for (p = deviceNo; *p != NULL; p++) { |     for (p = deviceNo; *p != NULL; p++) { | ||||||
| 	sprintf(MasterName,MasterDevice,*p); | 	snprintf(MasterName, sizeof MasterName, MasterDevice, *p); | ||||||
| 	if ((i = open(MasterName,O_RDWR,0)) >= 0) { | 	if ((i = open(MasterName,O_RDWR,0)) >= 0) { | ||||||
| 	    *master = i; | 	    *master = i; | ||||||
| 	    sprintf(SlaveName,SlaveDevice,*p); | 	    snprintf(SlaveName, sizeof SlaveName, SlaveDevice, *p); | ||||||
| 	    if ((j = open(SlaveName,O_RDWR,0)) >= 0) { | 	    if ((j = open(SlaveName,O_RDWR,0)) >= 0) { | ||||||
| 		*slave = j; | 		*slave = j; | ||||||
| 		chown(SlaveName, getuid(), getgid()); | 		chown(SlaveName, getuid(), getgid()); | ||||||
|  | @ -395,12 +393,13 @@ get_device_once(master, slave, fail) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| getDevice(master, slave) | getDevice(master, slave, slavename) | ||||||
|     int *master, *slave; |     int *master, *slave; | ||||||
|  |     char slavename[DEVICELEN]; | ||||||
| { | { | ||||||
|     if (get_device_once(master, slave, 0)) { |     if (get_device_once(master, slave, slavename, 0)) { | ||||||
| 	rb_gc(); | 	rb_gc(); | ||||||
| 	get_device_once(master, slave, 1); | 	get_device_once(master, slave, slavename, 1); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -417,11 +416,12 @@ pty_getpty(argc, argv, self) | ||||||
|     OpenFile *wfptr,*rfptr; |     OpenFile *wfptr,*rfptr; | ||||||
|     VALUE rport = rb_obj_alloc(rb_cFile); |     VALUE rport = rb_obj_alloc(rb_cFile); | ||||||
|     VALUE wport = rb_obj_alloc(rb_cFile); |     VALUE wport = rb_obj_alloc(rb_cFile); | ||||||
|  |     char SlaveName[DEVICELEN]; | ||||||
| 
 | 
 | ||||||
|     MakeOpenFile(rport, rfptr); |     MakeOpenFile(rport, rfptr); | ||||||
|     MakeOpenFile(wport, wfptr); |     MakeOpenFile(wport, wfptr); | ||||||
| 
 | 
 | ||||||
|     establishShell(argc, argv, &info); |     establishShell(argc, argv, &info, SlaveName); | ||||||
| 
 | 
 | ||||||
|     rfptr->mode = rb_io_mode_flags("r"); |     rfptr->mode = rb_io_mode_flags("r"); | ||||||
|     rfptr->f = fdopen(info.fd, "r"); |     rfptr->f = fdopen(info.fd, "r"); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 nobu
						nobu