home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
comm
/
Mail+News
/
UMS11
/
Tools
/
SUMSTools
/
Source
/
sumsset.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-08-03
|
7KB
|
262 lines
#include <utility/hooks.h>
#include "sumstl.h"
#include <stdio.h>
#ifdef __SASC
#include <dos.h>
#endif
#include "umsfilter.h"
/* SMAKE */
// Version String
// --------------
static char VersionString[] = "$VER: sumsset "VERSION;
static char UsageString[] = "\
U=User : user name.\n\
P=Password : user's password.\n\
FI=Filter : filter specification.\n\
SB=SetBits : bits to set (bit spec string).\n\
CB=ClrBits : bits to clear (bit spec string).\n\
S=Server : server name.\n\
FU=ForUser : modify flags for this user\n\
Q=Quiet : work quietly\n\
T=Tiny : use tiny output\n\n\
";
// Template
// --------
static char *TemplateString = "U=User=Name/A,P=Password/A,FI=Filter/A,SB=SetBits/A,CB=ClrBits,S=Server/K,FU=ForUser/K,Q=Quiet/S,T=Tiny/S";
enum opts {
OPT_USER, OPT_PASSWORD, OPT_FILTER, OPT_SETBITS, OPT_CLRBITS, OPT_SERVER,
OPT_FORUSER, OPT_QUIET, OPT_TINY, OPT_COUNT};
static LONG opts[OPT_COUNT];
// Globals
// -------
extern struct DosLibrary *DOSBase;
struct Library *UMSBase = NULL;
UMSAccount acc = NULL;
struct BitSpec
{
char *name;
LONG bit;
BOOL global;
} BitSpecs[] =
{
{ "Archive" , UMSUSTATF_Archive ,FALSE },
{ "Junk" , UMSUSTATF_Junk ,FALSE },
{ "PostPoned" , UMSUSTATF_PostPoned ,FALSE },
{ "Selected" , UMSUSTATF_Selected ,FALSE },
{ "Old" , UMSUSTATF_Old ,FALSE },
{ "WriteAccess", UMSUSTATF_WriteAccess,FALSE },
{ "ReadAccess" , UMSUSTATF_ReadAccess ,FALSE },
{ "ViewAccess" , UMSUSTATF_ViewAccess ,FALSE },
{ "Owner" , UMSUSTATF_Owner ,FALSE },
{ "UFlag0" , (1<<0 ) ,FALSE },
{ "UFlag1" , (1<<1 ) ,FALSE },
{ "UFlag2" , (1<<2 ) ,FALSE },
{ "UFlag3" , (1<<3 ) ,FALSE },
{ "UFlag4" , (1<<4 ) ,FALSE },
{ "UFlag5" , (1<<5 ) ,FALSE },
{ "UFlag6" , (1<<6 ) ,FALSE },
{ "UFlag7" , (1<<7 ) ,FALSE },
{ "UFlag8" , (1<<8 ) ,FALSE },
{ "UFlag9" , (1<<9 ) ,FALSE },
{ "UFlagA" , (1<<10) ,FALSE },
{ "UFlagB" , (1<<11) ,FALSE },
{ "UFlagC" , (1<<12) ,FALSE },
{ "UFlagD" , (1<<13) ,FALSE },
{ "UFlagE" , (1<<14) ,FALSE },
{ "UFlagF" , (1<<15) ,FALSE },
{ "Deleted" , UMSGSTATF_Deleted ,TRUE },
{ "Expired" , UMSGSTATF_Expired ,TRUE },
{ "Exported" , UMSGSTATF_Exported ,TRUE },
{ "Orphan" , UMSGSTATF_Orphan ,TRUE },
{ "Link" , UMSGSTATF_Link ,TRUE },
{ "HardLink" , UMSGSTATF_HardLink ,TRUE },
{ "Parked" , UMSGSTATF_Parked ,TRUE },
{ NULL,0,0 }
};
struct BitSpec *FindBit(char *name)
{
struct BitSpec *b=BitSpecs;
while (b->name)
{
if (!stricmp(b->name,name)) return(b);
b++;
}
return(NULL);
}
// CTRL-C Stuff
// ------------
int brk(void)
{
return(0);
}
#define ABORTED (SetSignal(0,0) & SIGBREAKF_CTRL_C)
// Main Function
// -------------
int main(int argc,char *argv[])
{
int erg = 20;
int anz = -1;
int fi;
LONGBITS GlobalSet=0,GlobalClear=0,UserSet=0,UserClear=0;
struct RDArgs *args_ptr;
onbreak(brk);
if (argc<2 || *argv[1] == '?')
{
struct BitSpec *b=BitSpecs;
int i=0;
fprintf(stderr,"\33[1m%s\33[0m, written by Stefan Stuntz, Public Domain.\n\nTemplate: %s\n%s",&VersionString[6],TemplateString,UsageString);
fprintf(stderr," bit-specs : ");
while (b->name)
{
fprintf(stderr,"%s%c ",b->name,(b+1)->name ? ',' : '.');
b++;
if (++i==6) { i=0; fprintf(stderr,"\n "); }
}
fprintf(stderr,"\n\n");
}
{
int i;
for (i=0; i<OPT_COUNT; i++)
opts[i]=NULL;
}
if (args_ptr = ReadArgs(TemplateString, opts, NULL))
{
if (opts[OPT_SETBITS] && *(char *)opts[OPT_SETBITS])
{
char *arg;
char *buf=strdup((char *)opts[OPT_SETBITS]);
struct BitSpec *b;
for (arg = strtok(buf, ","); arg; arg = strtok(NULL, ","))
{
if (!(b=FindBit(arg)))
{
fprintf(stderr,"\7Invalid bit spec: \"%s\"\n",arg);
FreeArgs(args_ptr);
return(20);
}
if (b->global) GlobalSet|=b->bit;
else UserSet |=b->bit;
}
}
if (opts[OPT_CLRBITS] && *(char *)opts[OPT_CLRBITS])
{
char *arg;
char *buf=strdup((char *)opts[OPT_CLRBITS]);
struct BitSpec *b;
for (arg = strtok(buf, ","); arg; arg = strtok(NULL, ","))
{
if (!(b=FindBit(arg)))
{
fprintf(stderr,"\7Invalid bit spec: \"%s\"\n",arg);
FreeArgs(args_ptr);
return(20);
}
if (b->global) GlobalClear|=b->bit;
else UserClear |=b->bit;
}
}
if ( GlobalSet&UMSGSTATF_Deleted )
if ( !(opts[OPT_QUIET] || opts[OPT_TINY] ) )
printf("You cannot delete a message by setting the Delete bit. Use sumsdel instead!\n");
if (UMSBase = OpenLibrary(UMSNAME,UMSVERSION))
{
if (acc = UMSRLogin((char *)opts[OPT_SERVER],(char *)opts[OPT_USER],(char *)opts[OPT_PASSWORD]))
{
if (!(fi = UmsFilterExpression((char *)opts[OPT_FILTER],acc,0,0,1)))
{
if (GlobalSet || GlobalClear)
{
anz=UMSSelectTags(acc,
UMSTAG_SelReadLocal ,TRUE,
UMSTAG_SelMask ,1,
UMSTAG_SelMatch ,1,
UMSTAG_SelWriteGlobal,TRUE,
UMSTAG_SelSet ,GlobalSet,
UMSTAG_SelUnset ,GlobalClear,
TAG_DONE);
}
if (UserSet || UserClear)
{
anz=UMSSelectTags(acc,
UMSTAG_SelReadLocal ,TRUE,
UMSTAG_SelMask ,1,
UMSTAG_SelMatch ,1,
opts[OPT_FORUSER]?
UMSTAG_SelWriteUser:
TAG_IGNORE ,opts[OPT_FORUSER],
UMSTAG_SelSet ,UserSet,
UMSTAG_SelUnset ,UserClear,
TAG_DONE);
}
if (anz==-1)
{
anz=UMSSelectTags(acc,
UMSTAG_SelReadLocal ,TRUE,
UMSTAG_SelMask ,1,
UMSTAG_SelMatch ,1,
TAG_DONE);
}
if (!opts[OPT_QUIET])
if (opts[OPT_TINY]) printf("%5ld Msgs.\n",anz);
else printf("%5ld Msgs (%s).\n",anz,(char *)opts[OPT_FILTER]);
erg = 0;
}
else printf("\7Expression Error %ld\n",fi);
UMSLogout(acc);
}
else printf("\7UMS-Login failed.\n");
CloseLibrary(UMSBase);
}
else printf("\7Could not open ums.library V10.\n");
FreeArgs(args_ptr);
}
else
{
PrintFault(IoErr(), NULL);
return(RETURN_ERROR);
}
return(erg);
}