+ * Parse a return statement.
+ */
+static int parse_return(policy_lex_file_t *lexer, policy_item_t **tail)
+{
+ int rcode;
+ policy_lex_t token;
+ char buffer[32];
+ policy_return_t *this;
+
+ token = policy_lex_file(lexer, 0, buffer, sizeof(buffer));
+ if (token != POLICY_LEX_BARE_WORD) {
+ fprintf(stderr, "%s[%d]: Unexpected token %s\n",
+ lexer->filename, lexer->lineno,
+ lrad_int2str(rlm_policy_tokens, token, "?"));
+ return 0;
+ }
+
+ rcode = lrad_str2int(policy_return_codes, buffer, RLM_MODULE_NUMCODES);
+ if (rcode == RLM_MODULE_NUMCODES) {
+ fprintf(stderr, "%s[%d]: Invalid return code %s\n",
+ lexer->filename, lexer->lineno, buffer);
+ return 0;
+ }
+
+ /*
+ * Look for more sutff
+ */
+ token = policy_lex_file(lexer, POLICY_LEX_FLAG_PEEK,
+ NULL, sizeof(0));
+ if (token != POLICY_LEX_RC_BRACKET) {
+ fprintf(stderr, "%s[%d]: return statement must be the last statement in a policy.\n",
+ lexer->filename, lexer->lineno);
+ return 0;
+ }
+
+ this = rad_malloc(sizeof(*this));
+ memset(this, 0, sizeof(*this));
+
+ this->item.type = POLICY_TYPE_RETURN;
+ this->item.lineno = lexer->lineno;
+ this->rcode = rcode;
+
+ *tail = (policy_item_t *) this;
+
+ return 1;
+}
+
+/*