tacacs-F4.0.4.28/parse.c (250 lines of code) (raw):

/* * $Id: parse.c,v 1.15 2009-03-17 18:40:20 heas Exp $ * * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved * Copyright (c) 1995-1998 by Cisco systems, Inc. * * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that this * copyright and permission notice appear on all copies of the * software and supporting documentation, the name of Cisco Systems, * Inc. not be used in advertising or publicity pertaining to * distribution of the program without specific prior permission, and * notice be given in supporting documentation that modification, * copying and distribution is by permission of Cisco Systems, Inc. * * Cisco Systems, Inc. makes no representations about the suitability * of this software for any purpose. THIS SOFTWARE IS PROVIDED ``AS * IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE. */ /* Keywords of the configuration language */ #include "tac_plus.h" static void *wordtable[HASH_TAB_SIZE]; /* Table of keyword declarations */ struct keyword { char *word; void *hash; u_char value; }; typedef struct keyword KEYWORD; static void declare(char *, int); static void declare(char *name, int value) { KEYWORD *n; KEYWORD *k = (KEYWORD *)tac_malloc(sizeof(KEYWORD)); k->word = tac_strdup(name); k->value = value; n = hash_add_entry(wordtable, (void *) k); if (n) { report(LOG_ERR, "Attempt to multiply define keyword %s", name); tac_exit(1); } } /* Declare keywords of the "configuration language". */ void parser_init(void) { memset(wordtable, 0, sizeof(wordtable)); declare("access", S_access); declare("accounting", S_accounting); #ifdef ACECLNT declare("aceclnt", S_aceclnt); #endif #ifdef ACLS declare("acl", S_acl); #endif declare("after", S_after); declare("arap", S_arap); declare("attribute", S_attr); declare("authentication", S_authentication); declare("authorization", S_authorization); declare("before", S_before); declare("chap", S_chap); #ifdef MSCHAP declare("ms-chap", S_mschap); #endif /* MSCHAP */ declare("cleartext", S_cleartext); declare("nopassword", S_nopasswd); declare("cmd", S_cmd); declare("default", S_default); declare("deny", S_deny); declare("des", S_des); declare("enable", S_enable); #ifdef UENABLE declare("enableacl", S_enableacl); #endif declare("exec", S_exec); declare("expires", S_expires); declare("file", S_file); declare("group", S_group); declare("global", S_global); declare("host", S_host); declare("ip", S_ip); declare("ipx", S_ipx); declare("key", S_key); declare("lcp", S_lcp); #ifdef MAXSESS declare("maxsess", S_maxsess); #endif declare("member", S_member); declare("message", S_message); declare("name", S_name); declare("optional", S_optional); declare("login", S_login); declare("permit", S_permit); declare("pap", S_pap); declare("opap", S_opap); declare("ppp", S_ppp); declare("protocol", S_protocol); #ifdef SKEY declare("skey", S_skey); #endif declare("slip", S_slip); declare("service", S_svc); declare("user", S_user); declare("prompt", S_prompt); declare("logging", S_logging); #ifdef HAVE_PAM declare("PAM", S_pam); #endif declare("syslog", S_syslog); declare("maxprocs", S_maxprocs); declare("maxprocsperclt", S_maxprocsperclt); declare("readtimeout", S_readtimeout); declare("writetimeout", S_writetimeout); declare("accepttimeout", S_accepttimeout); declare("logauthor", S_logauthor); } /* Return a keyword code if a keyword is recognized. 0 otherwise */ int keycode(char *keyword) { KEYWORD *k = hash_lookup(wordtable, keyword); if (k) return(k->value); return(S_unknown); } char * codestring(int type) { switch (type) { default: return("<unknown symbol>"); case S_eof: return("end-of-file"); case S_unknown: return("unknown"); case S_separator: return("="); case S_string: return("<string>"); case S_openbra: return("{"); case S_closebra: return("}"); #ifdef ACLS case S_acl: return("acl"); #endif case S_enable: return("enable"); #ifdef UENABLE case S_enableacl: return("enableacl"); #endif case S_key: return("key"); case S_user: return("user"); case S_group: return("group"); case S_host: return("host"); case S_file: return("file"); #ifdef SKEY case S_skey: return("skey"); #endif #ifdef ACECLNT case S_aceclnt: return("aceclnt"); #endif case S_name: return("name"); case S_login: return("login"); case S_member: return("member"); #ifdef MAXSESS case S_maxsess: return("maxsess"); #endif case S_expires: return("expires"); case S_after: return("after"); case S_before: return("before"); case S_message: return("message"); case S_arap: return("arap"); case S_global: return("global"); case S_chap: return("chap"); #ifdef MSCHAP case S_mschap: return("ms-chap"); #endif /* MSCHAP */ case S_pap: return("pap"); case S_opap: return("opap"); case S_cleartext: return("cleartext"); case S_nopasswd: return("nopassword"); case S_des: return("des"); case S_svc: return("service"); case S_default: return("default"); case S_access: return("access"); case S_deny: return("deny"); case S_permit: return("permit"); case S_exec: return("exec"); case S_protocol: return("protocol"); case S_optional: return("optional"); case S_ip: return("ip"); case S_ipx: return("ipx"); case S_slip: return("slip"); case S_ppp: return("ppp"); case S_authentication: return("authentication"); case S_authorization: return("authorization"); case S_cmd: return("cmd"); case S_attr: return("attribute"); case S_svc_dflt: return("svc_dflt"); case S_accounting: return("accounting"); case S_lcp: return("lcp"); case S_prompt: return("prompt"); case S_logging: return("logging"); #ifdef HAVE_PAM case S_pam: return("PAM"); #endif case S_syslog: return("syslog"); case S_maxprocs: return("maxprocs"); case S_maxprocsperclt: return("maxprocsperclt"); case S_readtimeout: return("readtimeout"); case S_writetimeout: return("writetimeout"); case S_accepttimeout: return("accepttimeout"); case S_logauthor: return("logauthor"); } }