home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 18
/
aminetcdnumber181997.iso
/
Aminet
/
comm
/
ums
/
SUMSTools.lha
/
UMS
/
Tools
/
SUMSTools
/
Source
/
sumsexport.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-08-03
|
4KB
|
210 lines
#include "sumstl.h"
#include <stdio.h>
#include <ctype.h>
#ifdef __SASC
#include <dos.h>
#endif
#include "umsfilter.h"
#include "date.h"
/* SMAKE */
/*** version string ***/
static char VersionString[] = "$VER: sumsexport "VERSION;
static char UsageString[] = "\
U=User : user name.\n\
P=Password : user's password.\n\
FI=Filter : filter specification.\n\
O=SetExportedFlag : if existing, exported flag is set.\n\
B=Backwards : if existing, messages are scanned backwards.\n\
S=Server : server name.\n\n\
";
/*** template ***/
static char *TemplateString = "U=User=Name/A,P=Password/A,FI=Filter/A,E=SetExportedFlag/S,B=Backwards/S,S=Server/K";
enum opts {
OPT_USER, OPT_PASSWORD, OPT_FILTER, OPT_SETEXPORTEDFLAG, OPT_BACKWARDS, OPT_SERVER,
OPT_COUNT};
static LONG opts[OPT_COUNT];
/*** global vars ***/
extern struct DosLibrary *DOSBase;
struct Library *UMSBase=NULL;
static char filteradd[] = " AND readaccess=1 AND viewaccess=1";
#define FILTERADDSTR filteradd
#define NULLFILTERSTR (&filteradd[5])
#define FILTERADDLEN 35
/*** break stuff ***/
int brk(void)
{
return(0);
}
#define ABORTED (SetSignal(0, 0) & SIGBREAKF_CTRL_C)
/*** main ***/
int main(int argc, char *argv[])
{
ULONG erg = RETURN_ERROR, umserr=0;
struct RDArgs *args_ptr;
onbreak(brk);
if(argc<2 || *argv[1] == '?')
{
fprintf(stderr, "\33[1m%s\33[0m, written by Klaus Melchior, Public Domain.\n\nTemplate: %s\n%s", &VersionString[6], TemplateString, UsageString);
}
{
int i;
for (i=0; i<OPT_COUNT; i++)
opts[i]=NULL;
}
if(args_ptr = ReadArgs(TemplateString, opts, NULL))
{
char *filter;
int direction = 1;
BOOL set_exported;
set_exported = opts[OPT_SETEXPORTEDFLAG];
if(opts[OPT_BACKWARDS])
direction = -1;
if(!(filter = malloc(strlen((char *)(opts[OPT_FILTER]))+FILTERADDLEN)))
{
fprintf(stderr, "\7Out of memory.\n");
FreeArgs(args_ptr);
return(20);
}
if(opts[OPT_FILTER] && *(char *)opts[OPT_FILTER])
{
strcpy(filter, (char *)opts[OPT_FILTER]);
strcat(filter, FILTERADDSTR);
}
else
{
strcpy(filter, NULLFILTERSTR);
}
if(UMSBase = OpenLibrary(UMSNAME, UMSVERSION))
{
UMSAccount acc;
if(acc = UMSRLogin((char *)opts[OPT_SERVER], (char *)opts[OPT_USER], (char *)opts[OPT_PASSWORD]))
{
int fi;
char *text_fields[UMSNUMFIELDS];
if(!(fi = UmsFilterExpression(filter, acc, 0, 0, 1)))
{
ULONG nr=0, date, count=0;
erg = RETURN_OK;
while((!umserr) && (nr = UMSSearchTags(acc,
UMSTAG_SearchLast , nr,
UMSTAG_SearchLocal , TRUE,
UMSTAG_SearchMask , 1,
UMSTAG_SearchMatch , 1,
UMSTAG_SearchDirection, direction,
TAG_DONE)) )
{
if(ABORTED)
{
fprintf(stderr, "\7*** User break.\n");
erg = RETURN_WARN;
break;
}
if(UMSReadMsgTags(acc,
UMSTAG_RMsgNum , nr,
UMSTAG_RMsgDate , &date,
UMSTAG_RTextFields, text_fields,
UMSTAG_RReadAll , TRUE,
UMSTAG_RNoUpdate , TRUE,
TAG_DONE))
{
int i;
/*** UMS specific format ***/
printf("?Date %8ld%c", date, 0);
for(i=1; i<UMSNUMFIELDS; i++)
if(text_fields[i])
printf("%c%s%c", i + 64, text_fields[i], 0);
if(text_fields[UMSCODE_MsgText])
printf("%c%s%c", UMSCODE_MsgText + 64, text_fields[UMSCODE_MsgText], 0);
printf("%c", 0);
count++;
UMSFreeMsg(acc, nr);
if(set_exported)
UMSExportedMsg(acc, nr);
umserr = UMSErrNum(acc);
}
}
if(umserr)
{
fprintf(stderr, "UMS-Error %d: %s\n", UMSErrNum(acc), UMSErrTxt(acc));
erg = RETURN_WARN;
/* kludge for bad behavior of UMSSearchTags() */
if(umserr==UMSERR_ServerTerminated)
erg = RETURN_ERROR;
}
else
{
fprintf(stderr, "Exported %ld message(s).\n", count);
if(!count)
erg = RETURN_WARN;
}
}
else
fprintf(stderr, "\7Expression Error %ld\n", fi);
UMSLogout(acc);
}
else
fprintf(stderr, "\7UMS-Login failed.\n");
CloseLibrary(UMSBase);
}
else
fprintf(stderr,"\7Could not open ums.library V10.\n");
FreeArgs(args_ptr);
}
else
{
PrintFault(IoErr(), NULL);
return(RETURN_ERROR);
}
return(erg);
}