Blame recover-src/uparse.y

Packit Service 392537
/*
Packit Service 392537
 * Amanda, The Advanced Maryland Automatic Network Disk Archiver
Packit Service 392537
 * Copyright (c) 1991-1998, 2000 University of Maryland at College Park
Packit Service 392537
 * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
Packit Service 392537
 * Copyright (c) 2013-2016 Carbonite, Inc.  All Rights Reserved.
Packit Service 392537
 * All Rights Reserved.
Packit Service 392537
 *
Packit Service 392537
 * Permission to use, copy, modify, distribute, and sell this software and its
Packit Service 392537
 * documentation for any purpose is hereby granted without fee, provided that
Packit Service 392537
 * the above copyright notice appear in all copies and that both that
Packit Service 392537
 * copyright notice and this permission notice appear in supporting
Packit Service 392537
 * documentation, and that the name of U.M. not be used in advertising or
Packit Service 392537
 * publicity pertaining to distribution of the software without specific,
Packit Service 392537
 * written prior permission.  U.M. makes no representations about the
Packit Service 392537
 * suitability of this software for any purpose.  It is provided "as is"
Packit Service 392537
 * without express or implied warranty.
Packit Service 392537
 *
Packit Service 392537
 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
Packit Service 392537
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
Packit Service 392537
 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit Service 392537
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
Packit Service 392537
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
Packit Service 392537
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit Service 392537
 *
Packit Service 392537
 * Authors: the Amanda Development Team.  Its members are listed in a
Packit Service 392537
 * file named AUTHORS, in the root directory of this distribution.
Packit Service 392537
 */
Packit Service 392537
/*
Packit Service 392537
 * $Id$
Packit Service 392537
 *
Packit Service 392537
 * parser for amrecover interactive language
Packit Service 392537
 */
Packit Service 392537
%{
Packit Service 392537
#include "amanda.h"
Packit Service 392537
#include "amrecover.h"
Packit Service 392537
Packit Service 392537
#define DATE_ALLOC_SIZE sizeof("YYYY-MM-DD-HH-MM-SS")   /* includes null */
Packit Service 392537
Packit Service 392537
void		yyerror(char *s);
Packit Service 392537
extern int	yylex(void);
Packit Service 392537
extern char *	yytext;
Packit Service 392537
%}
Packit Service 392537
Packit Service 392537
/* DECLARATIONS */
Packit Service 392537
%union {
Packit Service 392537
	int	intval;
Packit Service 392537
	double	floatval;
Packit Service 392537
	char *	strval;
Packit Service 392537
	int	subtok;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
	/* literal keyword tokens */
Packit Service 392537
Packit Service 392537
%token LISTHOST LISTDISK LISTPROPERTY
Packit Service 392537
%token SETHOST SETDISK SETDATE SETTAPE SETMODE SETDEVICE SETPROPERTY
Packit Service 392537
%token CD CDX QUIT DHIST LS ADD ADDX EXTRACT DASH_H
Packit Service 392537
%token LIST DELETE DELETEX PWD CLEAR HELP LCD LPWD MODE SMB TAR
Packit Service 392537
%token APPEND PRIORITY SETTRANSLATE STORAGE
Packit Service 392537
%token NL
Packit Service 392537
Packit Service 392537
        /* typed tokens */
Packit Service 392537
Packit Service 392537
%token <strval> STRING
Packit Service 392537
Packit Service 392537
Packit Service 392537
/* GRAMMAR */
Packit Service 392537
%%
Packit Service 392537
Packit Service 392537
ucommand:
Packit Service 392537
	set_command
Packit Service 392537
  |     setdate_command
Packit Service 392537
  |     display_command
Packit Service 392537
  |     quit_command
Packit Service 392537
  |     add_command
Packit Service 392537
  |     addx_command
Packit Service 392537
  |     delete_command
Packit Service 392537
  |     deletex_command
Packit Service 392537
  |     local_command
Packit Service 392537
  |	help_command
Packit Service 392537
  |     extract_command
Packit Service 392537
  |     invalid_command
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
set_command:
Packit Service 392537
	LISTHOST NL { list_host(); }
Packit Service 392537
  |	LISTHOST invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	LISTDISK STRING NL { list_disk($2); amfree($2); }
Packit Service 392537
  |	LISTDISK NL { list_disk(NULL); }
Packit Service 392537
  |	LISTDISK STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
Packit Service 392537
  |	LISTPROPERTY NL { list_property(); }
Packit Service 392537
  |	LISTPROPERTY invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETTRANSLATE NL { set_translate(NULL); }
Packit Service 392537
  |	SETTRANSLATE STRING invalid_string NL { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETTRANSLATE STRING NL { set_translate($2); amfree($2); }
Packit Service 392537
  |	SETHOST STRING NL { set_host($2); amfree($2); }
Packit Service 392537
  |	SETHOST STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
Packit Service 392537
  |	SETHOST NL { yyerror("Argument required"); }
Packit Service 392537
  |	SETDISK STRING STRING NL { set_disk($2, $3); amfree($2); amfree($3); }
Packit Service 392537
  |	SETDISK STRING NL { set_disk($2, NULL); amfree($2); }
Packit Service 392537
  |	SETDISK STRING STRING invalid_string { yyerror("Invalid argument"); amfree($2); amfree($3); }
Packit Service 392537
  |	SETDISK { yyerror("Argument required"); }
Packit Service 392537
  |	SETTAPE STRING NL { set_tape($2); amfree($2); }
Packit Service 392537
  |	SETTAPE NL { set_tape("default"); }
Packit Service 392537
  |	SETTAPE STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
Packit Service 392537
  |	SETDEVICE STRING NL { set_device(NULL, $2); amfree($2); }
Packit Service 392537
  |	SETDEVICE DASH_H STRING STRING NL { set_device($3, $4); amfree($3); amfree($4);  }
Packit Service 392537
  |	SETDEVICE NL { set_device(NULL, NULL); }
Packit Service 392537
  |	SETDEVICE STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
Packit Service 392537
  |	SETDEVICE DASH_H STRING NL { yyerror("Invalid argument"); amfree($3); }
Packit Service 392537
  |	SETDEVICE DASH_H STRING STRING invalid_string { yyerror("Invalid argument"); amfree($3); amfree($4); }
Packit Service 392537
  |	SETPROPERTY STRING property_value { set_property_name($2, 0); amfree($2); }
Packit Service 392537
  |	SETPROPERTY APPEND STRING property_value { set_property_name($3, 1); amfree($3); }
Packit Service 392537
  |	SETPROPERTY PRIORITY STRING property_value { set_property_name($3, 0); amfree($3); }
Packit Service 392537
  |	SETPROPERTY APPEND PRIORITY STRING property_value { set_property_name($4, 1); amfree($4); }
Packit Service 392537
  |	SETPROPERTY NL { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETPROPERTY APPEND NL { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETPROPERTY PRIORITY NL { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETPROPERTY APPEND PRIORITY NL { yyerror("Invalid argument"); }
Packit Service 392537
  |	CD STRING NL { cd_glob($2, 1); amfree($2); }
Packit Service 392537
  |	CD STRING invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	CD NL { yyerror("Argument required"); }
Packit Service 392537
  |     CDX STRING NL { cd_regex($2, 1); amfree($2); }
Packit Service 392537
  |	CDX STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
Packit Service 392537
  |	CDX NL { yyerror("Argument required"); }
Packit Service 392537
  |	SETMODE SMB NL { set_mode(SAMBA_SMBCLIENT); }
Packit Service 392537
  |	SETMODE TAR NL { set_mode(SAMBA_TAR); }
Packit Service 392537
  |	SETMODE SMB invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETMODE TAR invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETMODE invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	SETMODE NL { yyerror("Argument required"); }
Packit Service 392537
  |	STORAGE storage_value { set_storage(); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
setdate_command:
Packit Service 392537
	SETDATE STRING NL {
Packit Service 392537
			time_t now;
Packit Service 392537
			struct tm *t;
Packit Service 392537
			int y=2000, m=0, d=1, h=0, mi=0, s=0;
Packit Service 392537
			char *mydate = $2;
Packit Service 392537
Packit Service 392537
			now = time((time_t *)NULL);
Packit Service 392537
			t = localtime(&now;;
Packit Service 392537
			if (t) {
Packit Service 392537
			    y = 1900+t->tm_year;
Packit Service 392537
			    m = t->tm_mon+1;
Packit Service 392537
			    d = t->tm_mday;
Packit Service 392537
			}
Packit Service 392537
			if (sscanf(mydate, "---%d", &d) == 1 ||
Packit Service 392537
			    sscanf(mydate, "--%d-%d", &m, &d) == 2 ||
Packit Service 392537
			    sscanf(mydate, "%d-%d-%d-%d-%d-%d", &y, &m, &d, &h, &mi, &s) >= 3) {
Packit Service 392537
			    if (y < 70) {
Packit Service 392537
				y += 2000;
Packit Service 392537
			    } else if (y < 100) {
Packit Service 392537
				y += 1900;
Packit Service 392537
			    }
Packit Service 392537
			    if(y < 1000 || y > 9999) {
Packit Service 392537
				printf("invalid year");
Packit Service 392537
			    } else if(m < 1 || m > 12) {
Packit Service 392537
				printf("invalid month");
Packit Service 392537
			    } else if(d < 1 || d > 31) {
Packit Service 392537
				printf("invalid day");
Packit Service 392537
			    } else if(h < 0 || h > 24) {
Packit Service 392537
				printf("invalid hour");
Packit Service 392537
			    } else if(mi < 0 || mi > 59) {
Packit Service 392537
				printf("invalid minute");
Packit Service 392537
			    } else if(s < 0 || s > 59) {
Packit Service 392537
				printf("invalid second");
Packit Service 392537
			    } else {
Packit Service 392537
				char result[DATE_ALLOC_SIZE];
Packit Service 392537
				if (h == 0 && mi == 0 && s == 0)
Packit Service 392537
				    g_snprintf(result, DATE_ALLOC_SIZE, "%04d-%02d-%02d", y, m, d);
Packit Service 392537
				else
Packit Service 392537
				    g_snprintf(result, DATE_ALLOC_SIZE, "%04d-%02d-%02d-%02d-%02d-%02d", y, m, d, h, mi, s);
Packit Service 392537
				set_date(result);
Packit Service 392537
			    }
Packit Service 392537
			} else {
Packit Service 392537
			    printf("Invalid date: %s\n", mydate);
Packit Service 392537
			}
Packit Service 392537
		     }
Packit Service 392537
  |	SETDATE NL { yyerror("Argument required"); }
Packit Service 392537
  |	SETDATE STRING invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
display_command:
Packit Service 392537
	DHIST NL { list_disk_history(); }
Packit Service 392537
  |	DHIST invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	LS NL { list_directory(); }
Packit Service 392537
  |	LS invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	LIST STRING NL { display_extract_list($2); amfree($2); }
Packit Service 392537
  |	LIST NL { display_extract_list(NULL); }
Packit Service 392537
  |	LIST STRING invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	PWD NL { show_directory(); }
Packit Service 392537
  |	PWD invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	CLEAR NL { clear_extract_list(); }
Packit Service 392537
  |	CLEAR invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	MODE NL { show_mode (); }
Packit Service 392537
  |	MODE invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
quit_command:
Packit Service 392537
	QUIT NL { quit(); }
Packit Service 392537
  |	QUIT invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
add_command:
Packit Service 392537
	ADD add_path NL
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
add_path:
Packit Service 392537
	add_path STRING { add_glob($2); amfree($2); }
Packit Service 392537
  |	STRING { add_glob($1); amfree($1); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
addx_command:
Packit Service 392537
	ADDX addx_path NL
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
addx_path:
Packit Service 392537
	addx_path STRING { add_regex($2); amfree($2); }
Packit Service 392537
  |	STRING { add_regex($1); amfree($1); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
delete_command:
Packit Service 392537
	DELETE delete_path NL
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
delete_path:
Packit Service 392537
	delete_path STRING { delete_glob($2); amfree($2); }
Packit Service 392537
  |	STRING { delete_glob($1); amfree($1); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
deletex_command:
Packit Service 392537
	DELETEX deletex_path NL
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
deletex_path:
Packit Service 392537
	deletex_path STRING { delete_regex($2); amfree($2); }
Packit Service 392537
  |	STRING { delete_regex($1); amfree($1); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
local_command:
Packit Service 392537
	LPWD NL { char * buf= g_get_current_dir(); puts(buf); free(buf); }
Packit Service 392537
  |	LPWD invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	LCD STRING NL {
Packit Service 392537
		local_cd($2);
Packit Service 392537
		amfree($2);
Packit Service 392537
	}
Packit Service 392537
  |	LCD STRING invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  |	LCD NL { yyerror("Argument required"); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
help_command:
Packit Service 392537
	HELP NL { help_list(); }
Packit Service 392537
  |	HELP invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
extract_command:
Packit Service 392537
	EXTRACT NL { extract_files(); }
Packit Service 392537
  |	EXTRACT invalid_string { yyerror("Invalid argument"); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
invalid_command:
Packit Service 392537
        STRING bogus_string {
Packit Service 392537
	    char * errstr = g_strjoin(NULL, "Invalid command: ", $1, NULL);
Packit Service 392537
	    yyerror(errstr);
Packit Service 392537
	    amfree(errstr);
Packit Service 392537
	    YYERROR;
Packit Service 392537
	} /* Quiets compiler warnings about unused label */
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
property_value:
Packit Service 392537
	STRING property_value { add_property_value($1); amfree( $1); }
Packit Service 392537
  |     NL { ; }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
storage_value:
Packit Service 392537
	STRING storage_value { add_storage_value($1); amfree( $1); }
Packit Service 392537
  |     NL { ; }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
invalid_string:
Packit Service 392537
	STRING bogus_string { amfree($1); }
Packit Service 392537
  ;
Packit Service 392537
Packit Service 392537
bogus_string:
Packit Service 392537
        STRING bogus_string { amfree($1); }
Packit Service 392537
  |	NL { ; }
Packit Service 392537
Packit Service 392537
/* ADDITIONAL C CODE */
Packit Service 392537
%%
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
yyerror(
Packit Service 392537
    char *	s)
Packit Service 392537
{
Packit Service 392537
	g_printf("%s\n", s);
Packit Service 392537
}