af15e0698b
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
697 lines
19 KiB
C
Executable File
697 lines
19 KiB
C
Executable File
/* u4trans.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#include "u4trans.h"
|
|
|
|
#ifndef UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4UNIX
|
|
char *ltoa( long lVal, char *ptr, int num)
|
|
{
|
|
c4ltoa45( lVal, ptr, (num>0?num-1:num+1) ) ;
|
|
ptr[ (num>0? num:-num)-1] = '\0' ;
|
|
return( ptr ) ;
|
|
}
|
|
#endif
|
|
|
|
#ifdef S4UTILS
|
|
#ifdef S4WINDOWS
|
|
#ifdef S4DLL_BUILD
|
|
#define WM_UTIL_STATUS (WM_USER + 1)
|
|
#define WM_UTIL_CLOSE (WM_USER + 2)
|
|
FILE *stdout, *stderr ;
|
|
unsigned int messageType ; /* icon style for message box */
|
|
|
|
char *statusStringBlank = " ";
|
|
char *statusStringMessg = "Processing log file: ";
|
|
char *statusStringBckSp = "\r";
|
|
char *statusStringFormt = "%3d.%02d%%%%";
|
|
char *statusStringSpace = "100.00 ";
|
|
|
|
void S4FUNCTION sendStatusMessage( int hWnd, int percentComp )
|
|
{
|
|
SendMessage( hWnd, WM_UTIL_STATUS, percentComp, 0L ) ;
|
|
return ;
|
|
}
|
|
|
|
void S4FUNCTION sendCloseMessage( int hWnd )
|
|
{
|
|
SendMessage( hWnd, WM_UTIL_CLOSE, 0, 0L ) ;
|
|
return ;
|
|
}
|
|
|
|
/****************************************************************************
|
|
**:: Function: getLogDatabases
|
|
**
|
|
*****************************************************************************
|
|
**
|
|
** Function: getLogDatabases()
|
|
**
|
|
****************************************************************************/
|
|
#ifdef S4WINDOWS
|
|
int S4FUNCTION getLogDatabases( char *logFileName, int hWndListBox )
|
|
{
|
|
/* database required for a file selection listbox */
|
|
static FIELD4INFO openFileName[] =
|
|
{
|
|
{ "DBFNAME", 'C', 12, 0 },
|
|
{ "DBFPATH", 'C', 100, 0 },
|
|
{ "PATHLEN", 'N', 3, 0 },
|
|
{ 0, 0, 0 , 0 },
|
|
} ;
|
|
|
|
static TAG4INFO fileNameTags[] =
|
|
{
|
|
{ "NAMETAG", "DBFNAME+DBFPATH", "", 0, 0 },
|
|
{ 0, 0, 0 , 0, 0 },
|
|
};
|
|
|
|
HCURSOR hCursor ;
|
|
DWORD dwIndex ;
|
|
CODE4 c4 ;
|
|
TRAN4 *t4 = 0 ;
|
|
DATA4 *openFile ;
|
|
FIELD4 *fldDbfName = 0, *fldDbfPath = 0, *fldPathLen = 0 ;
|
|
char *outMess[4], *data = 0, *cNone = "(none)" ;
|
|
char buf[13], tmpBuf[256], pathBuf[256], *pathPtr, *tmpPtr ;
|
|
long logFileLen;
|
|
int rc = 0, tmpRc, tmpRc2, i = 0 ;
|
|
unsigned int pathLen ;
|
|
|
|
hCursor = SetCursor( LoadCursor( (HINSTANCE)NULL, IDC_WAIT ) ) ;
|
|
|
|
code4init(&c4);
|
|
c4.lockAttempts = WAIT4EVER;
|
|
|
|
if( logFileName != 0 )
|
|
{
|
|
if( logFileName[0] != 0 )
|
|
{
|
|
rc = code4logOpen( &c4, logFileName, "" ) ;
|
|
code4tranStatusSet( &c4, r4off ) ;
|
|
}
|
|
else
|
|
rc = -1 ;
|
|
}
|
|
else
|
|
rc = -1 ;
|
|
|
|
if( rc != 0 )
|
|
{
|
|
outMess[0] = "Log File Error.\r\n" ;
|
|
outMess[1] = "Ensure Log File <" ;
|
|
outMess[2] = logFileName ;
|
|
outMess[3] = "> is a backed up Log File.\r\n" ;
|
|
util4out( &c4, stdout, outMess, 4 ) ;
|
|
}
|
|
|
|
if( rc == 0 )
|
|
rc = file4refresh( &c4.transFile.file ) ;
|
|
if( rc == 0 )
|
|
logFileLen = file4len( &c4.transFile.file ) ;
|
|
|
|
if( (rc == 0) && ( logFileLen > 0 ) )
|
|
{
|
|
t4 = &c4.c4trans.trans ;
|
|
openFile = d4createTemp( &c4, openFileName, fileNameTags ) ;
|
|
if( openFile == 0 )
|
|
rc = -1 ;
|
|
}
|
|
|
|
if( rc == 0 )
|
|
{
|
|
fldDbfName = d4field( openFile, "DBFNAME" ) ;
|
|
fldDbfPath = d4field( openFile, "DBFPATH" ) ;
|
|
fldPathLen = d4field( openFile, "PATHLEN" ) ;
|
|
d4tagSelect( openFile, d4tag( openFile, "NAMETAG" ) ) ;
|
|
|
|
for( rc = tran4top( t4 ) ; ; rc = tran4skip( t4, TRAN4FORWARDS ) )
|
|
{
|
|
if( rc != 0 )
|
|
break ;
|
|
|
|
switch( tran4type(t4) )
|
|
{
|
|
case TRAN4OPEN :
|
|
data = tran4getData( t4, 0L ) ;
|
|
if( data == 0 )
|
|
{
|
|
rc = -1 ;
|
|
break ;
|
|
}
|
|
rc = d4appendStart( openFile, 0 ) ;
|
|
if( rc != 0 )
|
|
break ;
|
|
memset( buf, 0, sizeof( buf ) ) ;
|
|
memset( tmpBuf, 0, sizeof( tmpBuf ) ) ;
|
|
memset( pathBuf, 0, sizeof( pathBuf ) ) ;
|
|
memcpy( tmpBuf, data+2, *(short *)data ) ;
|
|
u4namePiece( buf, sizeof( buf ), tmpBuf, 0, 1 ) ;
|
|
u4namePiece( pathBuf, sizeof(pathBuf), tmpBuf, 1, 1 ) ;
|
|
pathBuf[(strlen(pathBuf)-strlen(buf))] = 0 ;
|
|
f4assign( fldDbfName, buf ) ;
|
|
f4assign( fldDbfPath, pathBuf ) ;
|
|
f4assignInt( fldPathLen, (int)strlen(pathBuf) ) ;
|
|
rc = d4append( openFile ) ;
|
|
break ;
|
|
}
|
|
}
|
|
if( rc == r4eof )
|
|
rc = 0 ;
|
|
}
|
|
|
|
if( rc == 0 )
|
|
{
|
|
for( rc = d4top( openFile ); rc == 0 ; rc = d4skip( openFile, 1L ) )
|
|
{
|
|
dwIndex = SendMessage( hWndListBox, LB_ADDSTRING, 0, (LPARAM) f4str( fldDbfName ) ) ;
|
|
tmpPtr = f4str( fldDbfPath ) ;
|
|
pathLen = (unsigned int)f4int( fldPathLen ) ;
|
|
pathPtr = (char *)u4allocDefault( (long)(pathLen+1) ) ;
|
|
u4ncpy( pathPtr, tmpPtr, pathLen+1 ) ;
|
|
SendMessage( hWndListBox, LB_SETITEMDATA, (WPARAM)dwIndex, (LPARAM) pathPtr ) ;
|
|
}
|
|
if( d4recCount( openFile ) == 0 )
|
|
SendMessage( hWndListBox, LB_ADDSTRING, 0, (LPARAM) cNone ) ;
|
|
}
|
|
|
|
SetCursor( hCursor ) ;
|
|
tmpRc = rc ;
|
|
tmpRc2 = c4.errorCode ;
|
|
rc = code4close( &c4 ) ;
|
|
code4transInitUndo( &c4.c4trans ) ;
|
|
code4initUndo(&c4);
|
|
|
|
if( rc < 0 || tmpRc < 0 || tmpRc2 != 0 )
|
|
return -1 ;
|
|
else
|
|
return rc ;
|
|
|
|
}
|
|
#endif /* S4WINDOWS */
|
|
|
|
#ifdef S4VBASIC
|
|
|
|
long S4FUNCTION ReturnCPtr( LPSTR string )
|
|
{
|
|
return (long)string ;
|
|
}
|
|
|
|
#endif /* S4VBASIC */
|
|
#endif /* S4DLL_BUILD */
|
|
#endif /* S4WINDOWS */
|
|
|
|
void util4out(CODE4 *c4, FILE *stream, char *str[], int numStr)
|
|
{
|
|
int i;
|
|
|
|
#ifndef S4WINDOWS
|
|
for (i=0; i<numStr; i++)
|
|
if (str[i] != 0)
|
|
fprintf(stream, str[i]);
|
|
#else
|
|
#ifdef S4VBASIC
|
|
int messageExists = 0, messageLen = 0, totalLen = 0 ;
|
|
char *bufptr, buf[512] ;
|
|
bufptr = buf ;
|
|
|
|
for( i=0; i < numStr; i++ )
|
|
{
|
|
messageLen = strlen( str[i] ) ;
|
|
if( messageLen > 0 )
|
|
{
|
|
messageExists = 1 ;
|
|
if( (totalLen+messageLen) < sizeof(buf)-1 )
|
|
{
|
|
lstrcpy( (bufptr+totalLen), str[i] ) ;
|
|
totalLen += messageLen ;
|
|
}
|
|
messageLen = 0 ;
|
|
}
|
|
}
|
|
|
|
if( messageExists )
|
|
MessageBox( (HWND)NULL, buf, "CodeUtility Message", messageType ) ;
|
|
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void util4printCommandLine(CODE4 *c4, UTIL4FLAG u4[], int numFlags, char *programName)
|
|
{
|
|
int i;
|
|
char **commandLine, programExe[41], *spaces;
|
|
|
|
if (programName == 0)
|
|
return;
|
|
u4namePiece(programExe, 41, programName, 0, 1);
|
|
#ifndef S4UNIX
|
|
c4lower(programExe);
|
|
#endif
|
|
spaces =(char *) u4allocFree(c4, strlen(programExe)+2);
|
|
if (spaces == 0)
|
|
return;
|
|
spaces[strlen(programExe)+1] = 0;
|
|
memset(spaces, ' ', strlen(programExe)+1);
|
|
commandLine = (char **)u4allocFree(c4, (2*numFlags+2)*4);
|
|
if (commandLine == 0)
|
|
{
|
|
u4free(spaces);
|
|
return;
|
|
}
|
|
|
|
commandLine[0] = programExe;
|
|
commandLine[1] = " [@<parameter file>]\r\n";
|
|
for (i=0; i<numFlags; i++)
|
|
{
|
|
commandLine[2*i+2] = spaces;
|
|
commandLine[2*i+3] = u4[i].descrip;
|
|
}
|
|
/* util4out(c4, stdout, commandLine, 2*i+2);*/
|
|
|
|
u4free(commandLine);
|
|
u4free(spaces);
|
|
}
|
|
|
|
static int util4processFlags(CODE4 *c4, UTIL4FLAG u4[], int numFlags, char* argv[], int argc)
|
|
{
|
|
int i, j, found, count, flag, index;
|
|
char *outMess[3];
|
|
|
|
outMess[2] = "\r\n\r\n";
|
|
for (j=1; j<argc; j++)
|
|
{
|
|
if (*argv[j] != '-' && *argv[j] != '/') /* not a switch */
|
|
{
|
|
outMess[0] = "Command line error! Expecting flag but found value: ";
|
|
outMess[1] = argv[j];
|
|
util4out(c4, stdout, outMess, 3);
|
|
return(-1);
|
|
}
|
|
found = 0;
|
|
for (i=0; i<numFlags && !found; i++)
|
|
{
|
|
if (u4[i].len > strlen(argv[j]+1))
|
|
continue;
|
|
if (u4[i].caseSens)
|
|
{
|
|
if (strncmp(u4[i].name, argv[j]+1, strlen(argv[j]+1)) != 0) /* not this switch */
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if (strnicmp(u4[i].name, argv[j]+1, strlen(argv[j]+1)) != 0) /* not this switch */
|
|
continue;
|
|
}
|
|
found = 1;
|
|
if (u4[i].found != 0)
|
|
{
|
|
if (u4[i].multiples == 0) /* discard multiples */
|
|
break;
|
|
if (u4[i].multiples == -1)
|
|
{
|
|
outMess[0] = "Command line error! Flag found more than once: ";
|
|
outMess[1] = argv[j];
|
|
util4out(c4, stdout, outMess, 3);
|
|
return(-1);
|
|
}
|
|
if (u4[i].multiples == 1 && u4[i].values != 0)
|
|
{
|
|
for (; u4[i].numPtr>0; u4[i].numPtr-=4)
|
|
u4free(u4[i].ptr[u4[i].numPtr/4-1]);
|
|
u4free(u4[i].ptr);
|
|
}
|
|
}
|
|
if (u4[i].values == 0)
|
|
{
|
|
if (u4[i].ptr == 0)
|
|
{
|
|
u4[i].ptr = (char **)u4allocFree(c4, 4);
|
|
if (u4[i].ptr == 0)
|
|
return(-1);
|
|
u4[i].ptr[0] = (char *)u4allocFree(c4, 1);
|
|
if (u4[i].ptr[0] == 0)
|
|
return(-1);
|
|
u4[i].numPtr = 4;
|
|
}
|
|
*u4[i].ptr[0] = 1;
|
|
u4[i].found = 1;
|
|
continue;
|
|
}
|
|
count = u4[i].values > 0 ? u4[i].values : -u4[i].values;
|
|
flag = j;
|
|
while (count > 0 && j+1 < argc && *argv[j+1] != '-' && *argv[j+1] != '/')
|
|
{
|
|
j++;
|
|
if (u4[i].ptr == 0)
|
|
{
|
|
u4[i].ptr = (char **)u4allocFree(c4, 4);
|
|
if (u4[i].ptr == 0)
|
|
return(-1);
|
|
if (u4[i].multiples == 2 && !u4[i].exact)
|
|
{
|
|
u4[i].ptr[0] = (char *)u4allocFree(c4, strlen(argv[j])+2);
|
|
if (u4[i].ptr[0] == 0)
|
|
return(-1);
|
|
*u4[i].ptr[0] = index = 1;
|
|
strcpy(u4[i].ptr[0]+1, argv[j]);
|
|
}
|
|
else
|
|
{
|
|
u4[i].ptr[0] = (char *)u4allocFree(c4, strlen(argv[j])+1);
|
|
if (u4[i].ptr[0] == 0)
|
|
return(-1);
|
|
strcpy(u4[i].ptr[0], argv[j]);
|
|
}
|
|
u4[i].numPtr = 4;
|
|
}
|
|
else
|
|
if (u4[i].multiples == 1 && count == u4[i].values) /* replace */
|
|
{
|
|
for (; u4[i].numPtr>0; u4[i].numPtr-=4)
|
|
u4free(u4[i].ptr[u4[i].numPtr/4-1]);
|
|
u4[i].ptr[0] = (char *)u4allocFree(c4, strlen(argv[j])+1);
|
|
if (u4[i].ptr[0] == 0)
|
|
return(-1);
|
|
u4[i].numPtr = 4;
|
|
strcpy(u4[i].ptr[0], argv[j]);
|
|
}
|
|
else /* add */
|
|
{
|
|
if (count == u4[i].values)
|
|
index = *u4[i].ptr[u4[i].numPtr/4-1] + 1;
|
|
if (u4allocAgain(c4, (char **)&u4[i].ptr, &u4[i].numPtr, u4[i].numPtr+4) == e4memory)
|
|
return(-1);
|
|
u4[i].numPtr -= 4;
|
|
if (u4[i].multiples == 2 && !u4[i].exact)
|
|
{
|
|
u4[i].ptr[u4[i].numPtr/4] = (char *)u4allocFree(c4, strlen(argv[j])+2);
|
|
if (u4[i].ptr[u4[i].numPtr/4] == 0)
|
|
return(-1);
|
|
*u4[i].ptr[u4[i].numPtr/4] = index;
|
|
strcpy(u4[i].ptr[u4[i].numPtr/4]+1, argv[j]);
|
|
}
|
|
else
|
|
{
|
|
u4[i].ptr[u4[i].numPtr/4] = (char *)u4allocFree(c4, strlen(argv[j])+1);
|
|
if (u4[i].ptr[u4[i].numPtr/4] == 0)
|
|
return(-1);
|
|
strcpy(u4[i].ptr[u4[i].numPtr/4], argv[j]);
|
|
}
|
|
u4[i].numPtr += 4;
|
|
}
|
|
count--;
|
|
}
|
|
if ((u4[i].exact && count > 0) || (count == u4[i].values))
|
|
{
|
|
outMess[0] = "Command line error! Not enough values for flag: ";
|
|
outMess[1] = argv[flag];
|
|
util4out(c4, stdout, outMess, 3);
|
|
return(-1);
|
|
}
|
|
u4[i].found = 1;
|
|
}
|
|
if (!found)
|
|
{
|
|
outMess[0] = "Command line error! Unknown flag: ";
|
|
outMess[1] = argv[j];
|
|
util4out(c4, stdout, outMess, 3);
|
|
return(-1);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
void util4flagsFree(UTIL4FLAG u4[], int numFlags)
|
|
{
|
|
int i ;
|
|
|
|
for (i=0; i<numFlags; i++)
|
|
{
|
|
for (; u4[i].numPtr>0; u4[i].numPtr-=4)
|
|
u4free(u4[i].ptr[u4[i].numPtr/4-1]);
|
|
u4free(u4[i].ptr);
|
|
}
|
|
}
|
|
|
|
int util4parseCommandLine(CODE4 *c4, UTIL4FLAG u4[], int numFlags, char* argv[], int argc)
|
|
{
|
|
int rc, quotes, inArg, j;
|
|
unsigned int i, lenRead, buffSize ;
|
|
long len, offset=0;
|
|
char *buff;
|
|
char **argvParse;
|
|
int argcParse;
|
|
FILE4 f4;
|
|
|
|
if ((*argv[1] == '-' || *argv[1] == '/') && *(argv[1]+1) == '?')
|
|
return(-1);
|
|
if (*argv[1] == '@')
|
|
{
|
|
rc = file4open(&f4, c4, argv[1]+1, 0);
|
|
if (rc != 0)
|
|
return(rc);
|
|
len = file4len(&f4);
|
|
if (len < 0)
|
|
{
|
|
file4close(&f4);
|
|
return((int) len);
|
|
}
|
|
if (len >= 65001)
|
|
{
|
|
buff = (char *)u4allocFree(c4, 65001);
|
|
buffSize = 65000;
|
|
}
|
|
else
|
|
{
|
|
buff = (char *)u4allocFree(c4, len+1);
|
|
buffSize = (unsigned int)len;
|
|
}
|
|
if (buff == 0)
|
|
{
|
|
file4close(&f4);
|
|
return(-1);
|
|
}
|
|
while (len-offset > 0)
|
|
{
|
|
lenRead = file4read(&f4, offset, buff, buffSize);
|
|
if (lenRead == 0)
|
|
{
|
|
rc = -1;
|
|
break;
|
|
}
|
|
quotes = 0;
|
|
inArg = 0;
|
|
argcParse = 0;
|
|
for (i=0; i<lenRead; i++)
|
|
{
|
|
if (!quotes && buff[i] == '\"')
|
|
quotes = 1;
|
|
if (quotes && buff[i] == '\"' && i > 0 && buff[i-1] != '\\')
|
|
quotes = 0;
|
|
if (buff[i] < 32 || buff[i] == 127)
|
|
{
|
|
buff[i] = 0;
|
|
inArg = 0;
|
|
}
|
|
if (!quotes && buff[i] == ' ')
|
|
{
|
|
buff[i] = 0;
|
|
inArg = 0;
|
|
}
|
|
if (!inArg && buff[i] > 32)
|
|
{
|
|
inArg = 1;
|
|
argcParse++;
|
|
}
|
|
}
|
|
if (inArg)
|
|
argcParse--;
|
|
if (argcParse < 1)
|
|
break;
|
|
argvParse = (char **)u4allocFree(c4, 4*(argcParse+1));
|
|
if (argvParse == 0)
|
|
{
|
|
rc = -1;
|
|
break;
|
|
}
|
|
i = 0;
|
|
for (j=0; j<argcParse; j++)
|
|
{
|
|
while (buff[i] == 0)
|
|
i++;
|
|
argvParse[j+1] = buff+i;
|
|
i += strlen(buff+i);
|
|
}
|
|
offset += i;
|
|
rc = util4processFlags(c4, u4, numFlags, argvParse, argcParse+1);
|
|
u4free(argvParse);
|
|
if (rc != 0)
|
|
break;
|
|
}
|
|
u4free(buff);
|
|
if (rc != 0)
|
|
file4close(&f4);
|
|
else
|
|
rc = file4close(&f4);
|
|
if (rc == 0)
|
|
rc = util4processFlags(c4, u4, numFlags, argv+1, argc-1);
|
|
}
|
|
else
|
|
rc = util4processFlags(c4, u4, numFlags, argv, argc);
|
|
if (rc != 0)
|
|
util4flagsFree(u4, numFlags);
|
|
return(rc);
|
|
}
|
|
|
|
char *util4rightJ(char *str, int len)
|
|
{
|
|
short i=-1;
|
|
|
|
len--;
|
|
while ((++i <= len) && (str[i] != 0));
|
|
if (i > len)
|
|
return str;
|
|
while (i > -1)
|
|
str[len--] = str[i--];
|
|
while (len > -1)
|
|
str[len--] = ' ';
|
|
return str;
|
|
}
|
|
|
|
int util4checkOnOffCommandLine(CODE4 *c4, UTIL4FLAG u4[], int flag, int def)
|
|
{
|
|
char *outMess[5];
|
|
|
|
if (u4[flag].ptr == 0)
|
|
return(def);
|
|
c4upper( u4[flag].ptr[0] ) ;
|
|
if (strcmp(u4[flag].ptr[0], "OFF") == 0)
|
|
return(0);
|
|
if (strcmp(u4[flag].ptr[0], "ON") == 0)
|
|
return(1);
|
|
outMess[0] = "Command line error! -";
|
|
outMess[1] = u4[flag].name;
|
|
outMess[2] = " value ";
|
|
outMess[3] = u4[flag].ptr[0];
|
|
outMess[4] = " is not ON or OFF.\r\n";
|
|
util4out(c4, stdout, outMess, 5);
|
|
return(-1);
|
|
}
|
|
|
|
long util4checkRangeCommandLine(CODE4 *c4, UTIL4FLAG u4[], int flag, long def, long lRange, long hRange)
|
|
{
|
|
char *outMess[9];
|
|
char tempLow[12], tempHigh[12];
|
|
long temp;
|
|
|
|
if (u4[flag].ptr == 0)
|
|
return(def);
|
|
temp = atol(u4[flag].ptr[0]);
|
|
if (hRange - lRange < 0)
|
|
return(temp);
|
|
if (temp > hRange || temp < lRange)
|
|
{
|
|
outMess[0] = "Command line error! -";
|
|
outMess[1] = u4[flag].name;
|
|
outMess[2] = " value ";
|
|
outMess[3] = u4[flag].ptr[0];
|
|
outMess[4] = " is out of range ";
|
|
outMess[5] = ltoa(lRange, tempLow, 10);
|
|
outMess[6] = " to ";
|
|
outMess[7] = ltoa(hRange, tempHigh, 10);
|
|
outMess[8] = ".\r\n";
|
|
util4out(c4, stdout, outMess, 9);
|
|
return(lRange-1);
|
|
}
|
|
return(temp);
|
|
}
|
|
|
|
#ifndef S4OFF_TRAN
|
|
#ifndef S4OFF_COMMUNICATIONS
|
|
|
|
int tran4serverEof( TRAN4 *trans, unsigned long *tranFileEof )
|
|
{
|
|
CONNECTION4 *connection ;
|
|
int rc ;
|
|
CONNECTION4TRAN_EOF_INFO_OUT *out ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( trans == 0 || tranFileEof == 0 )
|
|
return e4parm_null ;
|
|
#endif
|
|
|
|
if ( trans->c4trans->c4->defaultServer == 0 )
|
|
return r4noServer ;
|
|
|
|
connection = trans->c4trans->c4->defaultServer->connect ;
|
|
#ifdef E4ANALYZE
|
|
if ( connection == 0 )
|
|
return e4struct ;
|
|
#endif
|
|
|
|
connection4assign( connection, CON4TRAN_EOF, 0l, 0l ) ;
|
|
connection4send( connection ) ;
|
|
rc = connection4receive( connection ) ;
|
|
if ( rc < 0 )
|
|
return rc ;
|
|
|
|
rc = connection4status( connection ) ;
|
|
if ( rc < 0 )
|
|
return rc ;
|
|
|
|
if ( connection4len( connection ) != sizeof( CONNECTION4TRAN_EOF_INFO_OUT ) )
|
|
return e4packetLen ;
|
|
out = (CONNECTION4TRAN_EOF_INFO_OUT *)connection4data( connection ) ;
|
|
|
|
*tranFileEof = out->eof ;
|
|
return 0 ;
|
|
}
|
|
|
|
int tran4serverEofHalt( TRAN4 *trans, unsigned long *tranFileEof )
|
|
{
|
|
CONNECTION4 *connection ;
|
|
int rc ;
|
|
CONNECTION4TRAN_EOF_HALT_INFO_OUT *out ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( trans == 0 || tranFileEof == 0 )
|
|
return e4parm_null ;
|
|
#endif
|
|
|
|
if ( trans->c4trans->c4->defaultServer == 0 )
|
|
return r4noServer ;
|
|
|
|
connection = trans->c4trans->c4->defaultServer->connect ;
|
|
#ifdef E4ANALYZE
|
|
if ( connection == 0 )
|
|
return e4struct ;
|
|
#endif
|
|
|
|
connection4assign( connection, CON4TRAN_EOF_HALT, 0l, 0l ) ;
|
|
connection4send( connection ) ;
|
|
rc = connection4receive( connection ) ;
|
|
if ( rc < 0 )
|
|
return rc ;
|
|
|
|
rc = connection4status( connection ) ;
|
|
if ( rc < 0 )
|
|
return rc ;
|
|
|
|
if ( connection4len( connection ) != sizeof( CONNECTION4TRAN_EOF_HALT_INFO_OUT ) )
|
|
return e4packetLen ;
|
|
out = (CONNECTION4TRAN_EOF_HALT_INFO_OUT *)connection4data( connection ) ;
|
|
|
|
*tranFileEof = out->eof ;
|
|
return 0 ;
|
|
}
|
|
|
|
#endif /* S4OFF_COMMUNICATIONS */
|
|
#endif /* S4OFF_TRAN */
|
|
#endif /* S4UTILS */
|
|
|