Author: rmottola
Date: Tue Mar 15 19:13:29 2016
New Revision: 39545

URL: http://svn.gna.org/viewcvs/gnustep?rev=39545&view=rev
Log:
Use stdio/stdout over pipes instead of a tty

Modified:
    apps/projectcenter/trunk/ChangeLog
    apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.h
    apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.m

Modified: apps/projectcenter/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/apps/projectcenter/trunk/ChangeLog?rev=39545&r1=39544&r2=39545&view=diff
==============================================================================
--- apps/projectcenter/trunk/ChangeLog  (original)
+++ apps/projectcenter/trunk/ChangeLog  Tue Mar 15 19:13:29 2016
@@ -1,3 +1,9 @@
+2016-03-14 Riccardo Mottola <r...@gnu.org>
+
+       * Modules/Debuggers/ProjectCenter/PTYView.h
+       * Modules/Debuggers/ProjectCenter/PTYView.m
+       Use stdio/stdout over pipes instead of a tty
+
 2016-03-08 Riccardo Mottola <r...@gnu.org>
 
        * Framework/PCProjectLauncher.m

Modified: apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.h
URL: 
http://svn.gna.org/viewcvs/gnustep/apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.h?rev=39545&r1=39544&r2=39545&view=diff
==============================================================================
--- apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.h  
(original)
+++ apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.h  Tue Mar 
15 19:13:29 2016
@@ -26,13 +26,10 @@
 @interface PTYView : NSTextView
 {
   NSTask *task;
-  NSFileHandle *master_handle;
-  NSFileHandle *slave_handle;
+  NSFileHandle *stdinHandle;
+  NSFileHandle *stdoutHandle;
   NSFileHandle *error_handle;
-  int master_fd, slave_fd;
 }
-
-- (int)openpty;
 
 - (void)logString:(NSString *)str
           newLine:(BOOL)newLine;

Modified: apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.m
URL: 
http://svn.gna.org/viewcvs/gnustep/apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.m?rev=39545&r1=39544&r2=39545&view=diff
==============================================================================
--- apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.m  
(original)
+++ apps/projectcenter/trunk/Modules/Debuggers/ProjectCenter/PTYView.m  Tue Mar 
15 19:13:29 2016
@@ -1,9 +1,10 @@
 /*
 **  PTYView
 **
-**  Copyright (c) 2008-2012 Free Software Foundation
-**
-**  Author: Gregory Casamento <greg_casame...@yahoo.com>
+**  Copyright (c) 2008-2016 Free Software Foundation
+**
+**  Author: Gregory Casamento <greg.casame...@gmail.com>
+**          Riccardo Mottola <r...@gnu.org>
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License as published by
@@ -45,113 +46,14 @@
 #include <stdlib.h>
 #include <string.h>
 
+#import "PTYView.h"
 
 #ifndef NOTIFICATION_CENTER
 #define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter]
 #endif
 
-/* check for solaris */
-#if defined (__SVR4) && defined (__sun)
-#define __SOLARIS__ 1
-#define USE_FORKPTY_REPLACEMENT 1
-#endif
-
-#if defined(__SOLARIS__)
-#include <stropts.h>
-#endif
-
-
-#if !(defined (__NetBSD__)) && !(defined (__SOLARIS__)) && !(defined 
(__OpenBSD__)) && !(defined(__FreeBSD__))
-#  include <pty.h>
-#endif
-
-#import "PTYView.h"
-
-#ifdef USE_FORKPTY_REPLACEMENT
-int openpty(int *amaster, int *aslave, char *name, const struct termios 
*termp, const struct winsize *winp)
-{
-    int fdm, fds;
-    char *slaveName;
-    
-    fdm = open("/dev/ptmx", O_RDWR); /* open master */
-    if (fdm == -1)
-    {
-       perror("openpty:open(master)");
-       return -1;
-    }
-    if(grantpt(fdm))                    /* grant access to the slave */
-    {
-       perror("openpty:grantpt(master)");
-       close(fdm);
-       return -1;
-    }
-    if(unlockpt(fdm))                /* unlock the slave terminal */
-    {
-       perror("openpty:unlockpt(master)");
-       close(fdm);
-       return -1;
-    }
-    
-    slaveName = ptsname(fdm);        /* get name of the slave */
-    if (slaveName == NULL)
-    {
-       perror("openpty:ptsname(master)");
-       close(fdm);
-       return -1;
-    }
-    if (name)                        /* of name ptr not null, copy it name 
back */
-        strcpy(name, slaveName);
-    
-    fds = open(slaveName, O_RDWR | O_NOCTTY); /* open slave */
-    if (fds == -1)
-    {
-       perror("openpty:open(slave)");
-       close (fdm);
-       return -1;
-    }
-    
-    /* ldterm and ttcompat are automatically pushed on the stack on some 
systems*/
-#ifdef __SOLARIS__
-    if (ioctl(fds, I_PUSH, "ptem") == -1) /* pseudo terminal module */
-    {
-       perror("openpty:ioctl(I_PUSH, ptem");
-       close(fdm);
-       close(fds);
-       return -1;
-    }
-    if (ioctl(fds, I_PUSH, "ldterm") == -1)  /* ldterm must stay atop ptem */
-    {
-       perror("forkpty:ioctl(I_PUSH, ldterm");
-       close(fdm);
-       close(fds);
-       return -1;
-    }
-#endif
-    
-    /* set terminal parameters if present */
-    // if (termp)
-    // ioctl(fds, TCSETS, termp);
-    //if (winp)
-    //    ioctl(fds, TIOCSWINSZ, winp);
-    
-    *amaster = fdm;
-    *aslave = fds;
-    return 0;
-}
-#endif
 
 @implementation PTYView
-/**
- * Creates master device. 
- */
-- (int) openpty
-{
-  if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) == -1)
-    {
-      NSLog(@"Call to openpty(...) failed.");
-    }
-  return master_fd;
-}
 
 /**
  * Log string to the view.
@@ -205,7 +107,7 @@
 - (void) logStdOut:(NSNotification *)aNotif
 {
   NSData *data;
-  NSFileHandle *handle = master_handle;
+  NSFileHandle *handle = stdoutHandle;
 
   if ((data = [handle availableData]) && [data length] > 0)
     {
@@ -284,74 +186,73 @@
       withArguments: (NSArray *)array
    logStandardError: (BOOL)logError
 {
+  NSPipe *inPipe;
+  NSPipe *outPipe;
+  
   task = [[NSTask alloc] init];
   [task setArguments: array];
   [task setCurrentDirectoryPath: directory];
   [task setLaunchPath: path];
 
-  master_fd = [self openpty];
-  if(master_fd > 0)
-    {
-      if(slave_fd > 0)
-       {
-         slave_handle = [[NSFileHandle alloc] initWithFileDescriptor: 
slave_fd]; 
-         master_handle = [[NSFileHandle alloc] initWithFileDescriptor: 
master_fd];
-         [task setStandardOutput: slave_handle];
-         [task setStandardInput: slave_handle];
-
-         [master_handle waitForDataInBackgroundAndNotify];
-
-         // Log standard error, if requested.
-         if(logError)
-           {
-             [task setStandardError: [NSPipe pipe]];
-             error_handle = [[task standardError] fileHandleForReading];
-             [error_handle waitForDataInBackgroundAndNotify];
-
-             [NOTIFICATION_CENTER addObserver:self 
-                                  selector:@selector(logErrOut:)
-                                  name:NSFileHandleDataAvailableNotification
-                                  object:error_handle];
-           }
-
-         // set up notifications to get data.
-         [NOTIFICATION_CENTER addObserver:self 
-                              selector:@selector(logStdOut:)
-                              name:NSFileHandleDataAvailableNotification
-                              object:master_handle];
-
-
-         [NOTIFICATION_CENTER addObserver:self 
-                              selector:@selector(taskDidTerminate:) 
-                              name:NSTaskDidTerminateNotification
-                              object:task];
-
-         // run the task...
-         NS_DURING
-           {
-             [self logString: [self startMessage]
-                   newLine:YES];
-             [task launch];
-           }
-         NS_HANDLER
-           {
-             NSRunAlertPanel(@"Problem Launching Debugger",
-                             [localException reason],
-                             @"OK", nil, nil, nil);
+  inPipe = [NSPipe pipe];
+  outPipe = [NSPipe pipe];
+  stdinHandle = [[inPipe fileHandleForWriting] retain];
+  stdoutHandle = [[outPipe fileHandleForReading] retain];
+  [task setStandardOutput: outPipe];
+  [task setStandardInput: inPipe];
+
+  [stdoutHandle waitForDataInBackgroundAndNotify];
+
+  // Log standard error, if requested.
+  if(logError)
+    {
+      [task setStandardError: [NSPipe pipe]];
+      error_handle = [[task standardError] fileHandleForReading];
+      [error_handle waitForDataInBackgroundAndNotify];
+
+      [NOTIFICATION_CENTER addObserver:self 
+                             selector:@selector(logErrOut:)
+                                 name:NSFileHandleDataAvailableNotification
+                               object:error_handle];
+    }
+
+  // set up notifications to get data.
+  [NOTIFICATION_CENTER addObserver:self 
+                         selector:@selector(logStdOut:)
+                             name:NSFileHandleDataAvailableNotification
+                           object:stdoutHandle];
+
+
+  [NOTIFICATION_CENTER addObserver:self 
+                         selector:@selector(taskDidTerminate:) 
+                             name:NSTaskDidTerminateNotification
+                           object:task];
+
+  // run the task...
+  NS_DURING
+    {
+      [self logString: [self startMessage]
+             newLine:YES];
+      [task launch];
+    }
+  NS_HANDLER
+    {
+      NSRunAlertPanel(@"Problem Launching Debugger",
+                     [localException reason],
+                     @"OK", nil, nil, nil);
              
              
-             NSLog(@"Task Terminated Unexpectedly...");
-             [self logString: @"\n=== Task Terminated Unexpectedly ===\n" 
-                   newLine:YES];      
+      NSLog(@"Task Terminated Unexpectedly...");
+      [self logString: @"\n=== Task Terminated Unexpectedly ===\n" 
+             newLine:YES];      
              
-             //Clean up after task is terminated
-             [[NSNotificationCenter defaultCenter] 
+      //Clean up after task is terminated
+      [[NSNotificationCenter defaultCenter] 
                postNotificationName: NSTaskDidTerminateNotification
-               object: task];
-           }
-         NS_ENDHANDLER
-       }
-    }
+                             object: task];
+    }
+  NS_ENDHANDLER
+
 }
 
 - (void) terminate
@@ -374,7 +275,8 @@
   unichar *str = (unichar *)[string cStringUsingEncoding: [NSString 
defaultCStringEncoding]];
   int len = strlen((char *)str);
   NSData *data = [NSData dataWithBytes: str length: len];
-  [master_handle writeData: data];  
+  [stdinHandle writeData: data];
+  [stdinHandle synchronizeFile];
 }
 
 /**
@@ -383,7 +285,7 @@
 - (void) putChar:(unichar)ch
 {
   NSData *data = [NSData dataWithBytes: &ch length: 1];
-  [master_handle writeData: data];
+  [stdinHandle writeData: data];
 } 
 
 - (void) interrupt


_______________________________________________
Gnustep-cvs mailing list
Gnustep-cvs@gna.org
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to