This is Dial.m in view mode; [Download] [Up]
//
// quick and dirty:
// dialing with the ZyXEL modem
// by: Olaf Mueller <olaf@orest.escape.de>
//
#import "Dial.h"
@interface Dial (PrivateDialMethods)
static int dodial (ChildParam *param) ;
@end
@implementation Dial
- init
{
[super init] ;
[NXApp loadNibSection:"Dial.nib" owner:self] ;
[myWindow setFrameAutosaveName: "Dial"] ;
return self ;
}
- newNumber: (const char*)number
{
if (number)
[myNumberField setStringValue: number] ;
[myNumberField selectText: self] ;
[myWindow makeKeyAndOrderFront: self] ;
return self ;
}
- doDial: sender
{
[myNumberField selectText: self] ;
if (param.dialpid)
{
//printf (" killing dial\n") ;
kill (param.dialpid,SIGINT) ;
}
else
{
strcpy (param.cmd,NXGetDefaultValue([NXApp appName],"dial_command")) ;
strcpy (param.port,NXGetDefaultValue([NXApp appName],"device")) ;
//printf (" starting %s on device %s\n",param.cmd,param.port);
strcpy (param.number,[myNumberField stringValue]) ;
param.reportField = myReportField ;
param.button = myDialButton ;
cthread_detach (cthread_fork((cthread_fn_t)dodial,(any_t)¶m)) ;
}
return self ;
}
// ------------------- private methods -------------------------
static int dodial (ChildParam *param)
{
char buffer [1000] , *cp ;
int pipeFrom[2] ;
int pipeTo[2] ;
int pidChild ;
FILE *fpFromChild ;
int toChild ;
pipe (pipeFrom) ; pipe (pipeTo) ;
switch (pidChild = vfork())
{
case -1: // error
break ;
case 0: // child
dup2 (pipeTo[0],0) ;
dup2 (pipeFrom[1],1) ;
execl (param->cmd,param->cmd,param->port,param->number,0) ;
break ;
default: // parent
param->dialpid = pidChild ;
[param->button setTitle: "Hangup"] ; NXPing () ;
close (pipeFrom[1]) ;
close (pipeTo[0]) ;
if ((fpFromChild = fdopen(pipeFrom[0],"r")) != NULL)
{
toChild = pipeTo [1] ;
while (fgets(buffer,sizeof(buffer),fpFromChild))
{
if ((cp = strstr(buffer,"dial: ")) == NULL)
cp = buffer ;
else
cp = buffer + 6 ;
//printf (" write: %s",cp) ;
[param->reportField setStringValue: cp] ; NXPing () ;
}
fclose (fpFromChild) ;
}
else
{
//printf (" cannot open pipe to dial command\n") ;
}
[param->button setTitle: "Dial"] ; NXPing () ;
//printf (" dial terminated\n") ;
param->dialpid = 0 ;
break ;
}
return 0 ;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.