home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
comm
/
misc
/
cyberpager
/
source
/
dialer
/
doservice.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-07
|
7KB
|
300 lines
#include "dialer.h"
typedef struct {
ULONG med_Entries;
struct ExAllData med_Data[100];
} MyExAllBuf_t;
MyExAllBuf_t ead1, ead2;
static UBYTE fileNameBuffer[FILENAME_BUF_SIZE];
static const UBYTE EndOfTrans[] =
{
HSHAKE_EOT, '\r'
};
static int ProcessExAllBuffer(PagerService_t * svc, STRPTR spoolDir, MyExAllBuf_t * edata, ULONG *sentCount)
{
struct ExAllData *ead;
int result;
result = 0;
if (edata->med_Entries) {
if (strlen(spoolDir) + 16 > sizeof(fileNameBuffer)) {
ErrorMsg("spool filename too long.");
ULog(ph, -1, "spool filename too long.");
return 5;
}
ead = edata->med_Data;
while (ead && !result) {
strcpy(fileNameBuffer, spoolDir);
AddPart(fileNameBuffer, ead->ed_Name, sizeof(fileNameBuffer));
result = SendSpoolFile(svc, fileNameBuffer);
if (!result)
*sentCount += 1;
ead = ead->ed_Next;
}
}
return result;
}
static const UBYTE WildCards[] = "#[0-9A-Z]";
static UBYTE Pattern[sizeof(WildCards) * 2 + 2];
int DoOneService(STRPTR serviceName, BOOL oneShot)
{
STRPTR spoolDir;
BPTR spoolLock;
struct ExAllControl *eac;
MyExAllBuf_t *eadata, *ead;
PagerService_t *svc;
int more;
int result;
ULONG sentCount, totalSentCount;
totalSentCount = 0;
result = 5;
if (svc = FindPagerService(ph, serviceName)) {
SetLogService(ph, svc->svc_Name);
/*
* we lock on the service's name to insure that concurrent
* dialers don't try to call the same service at the same
* time.
*/
if (LockFile(ph, svc->svc_Name)) {
if (spoolDir = NameInSpool(ph, svc->svc_Name)) {
if (spoolLock = Lock(spoolDir, ACCESS_READ)) {
if (ParsePatternNoCase((STRPTR)WildCards, Pattern, sizeof(Pattern)) >= 0) {
if (eac = (struct ExAllControl *)AllocDosObject(DOS_EXALLCONTROL, TAG_DONE)) {
sentCount = 1; /* so that we enter the
* loop the first time */
result = 0;
/*
* we loop looking
* for files until
* there are none
* more left to send.
* this way, if more
* files are spooled
* for a service
* while we are
* on-line talking to
* it, we'll pick
* them up this call
* rather than having
* to dial in a
* second time.
*/
while (sentCount && !result) {
sentCount = 0;
eac->eac_LastKey = 0;
eac->eac_Entries = 0;
eac->eac_MatchString = Pattern;
eac->eac_MatchFunc = NULL;
ead1.med_Entries = 0;
ead2.med_Entries = 0;
ead = &ead2; /* next buffer to be
* filled */
eadata = &ead1; /* buffer to be
* processed */
do {
more = ExAll(spoolLock, ead->med_Data, sizeof(ead->med_Data) - 200, ED_TYPE, eac);
if (!more) {
if (IoErr() != ERROR_NO_MORE_ENTRIES) {
ErrorMsg("ExAll failed %ld.", IoErr());
ULog(ph, -1, "ExAll failed %ld.", IoErr());
result = 10;
break;
}
}
ead->med_Entries = eac->eac_Entries;
if (result = ProcessExAllBuffer(svc, spoolDir, eadata, &sentCount)) {
if (more) {
ExAllEnd(spoolLock, ead->med_Data, sizeof(ead->med_Data) - 200, ED_TYPE, eac);
more = 0;
}
}
else {
if (eadata == &ead1) {
eadata = &ead2;
ead = &ead1;
}
else {
eadata = &ead1;
ead = &ead2;
}
}
} while (more);
if (!result)
result = ProcessExAllBuffer(svc, spoolDir, eadata, &sentCount);
totalSentCount += sentCount;
}
FreeDosObject(DOS_EXALLCONTROL, eac);
}
else
ErrorMsg("out of memory!");
}
else {
ErrorMsg("ParsePatternNoCase() failed.");
ULog(ph, -1, "ParsePatternNoCase() failed.");
}
UnLock(spoolLock);
}
else {
ErrorMsg("couldn't lock spool directory.");
ULog(ph, -1, "couldn't lock spool directory.");
}
FreeNameInSpool(spoolDir);
}
else
ErrorMsg("out of memory!");
UnLockFile(ph, svc->svc_Name);
}
else {
ErrorMsg("service lock failed.");
ULog(ph, -1, "service lock failed.");
}
FreePagerService(svc);
}
else if (oneShot) {
ErrorMsg("couldn't find \"%s\" service.", serviceName);
ULog(ph, -1, "couldn't find \"%s\" service.", serviceName);
}
/*
* make sure that we always hang up after processing a service. if
* we can't reopen but are a oneShot call then we don't care about
* the error since it doesn't affect us and the cleanup code will
* know how to deal with it. if we're not oneShot, though, a failure
* to reopen the device means subsequence services would fail when
* trying to connect so we return an error in this case.
*/
if (online) {
SerWrite((STRPTR)EndOfTrans, sizeof(EndOfTrans));
if (!HangUp() && !oneShot) {
ErrorMsg("couldn't reopen modem %ld after hangup.", openedModem);
ULog(ph, -1, "couldn't reopen modem %ld after hangup.", openedModem);
result = 5;
}
ULog(ph, -1, "connection terminated");
}
if (totalSentCount)
ULog(ph, -1, "%ld message%s delivered this call", totalSentCount, totalSentCount == 1 ? "" : "s");
SetLogService(ph, NULL);
return result;
}
struct ExAllData eaBuf[100];
int DoAllServices(void)
{
STRPTR spoolDir;
BPTR spoolLock;
struct ExAllControl *eac;
struct ExAllData *exdata, fakeExdata;
int more;
PagerService_t *svc;
int result;
result = 10;
fakeExdata.ed_Next = NULL;
if (spoolDir = NameInSpool(ph, NULL)) {
if (spoolLock = Lock(spoolDir, ACCESS_READ)) {
if (eac = (struct ExAllControl *)AllocDosObject(DOS_EXALLCONTROL, TAG_DONE)) {
eac->eac_LastKey = 0;
eac->eac_Entries = 0;
eac->eac_MatchString = NULL;
eac->eac_MatchFunc = NULL;
result = 0;
do {
more = ExAll(spoolLock, eaBuf, sizeof(eaBuf) - 200, ED_TYPE, eac);
if (!more) {
if (IoErr() != ERROR_NO_MORE_ENTRIES) {
ErrorMsg("ExAll failed %ld.", IoErr());
ULog(ph, -1, "ExAll failed %ld.", IoErr());
result = 10;
break;
}
}
if (eac->eac_Entries) {
exdata = eaBuf;
while (exdata) {
if (exdata->ed_Type > 0)
if (svc = FindPagerService(ph, exdata->ed_Name)) {
if (result = DoOneService(svc->svc_Name, FALSE)) {
if (more) {
ExAllEnd(spoolLock, eaBuf, sizeof(eaBuf) - 200, ED_TYPE, eac);
more = 0;
}
exdata = &fakeExdata;
}
FreePagerService(svc);
}
exdata = exdata->ed_Next;
}
}
} while (more);
FreeDosObject(DOS_EXALLCONTROL, eac);
}
else
ErrorMsg("out of memory!");
UnLock(spoolLock);
}
else {
ErrorMsg("couldn't lock spool directory.");
ULog(ph, -1, "couldn't lock spool directory.");
}
FreeNameInSpool(spoolDir);
}
else
ErrorMsg("out of memory!");
return result;
}