svccfg.l revision 11996:91b62f7b8186
1%{ 2/* 3 * CDDL HEADER START 4 * 5 * The contents of this file are subject to the terms of the 6 * Common Development and Distribution License (the "License"). 7 * You may not use this file except in compliance with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 23/* 24 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28 29#pragma error_messages(off, E_BLOCK_DECL_UNUSED) 30#pragma error_messages(off, E_EQUALITY_NOT_ASSIGNMENT) 31#pragma error_messages(off, E_FUNC_RET_MAYBE_IGNORED2) 32#pragma error_messages(off, E_STMT_NOT_REACHED) 33 34#include <libintl.h> 35#include <string.h> 36 37#include "svccfg.h" 38#include "svccfg_grammar.h" 39 40/* 41 * We need to undefine lex's input, unput, and output macros so that references 42 * to these call the functions we provide at the end of this source file, 43 * instead of the default versions based on libc's stdio. 44 */ 45#ifdef input 46#undef input 47#endif 48 49#ifdef unput 50#undef unput 51#endif 52 53#ifdef output 54#undef output 55#endif 56 57static int input(void); 58static void unput(int); 59static void output(int); 60 61int parens = 0; 62 63extern int yyerror(const char *); 64 65%} 66 67/* 68 * Since command tokens are only valid at the beginning of the command (or 69 * after help), we'll only return them in the INITIAL state, and report them 70 * as SCV_WORDs afterwards. 71 */ 72%Start WORD 73 74%% 75 76#.*$ ; /* comments */ 77 78<INITIAL>validate { BEGIN WORD; return (SCC_VALIDATE); } 79<INITIAL>import { BEGIN WORD; return (SCC_IMPORT); } 80<INITIAL>cleanup { BEGIN WORD; return (SCC_CLEANUP); } 81<INITIAL>export { BEGIN WORD; return (SCC_EXPORT); } 82<INITIAL>archive { BEGIN WORD; return (SCC_ARCHIVE); } 83<INITIAL>restore { BEGIN WORD; return (SCC_RESTORE); } 84<INITIAL>apply { BEGIN WORD; return (SCC_APPLY); } 85<INITIAL>extract { BEGIN WORD; return (SCC_EXTRACT); } 86<INITIAL>repository { BEGIN WORD; return (SCC_REPOSITORY); } 87<INITIAL>inventory { BEGIN WORD; return (SCC_INVENTORY); } 88<INITIAL>set { BEGIN WORD; return (SCC_SET); } 89<INITIAL>end { BEGIN WORD; return (SCC_END); } 90<INITIAL>exit { BEGIN WORD; return (SCC_END); } 91<INITIAL>quit { BEGIN WORD; return (SCC_END); } 92<INITIAL>help { return (SCC_HELP); } 93 94<INITIAL>list { BEGIN WORD; return (SCC_LIST); } 95<INITIAL>add { BEGIN WORD; return (SCC_ADD); } 96<INITIAL>delete { BEGIN WORD; return (SCC_DELETE); } 97<INITIAL>select { BEGIN WORD; return (SCC_SELECT); } 98<INITIAL>unselect { BEGIN WORD; return (SCC_UNSELECT); } 99 100<INITIAL>listpg { BEGIN WORD; return (SCC_LISTPG); } 101<INITIAL>addpg { BEGIN WORD; return (SCC_ADDPG); } 102<INITIAL>delpg { BEGIN WORD; return (SCC_DELPG); } 103<INITIAL>delhash { BEGIN WORD; return (SCC_DELHASH); } 104<INITIAL>listprop { BEGIN WORD; return (SCC_LISTPROP); } 105<INITIAL>setprop { BEGIN WORD; return (SCC_SETPROP); } 106<INITIAL>delprop { BEGIN WORD; return (SCC_DELPROP); } 107<INITIAL>editprop { BEGIN WORD; return (SCC_EDITPROP); } 108<INITIAL>describe { BEGIN WORD; return (SCC_DESCRIBE); } 109<INITIAL>addpropvalue { BEGIN WORD; return (SCC_ADDPROPVALUE); } 110<INITIAL>delpropvalue { BEGIN WORD; return (SCC_DELPROPVALUE); } 111<INITIAL>setenv { BEGIN WORD; return (SCC_SETENV); } 112<INITIAL>unsetenv { BEGIN WORD; return (SCC_UNSETENV); } 113 114<INITIAL>listsnap { BEGIN WORD; return (SCC_LISTSNAP); } 115<INITIAL>selectsnap { BEGIN WORD; return (SCC_SELECTSNAP); } 116<INITIAL>revert { BEGIN WORD; return (SCC_REVERT); } 117<INITIAL>refresh { BEGIN WORD; return (SCC_REFRESH); } 118 119[^ \t\n">=()]+ { 120 if ((yylval.str = strdup(yytext)) == NULL) { 121 yyerror(gettext("Out of memory")); 122 exit(UU_EXIT_FATAL); 123 } 124 125 return SCV_WORD; 126 } 127 128\"([^"\\]|\\.)*\" { 129 /* 130 * double-quoted strings start at a 131 * double-quote, include characters other than 132 * double-quote and backslash, and 133 * backslashed-characters, and end with a 134 * double-quote. 135 */ 136 137 char *str, *cp; 138 int shift; 139 140 if ((str = strdup(yytext)) == NULL) { 141 yyerror(gettext("Out of memory")); 142 exit(UU_EXIT_FATAL); 143 } 144 145 /* Strip out the backslashes. */ 146 for (cp = str, shift = 0; *cp != '\0'; ++cp) { 147 if (*cp == '\\') { 148 ++cp; 149 150 /* 151 * This can't be null because 152 * the string always ends with 153 * a double-quote. 154 */ 155 156 ++shift; 157 *(cp - shift) = *cp; 158 } else if (shift != 0) 159 *(cp - shift) = *cp; 160 } 161 162 /* Nullify everything after trailing quote */ 163 *(cp - shift) = '\0'; 164 165 yylval.str = str; 166 return SCV_STRING; 167 } 168 169\n { 170 est->sc_cmd_lineno++; 171 BEGIN INITIAL; 172 return (SCS_NEWLINE); 173 } 174 175[ \t]+ ; 176 177">" { return SCS_REDIRECT; } 178"=" { return SCS_EQUALS; } 179"(" { ++parens; return SCS_LPAREN; } 180")" { --parens; return SCS_RPAREN; } 181 182. { 183 uu_die(gettext("unrecognized character %s\n"), 184 yytext); 185 } 186 187%% 188 189int 190yyerror(const char *s) 191{ 192 return (0); 193} 194 195static int 196input(void) 197{ 198 static int saw_eof = 0; 199 200 int c = engine_cmd_getc(est); 201 202 /* 203 * To ensure input is terminated, slip in a newline on EOF. 204 */ 205 if (c == EOF) { 206 if (saw_eof) 207 return (0); 208 209 saw_eof = 1; 210 return ('\n'); 211 } else 212 saw_eof = 0; 213 214 if (c == '\n') 215 yylineno++; 216 217 return (c); 218} 219 220static void 221unput(int c) 222{ 223 if (c == '\n') 224 yylineno--; 225 226 (void) engine_cmd_ungetc(est, c == 0 ? EOF : c); 227} 228 229static void 230output(int c) 231{ 232 char ch = c; 233 engine_cmd_nputs(est, &ch, sizeof (ch)); 234} 235