|
Packit |
23ab03 |
/*
|
|
Packit |
23ab03 |
* amanda, the advanced maryland automatic network disk archiver
|
|
Packit |
23ab03 |
* Copyright (c) 1991-2000 University of Maryland at College Park
|
|
Packit |
23ab03 |
* Copyright (c) 2007-2012 Zmanda, Inc. All Rights Reserved.
|
|
Packit |
23ab03 |
* Copyright (c) 2013-2016 Carbonite, Inc. All Rights Reserved.
|
|
Packit |
23ab03 |
* All Rights Reserved.
|
|
Packit |
23ab03 |
*
|
|
Packit |
23ab03 |
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit |
23ab03 |
* documentation for any purpose is hereby granted without fee, provided that
|
|
Packit |
23ab03 |
* the above copyright notice appear in all copies and that both that
|
|
Packit |
23ab03 |
* copyright notice and this permission notice appear in supporting
|
|
Packit |
23ab03 |
* documentation, and that the name of U.M. not be used in advertising or
|
|
Packit |
23ab03 |
* publicity pertaining to distribution of the software without specific,
|
|
Packit |
23ab03 |
* written prior permission. U.M. makes no representations about the
|
|
Packit |
23ab03 |
* suitability of this software for any purpose. It is provided "as is"
|
|
Packit |
23ab03 |
* without express or implied warranty.
|
|
Packit |
23ab03 |
*
|
|
Packit |
23ab03 |
* U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
|
|
Packit |
23ab03 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
|
|
Packit |
23ab03 |
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
Packit |
23ab03 |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
Packit |
23ab03 |
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
Packit |
23ab03 |
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
Packit |
23ab03 |
*
|
|
Packit |
23ab03 |
* Authors: the Amanda Development Team. Its members are listed in a
|
|
Packit |
23ab03 |
* file named AUTHORS, in the root directory of this distribution.
|
|
Packit |
23ab03 |
*/
|
|
Packit |
23ab03 |
/*
|
|
Packit |
23ab03 |
* $Id: uscan.l,v 1.3 2006/07/05 11:15:56 martinea Exp $
|
|
Packit |
23ab03 |
*
|
|
Packit |
23ab03 |
* lexer for amrecover interactive language
|
|
Packit |
23ab03 |
*/
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
#include "amanda.h"
|
|
Packit |
23ab03 |
#include "uparse.h"
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
/*
|
|
Packit |
23ab03 |
* We redefine this here to prevent compiler warning about ignoring fwrite
|
|
Packit |
23ab03 |
* return value...
|
|
Packit |
23ab03 |
*/
|
|
Packit |
23ab03 |
#undef ECHO
|
|
Packit |
23ab03 |
#define ECHO do { \
|
|
Packit |
23ab03 |
if (fwrite(yytext, (size_t)yyleng, 1, yyout) <= 0) { \
|
|
Packit |
23ab03 |
yyerror("ECHO failure"); \
|
|
Packit |
23ab03 |
} \
|
|
Packit |
23ab03 |
} while (0)
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
#define YY_NO_UNPUT
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
#define DATE_ALLOC_SIZE sizeof("YYYY-MM-DD-HH-MM-SS") /* includes null */
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
#define YY_DECL int yylex()
|
|
Packit |
23ab03 |
extern int yylex(void);
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
extern void yyerror(char *s);
|
|
Packit |
23ab03 |
extern int yyparse(void);
|
|
Packit |
23ab03 |
static int ll_parse_date(int type, char *text);
|
|
Packit |
23ab03 |
int process_line(char *line);
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%x quotedpath
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
static char *string_buf = NULL;
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%%
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
/* literal keyword tokens */
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
listhost { return LISTHOST; }
|
|
Packit |
23ab03 |
listdisk { return LISTDISK; }
|
|
Packit |
23ab03 |
sethost { return SETHOST; }
|
|
Packit |
23ab03 |
setdisk { return SETDISK; }
|
|
Packit |
23ab03 |
setdate { return SETDATE; }
|
|
Packit |
23ab03 |
setmode { return SETMODE; }
|
|
Packit |
23ab03 |
settape { return SETTAPE; }
|
|
Packit |
23ab03 |
cd { return CD; }
|
|
Packit |
23ab03 |
cdx { return CDX; }
|
|
Packit |
23ab03 |
quit { return QUIT; }
|
|
Packit |
23ab03 |
exit { return QUIT; }
|
|
Packit |
23ab03 |
history { return DHIST; }
|
|
Packit |
23ab03 |
ls { return LS; }
|
|
Packit |
23ab03 |
add { return ADD; }
|
|
Packit |
23ab03 |
addx { return ADDX; }
|
|
Packit |
23ab03 |
list { return LIST; }
|
|
Packit |
23ab03 |
delete { return DELETE; }
|
|
Packit |
23ab03 |
deletex { return DELETEX; }
|
|
Packit |
23ab03 |
pwd { return PWD; }
|
|
Packit |
23ab03 |
clear { return CLEAR; }
|
|
Packit |
23ab03 |
help { return HELP; }
|
|
Packit |
23ab03 |
\? { return HELP; }
|
|
Packit |
23ab03 |
lcd { return LCD; }
|
|
Packit |
23ab03 |
lpwd { return LPWD; }
|
|
Packit |
23ab03 |
extract { return EXTRACT; }
|
|
Packit |
23ab03 |
smb { return SMB; }
|
|
Packit |
23ab03 |
tar { return TAR; }
|
|
Packit |
23ab03 |
mode { return MODE; }
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
/* dates */
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
---[0-9]+ { return ll_parse_date(1, yytext); }
|
|
Packit |
23ab03 |
--[0-9]+-[0-9]+ { return ll_parse_date(2, yytext); }
|
|
Packit |
23ab03 |
[0-9]+-[0-9]+-[0-9]+ { return ll_parse_date(3, yytext); }
|
|
Packit |
23ab03 |
[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+ { return ll_parse_date(4, yytext); }
|
|
Packit |
23ab03 |
[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+ { return ll_parse_date(5, yytext); }
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
/* quoted file names */
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
\" {
|
|
Packit |
23ab03 |
if(string_buf != NULL) {
|
|
Packit |
23ab03 |
g_printf("ERROR:string_buf != NULL: %s\n",string_buf);
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
BEGIN(quotedpath);
|
|
Packit |
23ab03 |
strappend(string_buf, yytext);
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
<quotedpath>[^\\\"]+ {
|
|
Packit |
23ab03 |
strappend(string_buf, yytext);
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
<quotedpath>\\. {
|
|
Packit |
23ab03 |
/* escaped character (including quote) */
|
|
Packit |
23ab03 |
strappend(string_buf, yytext);
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
<quotedpath>\" { /* saw closing quote - all done */
|
|
Packit |
23ab03 |
strappend(string_buf, yytext);
|
|
Packit |
23ab03 |
yylval.strval = string_buf;
|
|
Packit |
23ab03 |
string_buf = NULL;
|
|
Packit |
23ab03 |
BEGIN(INITIAL);
|
|
Packit |
23ab03 |
return PATH;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
/* file names */
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
[^[:space:][:cntrl:]"]+ {
|
|
Packit |
23ab03 |
yylval.strval = g_strdup(yytext);
|
|
Packit |
23ab03 |
return PATH;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
/* whitespace */
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
[[:space:]]+ ; /* whitespace */
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
/* anything else */
|
|
Packit |
23ab03 |
/* everything should have been handled by now, so this rule is disabled */
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%{
|
|
Packit |
23ab03 |
#if 0
|
|
Packit |
23ab03 |
. { yyerror("invalid character"); }
|
|
Packit |
23ab03 |
#endif
|
|
Packit |
23ab03 |
%}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
%%
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
int
|
|
Packit |
23ab03 |
process_line(
|
|
Packit |
23ab03 |
char * line)
|
|
Packit |
23ab03 |
{
|
|
Packit |
23ab03 |
YY_BUFFER_STATE b;
|
|
Packit |
23ab03 |
int result;
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
b = yy_scan_string(line); /* tell lex to scan lineread */
|
|
Packit |
23ab03 |
result = yyparse(); /* parse lineread and act */
|
|
Packit |
23ab03 |
yy_delete_buffer(b);
|
|
Packit |
23ab03 |
return result;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
static int
|
|
Packit |
23ab03 |
ll_parse_date(
|
|
Packit |
23ab03 |
int type,
|
|
Packit |
23ab03 |
char * text)
|
|
Packit |
23ab03 |
{
|
|
Packit |
23ab03 |
time_t now;
|
|
Packit |
23ab03 |
struct tm *t;
|
|
Packit |
23ab03 |
int y=2000, m=0, d=1, h=0, mi=0, s=0;
|
|
Packit |
23ab03 |
int ret;
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
now = time((time_t *)NULL);
|
|
Packit |
23ab03 |
t = localtime(&now;;
|
|
Packit |
23ab03 |
if (t) {
|
|
Packit |
23ab03 |
y = 1900+t->tm_year;
|
|
Packit |
23ab03 |
m = t->tm_mon+1;
|
|
Packit |
23ab03 |
d = t->tm_mday;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
switch(type) {
|
|
Packit |
23ab03 |
case 1:
|
|
Packit |
23ab03 |
if (sscanf(text, "---%d", &d) != 1) {
|
|
Packit |
23ab03 |
yyerror("invalid date");
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
break;
|
|
Packit |
23ab03 |
case 2:
|
|
Packit |
23ab03 |
if (sscanf(text, "--%d-%d", &m, &d) != 2) {
|
|
Packit |
23ab03 |
yyerror("invalid date");
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
break;
|
|
Packit |
23ab03 |
case 3:
|
|
Packit |
23ab03 |
if (sscanf(text, "%d-%d-%d", &y, &m, &d) != 3) {
|
|
Packit |
23ab03 |
yyerror("invalid date");
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
break;
|
|
Packit |
23ab03 |
case 4:
|
|
Packit |
23ab03 |
if (sscanf(text, "%d-%d-%d-%d-%d-%d", &y, &m, &d, &h, &mi, &s) != 6) {
|
|
Packit |
23ab03 |
yyerror("invalid date");
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
break;
|
|
Packit |
23ab03 |
case 5:
|
|
Packit |
23ab03 |
if (sscanf(text, "%d-%d-%d-%d-%d", &y, &m, &d, &h, &mi) != 5) {
|
|
Packit |
23ab03 |
yyerror("invalid date");
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
break;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
ret = PATH; /* cause a parse error */
|
|
Packit |
23ab03 |
if(y < 70) {
|
|
Packit |
23ab03 |
y += 2000;
|
|
Packit |
23ab03 |
} else if(y < 100) {
|
|
Packit |
23ab03 |
y += 1900;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
if(y < 1000 || y > 9999) {
|
|
Packit |
23ab03 |
yyerror("invalid year");
|
|
Packit |
23ab03 |
} else if(m < 1 || m > 12) {
|
|
Packit |
23ab03 |
yyerror("invalid month");
|
|
Packit |
23ab03 |
} else if(d < 1 || d > 31) {
|
|
Packit |
23ab03 |
yyerror("invalid day");
|
|
Packit |
23ab03 |
} else if(h < 0 || h > 24) {
|
|
Packit |
23ab03 |
yyerror("invalid hour");
|
|
Packit |
23ab03 |
} else if(mi < 0 || mi > 59) {
|
|
Packit |
23ab03 |
yyerror("invalid minute");
|
|
Packit |
23ab03 |
} else if(s < 0 || s > 59) {
|
|
Packit |
23ab03 |
yyerror("invalid second");
|
|
Packit |
23ab03 |
} else if(type < 4) {
|
|
Packit |
23ab03 |
yylval.strval = g_malloc(DATE_ALLOC_SIZE);
|
|
Packit |
23ab03 |
g_snprintf(yylval.strval, DATE_ALLOC_SIZE, "%04d-%02d-%02d", y, m, d);
|
|
Packit |
23ab03 |
ret = DATE;
|
|
Packit |
23ab03 |
} else {
|
|
Packit |
23ab03 |
yylval.strval = g_malloc(DATE_ALLOC_SIZE);
|
|
Packit |
23ab03 |
g_snprintf(yylval.strval, DATE_ALLOC_SIZE, "%04d-%02d-%02d-%02d-%02d-%02d", y, m, d, h, mi, s);
|
|
Packit |
23ab03 |
ret = DATE;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
return ret;
|
|
Packit |
23ab03 |
}
|
|
Packit |
23ab03 |
|
|
Packit |
23ab03 |
int
|
|
Packit |
23ab03 |
yywrap(void)
|
|
Packit |
23ab03 |
{
|
|
Packit |
23ab03 |
return 1;
|
|
Packit |
23ab03 |
}
|