rubysl-pty 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d77df78cc8ecc2aa4f7a0b17ea7caee11093fa21
4
+ data.tar.gz: 3ba373c4cc32822347f63e2b87221c101cfb9a43
5
+ SHA512:
6
+ metadata.gz: 101bdb40064ff296c584ab6b480be71e767e9af91c9d27aa991e3e7f8403660d1f3391a44732ac48b67f76d669bda8d437f929b785013cc5427296aa37d5cdf4
7
+ data.tar.gz: ccf8dc49c46a2333ccdc977674fd193048e0db7efbfd629e1b94353f691d8fb2d1a96b0c65413fefd981a10ea92546a7082b5c4705067c9c8695838b3872e1f0
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem update --system
4
+ - gem --version
5
+ - gem install rubysl-bundler
6
+ script: bundle exec mspec spec
7
+ rvm:
8
+ - rbx-nightly-18mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rubysl-pty.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2013, Brian Shirai
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ 3. Neither the name of the library nor the names of its contributors may be
13
+ used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT,
20
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,29 @@
1
+ # Rubysl::Pty
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rubysl-pty'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rubysl-pty
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,16 @@
1
+ require 'mkmf'
2
+
3
+ if /mswin32|mingw|bccwin32/ !~ RUBY_PLATFORM
4
+ have_header("sys/stropts.h")
5
+ have_header("sys/wait.h")
6
+ have_func("setresuid")
7
+ have_header("libutil.h")
8
+ have_header("pty.h")
9
+ have_library("util", "openpty")
10
+ if have_func("openpty") or
11
+ have_func("_getpty") or
12
+ have_func("ptsname") or
13
+ have_func("ioctl")
14
+ create_makefile('pty')
15
+ end
16
+ end
@@ -0,0 +1,470 @@
1
+ #include "config.h"
2
+ #include <stdio.h>
3
+ #include <sys/types.h>
4
+ #include <sys/stat.h>
5
+ #include <sys/file.h>
6
+ #include <fcntl.h>
7
+ #include <errno.h>
8
+ #include <pwd.h>
9
+ #ifdef HAVE_SYS_IOCTL_H
10
+ #include <sys/ioctl.h>
11
+ #endif
12
+ #ifdef HAVE_LIBUTIL_H
13
+ #include <libutil.h>
14
+ #endif
15
+ #ifdef HAVE_PTY_H
16
+ #include <pty.h>
17
+ #endif
18
+ #ifdef HAVE_SYS_WAIT_H
19
+ #include <sys/wait.h>
20
+ #else
21
+ #define WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
22
+ #endif
23
+ #include <ctype.h>
24
+
25
+ #include "ruby.h"
26
+ #include "rubyio.h"
27
+ #include "util.h"
28
+
29
+ #include <signal.h>
30
+ #ifdef HAVE_SYS_STROPTS_H
31
+ #include <sys/stropts.h>
32
+ #endif
33
+
34
+ #ifdef HAVE_UNISTD_H
35
+ #include <unistd.h>
36
+ #endif
37
+
38
+ #define DEVICELEN 16
39
+
40
+ #if !defined(HAVE_OPENPTY)
41
+ #if defined(__hpux)
42
+ static const
43
+ char MasterDevice[] = "/dev/ptym/pty%s",
44
+ SlaveDevice[] = "/dev/pty/tty%s",
45
+ *const deviceNo[] = {
46
+ "p0","p1","p2","p3","p4","p5","p6","p7",
47
+ "p8","p9","pa","pb","pc","pd","pe","pf",
48
+ "q0","q1","q2","q3","q4","q5","q6","q7",
49
+ "q8","q9","qa","qb","qc","qd","qe","qf",
50
+ "r0","r1","r2","r3","r4","r5","r6","r7",
51
+ "r8","r9","ra","rb","rc","rd","re","rf",
52
+ "s0","s1","s2","s3","s4","s5","s6","s7",
53
+ "s8","s9","sa","sb","sc","sd","se","sf",
54
+ "t0","t1","t2","t3","t4","t5","t6","t7",
55
+ "t8","t9","ta","tb","tc","td","te","tf",
56
+ "u0","u1","u2","u3","u4","u5","u6","u7",
57
+ "u8","u9","ua","ub","uc","ud","ue","uf",
58
+ "v0","v1","v2","v3","v4","v5","v6","v7",
59
+ "v8","v9","va","vb","vc","vd","ve","vf",
60
+ "w0","w1","w2","w3","w4","w5","w6","w7",
61
+ "w8","w9","wa","wb","wc","wd","we","wf",
62
+ 0,
63
+ };
64
+ #elif defined(_IBMESA) /* AIX/ESA */
65
+ static const
66
+ char MasterDevice[] = "/dev/ptyp%s",
67
+ SlaveDevice[] = "/dev/ttyp%s",
68
+ *const deviceNo[] = {
69
+ "00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f",
70
+ "10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f",
71
+ "20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f",
72
+ "30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f",
73
+ "40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f",
74
+ "50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f",
75
+ "60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f",
76
+ "70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f",
77
+ "80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f",
78
+ "90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f",
79
+ "a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af",
80
+ "b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf",
81
+ "c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf",
82
+ "d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df",
83
+ "e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef",
84
+ "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff",
85
+ };
86
+ #elif !defined(HAVE_PTSNAME)
87
+ static const
88
+ char MasterDevice[] = "/dev/pty%s",
89
+ SlaveDevice[] = "/dev/tty%s",
90
+ *const deviceNo[] = {
91
+ "p0","p1","p2","p3","p4","p5","p6","p7",
92
+ "p8","p9","pa","pb","pc","pd","pe","pf",
93
+ "q0","q1","q2","q3","q4","q5","q6","q7",
94
+ "q8","q9","qa","qb","qc","qd","qe","qf",
95
+ "r0","r1","r2","r3","r4","r5","r6","r7",
96
+ "r8","r9","ra","rb","rc","rd","re","rf",
97
+ "s0","s1","s2","s3","s4","s5","s6","s7",
98
+ "s8","s9","sa","sb","sc","sd","se","sf",
99
+ 0,
100
+ };
101
+ #endif
102
+ #endif /* !defined(HAVE_OPENPTY) */
103
+
104
+ #ifndef HAVE_SETEUID
105
+ # ifdef HAVE_SETREUID
106
+ # define seteuid(e) setreuid(-1, (e))
107
+ # else /* NOT HAVE_SETREUID */
108
+ # ifdef HAVE_SETRESUID
109
+ # define seteuid(e) setresuid(-1, (e), -1)
110
+ # else /* NOT HAVE_SETRESUID */
111
+ /* I can't set euid. (;_;) */
112
+ # endif /* HAVE_SETRESUID */
113
+ # endif /* HAVE_SETREUID */
114
+ #endif /* NO_SETEUID */
115
+
116
+ static VALUE eChildExited;
117
+
118
+ static VALUE
119
+ echild_status(self)
120
+ VALUE self;
121
+ {
122
+ return rb_ivar_get(self, rb_intern("status"));
123
+ }
124
+
125
+ struct pty_info {
126
+ int fd;
127
+ int child_pid;
128
+ VALUE thread;
129
+ };
130
+
131
+ static void
132
+ raise_from_wait(state, info)
133
+ struct pty_info *info;
134
+ char *state;
135
+ {
136
+ VALUE last_status = rb_gv_get("$?");
137
+ char buf[1024];
138
+ VALUE exc;
139
+
140
+ snprintf(buf, sizeof(buf), "pty - %s: %ld", state, (long)info->child_pid);
141
+ exc = rb_exc_new2(eChildExited, buf);
142
+ rb_iv_set(exc, "status", last_status);
143
+ rb_funcall(info->thread, rb_intern("raise"), 1, exc);
144
+ }
145
+
146
+ static VALUE
147
+ pty_syswait(info)
148
+ struct pty_info *info;
149
+ {
150
+ int cpid, status;
151
+
152
+ for (;;) {
153
+ cpid = rb_waitpid(info->child_pid, &status, WUNTRACED);
154
+ if (cpid == -1) return Qnil;
155
+
156
+ #if defined(WIFSTOPPED)
157
+ #elif defined(IF_STOPPED)
158
+ #define WIFSTOPPED(status) IF_STOPPED(status)
159
+ #else
160
+ ---->> Either IF_STOPPED or WIFSTOPPED is needed <<----
161
+ #endif /* WIFSTOPPED | IF_STOPPED */
162
+ if (WIFSTOPPED(status)) { /* suspend */
163
+ raise_from_wait("stopped", info);
164
+ }
165
+ else if (kill(info->child_pid, 0) == 0) {
166
+ raise_from_wait("changed", info);
167
+ }
168
+ else {
169
+ raise_from_wait("exited", info);
170
+ return Qnil;
171
+ }
172
+ }
173
+ }
174
+
175
+ static void getDevice _((int*, int*, char [DEVICELEN]));
176
+
177
+ struct exec_info {
178
+ int argc;
179
+ VALUE *argv;
180
+ };
181
+
182
+ static VALUE pty_exec _((VALUE v));
183
+
184
+ static VALUE
185
+ pty_exec(v)
186
+ VALUE v;
187
+ {
188
+ struct exec_info *arg = (struct exec_info *)v;
189
+ return rb_funcall2(rb_mKernel, rb_intern("exec"),
190
+ arg->argc, arg->argv);
191
+ }
192
+
193
+ static void
194
+ establishShell(argc, argv, info, SlaveName)
195
+ int argc;
196
+ VALUE *argv;
197
+ struct pty_info *info;
198
+ char SlaveName[DEVICELEN];
199
+ {
200
+ int i, master, slave;
201
+ char *p, tmp, *getenv();
202
+ struct passwd *pwent;
203
+ VALUE v;
204
+ struct exec_info arg;
205
+ int status;
206
+
207
+ if (argc == 0) {
208
+ char *shellname;
209
+
210
+ if ((p = getenv("SHELL")) != NULL) {
211
+ shellname = p;
212
+ }
213
+ else {
214
+ pwent = getpwuid(getuid());
215
+ if (pwent && pwent->pw_shell)
216
+ shellname = pwent->pw_shell;
217
+ else
218
+ shellname = "/bin/sh";
219
+ }
220
+ v = rb_str_new2(shellname);
221
+ argc = 1;
222
+ argv = &v;
223
+ }
224
+ getDevice(&master, &slave, SlaveName);
225
+
226
+ info->thread = rb_thread_current();
227
+ VALUE child_pid = rb_funcall(rb_mKernel, rb_intern("fork"), 0);
228
+
229
+ /* if(i < 0) { */
230
+ /* close(master); */
231
+ /* close(slave); */
232
+ /* rb_sys_fail("fork failed"); */
233
+ /* } */
234
+
235
+ if(child_pid == Qnil) { /* child */
236
+ /*
237
+ * Set free from process group and controlling terminal
238
+ */
239
+ #ifdef HAVE_SETSID
240
+ (void) setsid();
241
+ #else /* HAS_SETSID */
242
+ # ifdef HAVE_SETPGRP
243
+ # ifdef SETGRP_VOID
244
+ if (setpgrp() == -1)
245
+ perror("setpgrp()");
246
+ # else /* SETGRP_VOID */
247
+ if (setpgrp(0, getpid()) == -1)
248
+ rb_sys_fail("setpgrp()");
249
+ if ((i = open("/dev/tty", O_RDONLY)) < 0)
250
+ rb_sys_fail("/dev/tty");
251
+ else {
252
+ if (ioctl(i, TIOCNOTTY, (char *)0))
253
+ perror("ioctl(TIOCNOTTY)");
254
+ close(i);
255
+ }
256
+ # endif /* SETGRP_VOID */
257
+ # endif /* HAVE_SETPGRP */
258
+ #endif /* HAS_SETSID */
259
+
260
+ /*
261
+ * obtain new controlling terminal
262
+ */
263
+ #if defined(TIOCSCTTY)
264
+ close(master);
265
+ (void) ioctl(slave, TIOCSCTTY, (char *)0);
266
+ /* errors ignored for sun */
267
+ #else
268
+ close(slave);
269
+ slave = open(SlaveName, O_RDWR);
270
+ if (slave < 0) {
271
+ perror("open: pty slave");
272
+ _exit(1);
273
+ }
274
+ close(master);
275
+ #endif
276
+ write(slave, "", 1);
277
+ dup2(slave,0);
278
+ dup2(slave,1);
279
+ dup2(slave,2);
280
+ close(slave);
281
+ #if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) || defined(HAVE_SETRESUID)
282
+ seteuid(getuid());
283
+ #endif
284
+
285
+ arg.argc = argc;
286
+ arg.argv = argv;
287
+ rb_protect(pty_exec, (VALUE)&arg, &status);
288
+ sleep(1);
289
+ _exit(1);
290
+ }
291
+
292
+ read(master, &tmp, 1);
293
+ close(slave);
294
+
295
+ info->child_pid = FIX2INT(child_pid);
296
+ info->fd = master;
297
+ }
298
+
299
+ static int
300
+ get_device_once(master, slave, SlaveName, fail)
301
+ int *master, *slave, fail;
302
+ char SlaveName[DEVICELEN];
303
+ {
304
+ #if defined HAVE_OPENPTY
305
+ /*
306
+ * Use openpty(3) of 4.3BSD Reno and later,
307
+ * or the same interface function.
308
+ */
309
+ if (openpty(master, slave, SlaveName,
310
+ (struct termios *)0, (struct winsize *)0) == -1) {
311
+ if (!fail) return -1;
312
+ rb_raise(rb_eRuntimeError, "openpty() failed");
313
+ }
314
+
315
+ return 0;
316
+ #elif defined HAVE__GETPTY
317
+ char *name;
318
+
319
+ if (!(name = _getpty(master, O_RDWR, 0622, 0))) {
320
+ if (!fail) return -1;
321
+ rb_raise(rb_eRuntimeError, "_getpty() failed");
322
+ }
323
+
324
+ *slave = open(name, O_RDWR);
325
+ strncpy(SlaveName, name, sizeof SlaveName);
326
+
327
+ return 0;
328
+ #else /* HAVE__GETPTY */
329
+ int i,j;
330
+
331
+ #ifdef HAVE_PTSNAME
332
+ char *pn;
333
+ void (*s)();
334
+
335
+ extern char *ptsname(int);
336
+ extern int unlockpt(int);
337
+ extern int grantpt(int);
338
+
339
+ if((i = open("/dev/ptmx", O_RDWR, 0)) != -1) {
340
+ s = signal(SIGCHLD, SIG_DFL);
341
+ if(grantpt(i) != -1) {
342
+ signal(SIGCHLD, s);
343
+ if(unlockpt(i) != -1) {
344
+ if((pn = ptsname(i)) != NULL) {
345
+ if((j = open(pn, O_RDWR, 0)) != -1) {
346
+ #if defined I_PUSH && !defined linux
347
+ if(ioctl(j, I_PUSH, "ptem") != -1) {
348
+ if(ioctl(j, I_PUSH, "ldterm") != -1) {
349
+ ioctl(j, I_PUSH, "ttcompat");
350
+ #endif
351
+ *master = i;
352
+ *slave = j;
353
+ strncpy(SlaveName, pn, sizeof SlaveName);
354
+ return 0;
355
+ #if defined I_PUSH && !defined linux
356
+ }
357
+ }
358
+ #endif
359
+ }
360
+ }
361
+ }
362
+ }
363
+ close(i);
364
+ }
365
+ if (!fail) rb_raise(rb_eRuntimeError, "can't get Master/Slave device");
366
+ return -1;
367
+ #else
368
+ char **p;
369
+ char MasterName[DEVICELEN];
370
+
371
+ for (p = deviceNo; *p != NULL; p++) {
372
+ snprintf(MasterName, sizeof MasterName, MasterDevice, *p);
373
+ if ((i = open(MasterName,O_RDWR,0)) >= 0) {
374
+ *master = i;
375
+ snprintf(SlaveName, sizeof SlaveName, SlaveDevice, *p);
376
+ if ((j = open(SlaveName,O_RDWR,0)) >= 0) {
377
+ *slave = j;
378
+ chown(SlaveName, getuid(), getgid());
379
+ chmod(SlaveName, 0622);
380
+ return 0;
381
+ }
382
+ close(i);
383
+ }
384
+ }
385
+ if (fail) rb_raise(rb_eRuntimeError, "can't get %s", SlaveName);
386
+ return -1;
387
+ #endif
388
+ #endif
389
+ }
390
+
391
+ static void
392
+ getDevice(master, slave, slavename)
393
+ int *master, *slave;
394
+ char slavename[DEVICELEN];
395
+ {
396
+ if (get_device_once(master, slave, slavename, 0)) {
397
+ rb_gc();
398
+ get_device_once(master, slave, slavename, 1);
399
+ }
400
+ }
401
+
402
+ /* ruby function: getpty */
403
+ static VALUE
404
+ pty_getpty(argc, argv, self)
405
+ int argc;
406
+ VALUE *argv;
407
+ VALUE self;
408
+ {
409
+ VALUE res, rport, wport;
410
+ struct pty_info info;
411
+ struct pty_info thinfo;
412
+ rb_io_t *wfptr,*rfptr;
413
+ char SlaveName[DEVICELEN];
414
+
415
+ establishShell(argc, argv, &info, SlaveName);
416
+
417
+ rport = rb_funcall(rb_cFile, rb_intern("new"), 2, INT2FIX(info.fd),
418
+ rb_str_new2("r"));
419
+
420
+ rb_ivar_set(rport, rb_intern("@path"), rb_str_new2(SlaveName));
421
+
422
+ wport = rb_funcall(rb_cFile, rb_intern("new"), 2, INT2FIX(dup(info.fd)),
423
+ rb_str_new2("r"));
424
+
425
+ rb_ivar_set(wport, rb_intern("@path"), rb_str_new2(SlaveName));
426
+ rb_funcall(wport, rb_intern("sync="), 1, Qtrue);
427
+
428
+ res = rb_ary_new2(3);
429
+ rb_ary_store(res,0,(VALUE)rport);
430
+ rb_ary_store(res,1,(VALUE)wport);
431
+ rb_ary_store(res,2,INT2FIX(info.child_pid));
432
+
433
+ if (rb_block_given_p()) {
434
+ rb_yield(res);
435
+ return Qnil;
436
+ }
437
+ return res;
438
+ }
439
+
440
+ /* ruby function: protect_signal - obsolete */
441
+ static VALUE
442
+ pty_protect(self)
443
+ VALUE self;
444
+ {
445
+ rb_warn("PTY::protect_signal is no longer needed");
446
+ rb_yield(Qnil);
447
+ return self;
448
+ }
449
+
450
+ /* ruby function: reset_signal - obsolete */
451
+ static VALUE
452
+ pty_reset_signal(self)
453
+ VALUE self;
454
+ {
455
+ rb_warn("PTY::reset_signal is no longer needed");
456
+ return self;
457
+ }
458
+
459
+ void
460
+ Init_pty()
461
+ {
462
+ VALUE cPTY = rb_define_module("PTY");
463
+ rb_define_module_function(cPTY,"getpty",pty_getpty,-1);
464
+ rb_define_module_function(cPTY,"spawn",pty_getpty,-1);
465
+ rb_define_module_function(cPTY,"protect_signal",pty_protect,0);
466
+ rb_define_module_function(cPTY,"reset_signal",pty_reset_signal,0);
467
+
468
+ eChildExited = rb_define_class_under(cPTY,"ChildExited",rb_eRuntimeError);
469
+ rb_define_method(eChildExited,"status",echild_status,0);
470
+ }
@@ -0,0 +1 @@
1
+ require "rubysl/pty"
@@ -0,0 +1,2 @@
1
+ require "pty/pty"
2
+ require "rubysl/pty/version"
@@ -0,0 +1,5 @@
1
+ module RubySL
2
+ module PTY
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ require './lib/rubysl/pty/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "rubysl-pty"
6
+ spec.version = RubySL::PTY::VERSION
7
+ spec.authors = ["Brian Shirai"]
8
+ spec.email = ["brixen@gmail.com"]
9
+ spec.description = %q{Ruby standard library pty.}
10
+ spec.summary = %q{Ruby standard library pty.}
11
+ spec.homepage = "https://github.com/rubysl/rubysl-pty"
12
+ spec.license = "BSD"
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.extensions = ["ext/rubysl/pty/extconf.rb"]
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "mspec", "~> 1.5"
23
+ spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
24
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubysl-pty
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brian Shirai
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubysl-prettyprint
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ description: Ruby standard library pty.
70
+ email:
71
+ - brixen@gmail.com
72
+ executables: []
73
+ extensions:
74
+ - ext/rubysl/pty/extconf.rb
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - .travis.yml
79
+ - Gemfile
80
+ - LICENSE
81
+ - README.md
82
+ - Rakefile
83
+ - ext/rubysl/pty/extconf.rb
84
+ - ext/rubysl/pty/pty.c
85
+ - lib/pty.rb
86
+ - lib/rubysl/pty.rb
87
+ - lib/rubysl/pty/version.rb
88
+ - rubysl-pty.gemspec
89
+ homepage: https://github.com/rubysl/rubysl-pty
90
+ licenses:
91
+ - BSD
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.0.7
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: Ruby standard library pty.
113
+ test_files: []