home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / comm / ums / SUMSTools.lha / UMS / Tools / SUMSTools / Source / sumsset.c < prev    next >
C/C++ Source or Header  |  1995-08-03  |  7KB  |  262 lines

  1.  
  2. #include <utility/hooks.h>
  3.  
  4. #include "sumstl.h"
  5.  
  6. #include <stdio.h>
  7.  
  8. #ifdef __SASC
  9. #include <dos.h>
  10. #endif
  11.  
  12. #include "umsfilter.h"
  13.  
  14. /* SMAKE */
  15.  
  16.  
  17. // Version String
  18. // --------------
  19.  
  20. static char VersionString[] = "$VER: sumsset "VERSION;
  21.  
  22. static char UsageString[] = "\
  23.    U=User     : user name.\n\
  24.    P=Password : user's password.\n\
  25.   FI=Filter   : filter specification.\n\
  26.   SB=SetBits  : bits to set (bit spec string).\n\
  27.   CB=ClrBits  : bits to clear (bit spec string).\n\
  28.    S=Server   : server name.\n\
  29.   FU=ForUser  : modify flags for this user\n\
  30.    Q=Quiet    : work quietly\n\
  31.    T=Tiny     : use tiny output\n\n\
  32. ";
  33.  
  34.  
  35. // Template
  36. // --------
  37.  
  38. 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";
  39. enum opts {
  40.     OPT_USER, OPT_PASSWORD, OPT_FILTER, OPT_SETBITS, OPT_CLRBITS, OPT_SERVER,
  41.     OPT_FORUSER, OPT_QUIET, OPT_TINY, OPT_COUNT};
  42. static LONG opts[OPT_COUNT];
  43.  
  44.  
  45. // Globals
  46. // -------
  47.  
  48. extern struct DosLibrary *DOSBase;
  49.  
  50. struct Library *UMSBase = NULL;
  51. UMSAccount acc = NULL;
  52.  
  53. struct BitSpec
  54. {
  55.     char *name;
  56.     LONG bit;
  57.     BOOL global;
  58. } BitSpecs[] =
  59. {
  60.     { "Archive"    , UMSUSTATF_Archive    ,FALSE },
  61.     { "Junk"       , UMSUSTATF_Junk       ,FALSE },
  62.     { "PostPoned"  , UMSUSTATF_PostPoned  ,FALSE },
  63.     { "Selected"   , UMSUSTATF_Selected   ,FALSE },
  64.     { "Old"        , UMSUSTATF_Old        ,FALSE },
  65.     { "WriteAccess", UMSUSTATF_WriteAccess,FALSE },
  66.     { "ReadAccess" , UMSUSTATF_ReadAccess ,FALSE },
  67.     { "ViewAccess" , UMSUSTATF_ViewAccess ,FALSE },
  68.      { "Owner"      , UMSUSTATF_Owner      ,FALSE },
  69.     { "UFlag0"     , (1<<0 )              ,FALSE },
  70.     { "UFlag1"     , (1<<1 )              ,FALSE },
  71.     { "UFlag2"     , (1<<2 )              ,FALSE },
  72.     { "UFlag3"     , (1<<3 )              ,FALSE },
  73.     { "UFlag4"     , (1<<4 )              ,FALSE },
  74.     { "UFlag5"     , (1<<5 )              ,FALSE },
  75.     { "UFlag6"     , (1<<6 )              ,FALSE },
  76.     { "UFlag7"     , (1<<7 )              ,FALSE },
  77.     { "UFlag8"     , (1<<8 )              ,FALSE },
  78.     { "UFlag9"     , (1<<9 )              ,FALSE },
  79.     { "UFlagA"     , (1<<10)              ,FALSE },
  80.     { "UFlagB"     , (1<<11)              ,FALSE },
  81.     { "UFlagC"     , (1<<12)              ,FALSE },
  82.     { "UFlagD"     , (1<<13)              ,FALSE },
  83.     { "UFlagE"     , (1<<14)              ,FALSE },
  84.     { "UFlagF"     , (1<<15)              ,FALSE },
  85.     { "Deleted"    , UMSGSTATF_Deleted    ,TRUE  },
  86.     { "Expired"    , UMSGSTATF_Expired    ,TRUE  },
  87.     { "Exported"   , UMSGSTATF_Exported   ,TRUE  },
  88.     { "Orphan"     , UMSGSTATF_Orphan     ,TRUE  },
  89.     { "Link"       , UMSGSTATF_Link       ,TRUE  },
  90.     { "HardLink"   , UMSGSTATF_HardLink   ,TRUE  },
  91.     { "Parked"     , UMSGSTATF_Parked     ,TRUE  },
  92.     { NULL,0,0 }
  93. };
  94.  
  95.  
  96. struct BitSpec *FindBit(char *name)
  97. {
  98.     struct BitSpec *b=BitSpecs;
  99.     while (b->name)
  100.     {
  101.         if (!stricmp(b->name,name)) return(b);
  102.         b++;
  103.     }
  104.     return(NULL);
  105. }
  106.  
  107.  
  108. // CTRL-C Stuff
  109. // ------------
  110.  
  111. int brk(void)
  112. {
  113.     return(0);
  114. }
  115.  
  116. #define ABORTED (SetSignal(0,0) & SIGBREAKF_CTRL_C)
  117.  
  118.  
  119. // Main Function
  120. // -------------
  121.  
  122. int main(int argc,char *argv[])
  123. {
  124.     int erg = 20;
  125.     int anz = -1;
  126.     int fi;
  127.     LONGBITS GlobalSet=0,GlobalClear=0,UserSet=0,UserClear=0;
  128.     struct RDArgs *args_ptr;
  129.  
  130.     onbreak(brk);
  131.  
  132.     if (argc<2 || *argv[1] == '?')
  133.     {
  134.         struct BitSpec *b=BitSpecs;
  135.         int i=0;
  136.         fprintf(stderr,"\33[1m%s\33[0m, written by Stefan Stuntz, Public Domain.\n\nTemplate: %s\n%s",&VersionString[6],TemplateString,UsageString);
  137.         fprintf(stderr,"    bit-specs : ");
  138.         while (b->name)
  139.         {
  140.             fprintf(stderr,"%s%c ",b->name,(b+1)->name ? ',' : '.');
  141.             b++;
  142.             if (++i==6) { i=0; fprintf(stderr,"\n                "); }
  143.         }
  144.         fprintf(stderr,"\n\n");
  145.     }
  146.  
  147.     {
  148.         int i;
  149.  
  150.         for (i=0; i<OPT_COUNT; i++)
  151.         opts[i]=NULL;
  152.     }
  153.  
  154.     if (args_ptr = ReadArgs(TemplateString, opts, NULL))
  155.     {
  156.         if (opts[OPT_SETBITS] && *(char *)opts[OPT_SETBITS])
  157.         {
  158.             char *arg;
  159.             char *buf=strdup((char *)opts[OPT_SETBITS]);
  160.             struct BitSpec *b;
  161.             for (arg = strtok(buf, ","); arg; arg = strtok(NULL, ","))
  162.             {
  163.                 if (!(b=FindBit(arg)))
  164.                 {
  165.                     fprintf(stderr,"\7Invalid bit spec: \"%s\"\n",arg);
  166.                     FreeArgs(args_ptr);
  167.                     return(20);
  168.                 }
  169.                 if (b->global) GlobalSet|=b->bit;
  170.                 else           UserSet  |=b->bit;
  171.             }
  172.         }
  173.  
  174.         if (opts[OPT_CLRBITS] && *(char *)opts[OPT_CLRBITS])
  175.         {
  176.             char *arg;
  177.             char *buf=strdup((char *)opts[OPT_CLRBITS]);
  178.             struct BitSpec *b;
  179.             for (arg = strtok(buf, ","); arg; arg = strtok(NULL, ","))
  180.             {
  181.                 if (!(b=FindBit(arg)))
  182.                 {
  183.                     fprintf(stderr,"\7Invalid bit spec: \"%s\"\n",arg);
  184.                     FreeArgs(args_ptr);
  185.                     return(20);
  186.                 }
  187.                 if (b->global) GlobalClear|=b->bit;
  188.                 else           UserClear  |=b->bit;
  189.             }
  190.         }
  191.  
  192.         if ( GlobalSet&UMSGSTATF_Deleted )
  193.             if ( !(opts[OPT_QUIET] || opts[OPT_TINY] ) )
  194.                 printf("You cannot delete a message by setting the Delete bit. Use sumsdel instead!\n");
  195.  
  196.         if (UMSBase = OpenLibrary(UMSNAME,UMSVERSION))
  197.         {
  198.             if (acc = UMSRLogin((char *)opts[OPT_SERVER],(char *)opts[OPT_USER],(char *)opts[OPT_PASSWORD]))
  199.             {
  200.                 if (!(fi = UmsFilterExpression((char *)opts[OPT_FILTER],acc,0,0,1)))
  201.                 {
  202.                     if (GlobalSet || GlobalClear)
  203.                     {
  204.                         anz=UMSSelectTags(acc,
  205.                        UMSTAG_SelReadLocal  ,TRUE,
  206.                        UMSTAG_SelMask       ,1,
  207.                        UMSTAG_SelMatch      ,1,
  208.                        UMSTAG_SelWriteGlobal,TRUE,
  209.                        UMSTAG_SelSet        ,GlobalSet,
  210.                        UMSTAG_SelUnset      ,GlobalClear,
  211.                        TAG_DONE);
  212.                     }
  213.  
  214.                     if (UserSet || UserClear)
  215.                     {
  216.                         anz=UMSSelectTags(acc,
  217.                        UMSTAG_SelReadLocal  ,TRUE,
  218.                        UMSTAG_SelMask       ,1,
  219.                        UMSTAG_SelMatch      ,1,
  220.                        opts[OPT_FORUSER]?
  221.                                        UMSTAG_SelWriteUser:
  222.                                        TAG_IGNORE           ,opts[OPT_FORUSER],
  223.                        UMSTAG_SelSet        ,UserSet,
  224.                        UMSTAG_SelUnset      ,UserClear,
  225.                        TAG_DONE);
  226.                     }
  227.  
  228.                     if (anz==-1)
  229.                     {
  230.                         anz=UMSSelectTags(acc,
  231.                        UMSTAG_SelReadLocal  ,TRUE,
  232.                        UMSTAG_SelMask       ,1,
  233.                        UMSTAG_SelMatch      ,1,
  234.                        TAG_DONE);
  235.                     }
  236.  
  237.                     if (!opts[OPT_QUIET])
  238.                 if (opts[OPT_TINY]) printf("%5ld Msgs.\n",anz);
  239.                 else printf("%5ld Msgs (%s).\n",anz,(char *)opts[OPT_FILTER]);
  240.                     erg = 0;
  241.                 }
  242.                 else printf("\7Expression Error %ld\n",fi);
  243.  
  244.                 UMSLogout(acc);
  245.             }
  246.             else printf("\7UMS-Login failed.\n");
  247.  
  248.             CloseLibrary(UMSBase);
  249.         }
  250.         else printf("\7Could not open ums.library V10.\n");
  251.  
  252.         FreeArgs(args_ptr);
  253.     }
  254.     else
  255.     {
  256.         PrintFault(IoErr(), NULL);
  257.         return(RETURN_ERROR);
  258.     }
  259.  
  260.     return(erg);
  261. }
  262.