+ LISTHOST NL { list_host(); }
+ | LISTHOST invalid_string { yyerror("Invalid argument"); }
+ | LISTDISK STRING NL { list_disk($2); amfree($2); }
+ | LISTDISK NL { list_disk(NULL); }
+ | LISTDISK STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
+ | LISTPROPERTY NL { list_property(); }
+ | LISTPROPERTY invalid_string { yyerror("Invalid argument"); }
+ | SETHOST STRING NL { set_host($2); amfree($2); }
+ | SETHOST STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
+ | SETHOST NL { yyerror("Argument required"); }
+ | SETDISK STRING STRING NL { set_disk($2, $3); amfree($2); amfree($3); }
+ | SETDISK STRING NL { set_disk($2, NULL); amfree($2); }
+ | SETDISK STRING STRING invalid_string { yyerror("Invalid argument"); amfree($2); amfree($3); }
+ | SETDISK { yyerror("Argument required"); }
+ | SETTAPE STRING NL { set_tape($2); amfree($2); }
+ | SETTAPE NL { set_tape("default"); }
+ | SETTAPE STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
+ | SETDEVICE STRING NL { set_device(NULL, $2); amfree($2); }
+ | SETDEVICE DASH_H STRING STRING NL { set_device($3, $4); amfree($3); amfree($4); }
+ | SETDEVICE NL { set_device(NULL, NULL); }
+ | SETDEVICE STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
+ | SETDEVICE DASH_H STRING NL { yyerror("Invalid argument"); amfree($3); }
+ | SETDEVICE DASH_H STRING STRING invalid_string { yyerror("Invalid argument"); amfree($3); amfree($4); }
+ | SETPROPERTY STRING property_value { set_property_name($2, 0); amfree($2); }
+ | SETPROPERTY APPEND STRING property_value { set_property_name($3, 1); amfree($3); }
+ | SETPROPERTY PRIORITY STRING property_value { set_property_name($3, 0); amfree($3); }
+ | SETPROPERTY APPEND PRIORITY STRING property_value { set_property_name($4, 1); amfree($4); }
+ | SETPROPERTY NL { yyerror("Invalid argument"); }
+ | SETPROPERTY APPEND NL { yyerror("Invalid argument"); }
+ | SETPROPERTY PRIORITY NL { yyerror("Invalid argument"); }
+ | SETPROPERTY APPEND PRIORITY NL { yyerror("Invalid argument"); }
+ | CD STRING NL { cd_glob($2, 1); amfree($2); }
+ | CD STRING invalid_string { yyerror("Invalid argument"); }
+ | CD NL { yyerror("Argument required"); }
+ | CDX STRING NL { cd_regex($2, 1); amfree($2); }
+ | CDX STRING invalid_string { yyerror("Invalid argument"); amfree($2); }
+ | CDX NL { yyerror("Argument required"); }
+ | SETMODE SMB NL { set_mode(SAMBA_SMBCLIENT); }
+ | SETMODE TAR NL { set_mode(SAMBA_TAR); }
+ | SETMODE SMB invalid_string { yyerror("Invalid argument"); }
+ | SETMODE TAR invalid_string { yyerror("Invalid argument"); }
+ | SETMODE invalid_string { yyerror("Invalid argument"); }
+ | SETMODE NL { yyerror("Argument required"); }
+ ;
+
+setdate_command:
+ SETDATE STRING NL {
+ time_t now;
+ struct tm *t;
+ int y=2000, m=0, d=1, h=0, mi=0, s=0;
+ int ret;
+ char *mydate = $2;
+
+ now = time((time_t *)NULL);
+ t = localtime(&now);
+ if (t) {
+ y = 1900+t->tm_year;
+ m = t->tm_mon+1;
+ d = t->tm_mday;
+ }
+ if (sscanf(mydate, "---%d", &d) == 1 ||
+ sscanf(mydate, "--%d-%d", &m, &d) == 2 ||
+ sscanf(mydate, "%d-%d-%d-%d-%d-%d", &y, &m, &d, &h, &mi, &s) >= 3) {
+ if (y < 70) {
+ y += 2000;
+ } else if (y < 100) {
+ y += 1900;
+ }
+ if(y < 1000 || y > 9999) {
+ printf("invalid year");
+ } else if(m < 1 || m > 12) {
+ printf("invalid month");
+ } else if(d < 1 || d > 31) {
+ printf("invalid day");
+ } else if(h < 0 || h > 24) {
+ printf("invalid hour");
+ } else if(mi < 0 || mi > 59) {
+ printf("invalid minute");
+ } else if(s < 0 || s > 59) {
+ printf("invalid second");
+ } else {
+ char result[DATE_ALLOC_SIZE];
+ if (h == 0 && mi == 0 && s == 0)
+ g_snprintf(result, DATE_ALLOC_SIZE, "%04d-%02d-%02d", y, m, d);
+ else
+ g_snprintf(result, DATE_ALLOC_SIZE, "%04d-%02d-%02d-%02d-%02d-%02d", y, m, d, h, mi, s);
+ set_date(result);
+ }
+ } else {
+ printf("Invalid date: %s\n", mydate);
+ }
+ }
+ | SETDATE NL { yyerror("Argument required"); }
+ | SETDATE STRING invalid_string { yyerror("Invalid argument"); }