📄 modem.c
字号:
/*--------------------------------------------------------------------*/
if ( IsNetwork() )
{
if (activeopenline(number, speed, bmodemflag[MODEM_DIRECT]))
{
hostp->hstatus = nodevice;
return FALSE;
}
}
else {
if (activeopenline(M_device, speed, bmodemflag[MODEM_DIRECT]))
{
hostp->hstatus = nodevice;
return FALSE;
}
while (sread(buf,1,0)); /* Discard trailing trash from modem
connect message */
/*--------------------------------------------------------------------*/
/* Initialize the modem */
/*--------------------------------------------------------------------*/
if (!sendlist( initialize, modemTimeout, modemTimeout, noconnect))
{
printmsg(0,"dial: Modem failed to initialize");
shutDown();
hostp->hstatus = dial_script_failed;
return FALSE;
}
/*--------------------------------------------------------------------*/
/* Setup the dial string and then dial the modem */
/*--------------------------------------------------------------------*/
strcpy(buf, dialPrefix);
strcat(buf, number);
if (dialSuffix != NULL)
strcat(buf, dialSuffix);
sendstr( buf ); /* Send the command to the telephone */
if (!sendlist(connect, modemTimeout, dialTimeout, noconnect))
{
hostp->hstatus = dial_failed;
return FALSE;
}
} /* if ( !IsNetwork() ) */
printmsg(3, "dial: Modem reports connected");
time( &remote_stats.lconnect );
remote_stats.calls ++ ;
if ( !IsNetwork() )
autobaud(speed); /* Reset modem speed, if desired */
setPrty(M_priority, M_prioritydelta );
/*--------------------------------------------------------------------*/
/* Report success to caller */
/*--------------------------------------------------------------------*/
return TRUE; /* Dial succeeded */
} /* dial */
/*--------------------------------------------------------------------*/
/* a u t o b a u d */
/* */
/* autobaud a modem which has just connected */
/*--------------------------------------------------------------------*/
static void autobaud( const BPS speed )
{
char buf[10];
ssleep(1); /* Allow modem port to stablize */
if (bmodemflag[MODEM_CD])
CD(); /* Set the carrier detect flags */
/*--------------------------------------------------------------------*/
/* Autobaud the modem if requested */
/*--------------------------------------------------------------------*/
if (!bmodemflag[MODEM_FIXEDSPEED])
{
size_t len = 0;
memset( buf, '\0', sizeof( buf )); /* Zero buffer */
while ((len < sizeof buf) && sread( &buf[len],1,0))
len = strlen( buf ); /* Get speed into buffer */
if (len > 5)
{
char *token; /* Pointer to buffer value */
token = strtok(buf,WHITESPACE);
if (strlen(token))
{
BPS new_speed = (unsigned) atol(token);
if ((new_speed != speed) && (new_speed > 300))
{
printmsg(2, "autobaud: speed select %s", token);
SIOSpeed(new_speed);
} /* if */
} /* if */
} /* if */
else
printmsg(3, "autobaud: unable to speed select, using %d", speed);
} /* if */
} /* autobaud */
/*--------------------------------------------------------------------*/
/* s h u t d o w n */
/* */
/* Terminate modem processing via hangup */
/*--------------------------------------------------------------------*/
void shutDown( void )
{
static boolean recurse = FALSE;
if ( ! portActive ) /* Allowed for Ctrl-Break */
return;
if ( !recurse )
{
boolean aborted = terminate_processing;
unsigned long saveRaised = raised;
recurse = TRUE;
terminate_processing = FALSE;
raised = 0;
hangup();
resetPrty(); // Drop out of hyperspace
sendlist( dropline, modemTimeout, modemTimeout, NULL);
recurse = FALSE;
terminate_processing |= aborted;
saveRaised |= raised;
}
closeline();
norecovery = TRUE;
} /* shutDown */
/*--------------------------------------------------------------------*/
/* s e n d l i s t */
/* */
/* Send a NULL terminated list of send/expect strings */
/*--------------------------------------------------------------------*/
static boolean sendlist( char **list,
int timeout,
int lasttimeout,
char **failure)
{
boolean expect = TRUE;
if (list == NULL) /* Was the field supplied? */
return TRUE; /* No --> Must be optional, return */
/*--------------------------------------------------------------------*/
/* Run through the list, alternating expect and send strings */
/*--------------------------------------------------------------------*/
while( *list != NULL)
{
if (expect)
{
char *exp = strdup( *list );
boolean success;
checkref( exp );
success = sendalt( exp,
(*(++list) == NULL) ? lasttimeout : timeout,
failure);
free( exp );
if (!success)
return FALSE;
}
else
sendstr( *list++ );
expect = ! expect;
} /* while */
/*--------------------------------------------------------------------*/
/* If we made it this far, success is at hand; return to caller */
/*--------------------------------------------------------------------*/
return TRUE;
} /* sendlist */
/*--------------------------------------------------------------------*/
/* s e n d a l t */
/* */
/* Expect a string, with alternates */
/*--------------------------------------------------------------------*/
static boolean sendalt( char *exp, int timeout, char **failure)
{
int ok;
for ( ;; )
{
char *alternate = strchr(exp, '-');
if (alternate != nil(char))
*alternate++ = '\0';
ok = expectstr(exp, timeout, failure);
if ( terminate_processing || raised )
{
shutDown();
return FALSE;
}
if (ok || (alternate == nil(char)))
return (ok == 1);
if (bmodemflag[MODEM_CD] && ! CD())
{
printmsg(0,"sendalt: Serial port reports modem not ready");
return FALSE;
}
exp = strchr(alternate, '-');
if (exp != nil(char))
*exp++ = '\0';
printmsg(0, "sending alternate");
sendstr(alternate);
} /*for*/
} /* sendalt */
/*--------------------------------------------------------------------*/
/* G e t G W i n d o w */
/* */
/* Report the size of the allowed window for the "g" protocol */
/*--------------------------------------------------------------------*/
KEWSHORT GetGWindow( KEWSHORT maxvalue , const char protocol )
{
KEWSHORT ourWindowSize = 0;
switch( protocol )
{
case 'g':
ourWindowSize = gWindowSize;
break;
case 'G':
ourWindowSize = GWindowSize;
break;
case 'v':
ourWindowSize = vWindowSize;
break;
default:
printmsg(0,"GetGWindow: Invalid protocol %c",protocol);
panic();
}
if ( (ourWindowSize < 1 ) || (ourWindowSize > maxvalue))
return maxvalue;
else
return ourWindowSize;
} /* GetGWindow */
/*--------------------------------------------------------------------*/
/* G e t G P a c k e t */
/* */
/* Return the allowed packet size for the "g" procotol */
/*--------------------------------------------------------------------*/
KEWSHORT GetGPacket( KEWSHORT maxvalue , const char protocol)
{
KEWSHORT savePacketSize ;
KEWSHORT ourPacketSize = 0;
int bits = 6; /* Minimum Packet Size is 64 bytes */
switch( protocol )
{
case 'g':
ourPacketSize = gPacketSize;
break;
case 'G':
ourPacketSize = GPacketSize;
break;
case 'v':
ourPacketSize = vPacketSize;
break;
default:
printmsg(0,"GetGPacket: Invalid protocol %c",protocol);
panic();
}
savePacketSize = ourPacketSize;
/*--------------------------------------------------------------------*/
/* Insure the value is a power of two */
/*--------------------------------------------------------------------*/
while( (ourPacketSize >> (bits+1)) > 0 )
bits++;
ourPacketSize = (ourPacketSize >> bits) << bits;
if ( savePacketSize != ourPacketSize )
printmsg(0,"packetsize for %c protocol rounded down from %d to %d",
protocol,
(int) savePacketSize, (int) ourPacketSize );
/*--------------------------------------------------------------------*/
/* Return the smaller of the argument (the largest packet size */
/* the packet driver supports) or what the modem file allows. */
/*--------------------------------------------------------------------*/
if ( (ourPacketSize < 1 ) || (ourPacketSize > maxvalue))
return maxvalue;
else
return ourPacketSize;
} /* GetGPacket */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -