/****************************************************************************** * acs - access control string ******************************************************************************/ #include #include #include #include struct acs_info { unsigned char level; unsigned flags; }; static void acs_init(struct acs_info *ai, unsigned level, unsigned flags) { ai->level=level<=UCHAR_MAX?level:UCHAR_MAX; ai->flags=flags; } static int acs_testflag(struct acs_info *ai, unsigned flag) { unsigned i; flag=tolower((char)flag); if(flag>='a' && flag<='z') { i=flag-'a'; } else if(flag>='0' && flag<='9') { i=flag-'0'+26; } else { fprintf(stderr, "unknown flag '%c'\n", flag); return 0; } return ((ai->flags>>i)&1)==1; } static int acs_check(struct acs_info *ai, const char *acsstring) { const char *s=acsstring; const char *endptr; unsigned long level; retry: while(*s) switch(*s++) { case 's': level=strtoul(s, (char**)&endptr, 10); if(endptr==acsstring) { goto parse_failure; } if(ai->level