/** * Change a file. Or deleted/truncated/append/created. * - The file must exist. */ void cmd_change(const char* path, int size) { struct stat st; if (!size) return; if (lstat(path, &st) != 0) { /* LCOV_EXCL_START */ log_fatal("Error accessing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } if (S_ISLNK(st.st_mode)) { /* symlink */ if (rnd(2) == 0) { /* delete */ if (remove(path) != 0) { /* LCOV_EXCL_START */ log_fatal("Error removing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } } else { /* recreate */ char linkto[PATH_MAX]; if (remove(path) != 0) { /* LCOV_EXCL_START */ log_fatal("Error removing %s\n", path); exit(EXIT_FAILURE); /* LCOV_EXCL_STOP */ } rnd_name(linkto); cmd_generate_symlink(path, linkto); } } else if (S_ISREG(st.st_mode)) { int r; r = rnd(4); if (r == 0) { cmd_write(path, size); } else if (r == 1) { cmd_append(path, size); } else if (r == 2) { cmd_truncate(path, size); } else { cmd_delete(path); } } }
void inter_instr() { char opt; idx_cmd = 0; if (cmd == NULL || cmd[idx_cmd] == '\0') notif_error("No option"); opt = cmd[idx_cmd++]; if (opt == 'E') return cmd_exit(); next_arg(); if (opt == 'D') return cmd_delete(); if (opt == 'I') return cmd_insert(); if (opt == 'R') return cmd_replace(); notif_error("Invalid option"); }
void exec_command(char cmd, char *param) { switch (cmd) { case 'Q': cmd_quit(); break; case 'C': cmd_check(); break; case 'P': cmd_print(atoi(param)); break; case 'R': cmd_read(param); break; case 'W': cmd_write(param); break; case 'F': cmd_find(param); break; case 'S': cmd_sort(atoi(param)); break; case 'D': cmd_delete(param); break; case 'r': cmd_random(); break; case 'T': test(atoi(param)); break; default: fprintf(stderr, "Invalid command %c: ignored.\n", cmd); break; } }
int main(int argc, UCHAR **argv) { UCHAR *script0 = malloc(SIZ_SCRIPT); // fat_flags = malloc(65536); fat = malloc(65536 * 2); filebuf0 = malloc(SIZ_FILEBUF); imgbuf0 = malloc(SIZ_IMGBUF); UCHAR *p, *q, *r, *script1; int i; FILE *fp; if (imgbuf0 == NULL) errend(1); /* out of memory */ /* スクリプト準備 */ q = script0; while ((p = *++argv) != NULL) { if (*p != '@') { r = ++q; while ((*q++ = *p++) != '\0') { if (q - script0 >= SIZ_SCRIPT - 4) errend(2); /* script too long */ } if (q - r > 255 + 1) errend(3); /* script too long */ *(r - 1) = (q - r) - 1; continue; } p++; fp = fopen(p, "rb"); if (fp == NULL) errend(4); /* script file open error */ i = fread(filebuf0, 1, SIZ_FILEBUF, fp); if (i >= SIZ_FILEBUF) errend(5); /* script file open error */ script1 = filebuf0 + i; p = filebuf0; for (;;) { while (p < script1 && *p <= ' ') p++; if (p >= script1) break; r = ++q; while (p < script1 && *p > ' ') { if (q - script0 >= SIZ_SCRIPT - 4) errend(6); /* script too long */ *q++ = *p++; } if (q - r > 255) errend(7); /* script too long */ *(r - 1) = q - r; *q++ = '\0'; } } *q++ = '\0'; script1 = q; /* スクリプト解釈 */ p = script0; for (;;) { if (*p == '\0') break; if (cmdmatch(p, "copy")) { p = (UCHAR *) cmd_copy(p); continue; } if (cmdmatch(p, "ovrcopy")) { p = (UCHAR *) cmd_ovrcopy(p); continue; } if (cmdmatch(p, "create")) { p = (UCHAR *) cmd_create(p); continue; } if (cmdmatch(p, "ovrcreate")) { p = (UCHAR *) cmd_ovrcreate(p); continue; } if (cmdmatch(p, "delete")) { p = (UCHAR *) cmd_delete(p); continue; } if (cmdmatch(p, "setattr")) { p = (UCHAR *) cmd_setattr(p); continue; } if (cmdmatch(p, "wbinimg")) { p = (UCHAR *) cmd_wbinimg(p); continue; } if (cmdmatch(p, "release")) { p = (UCHAR *) cmd_release(p); continue; } if (cmdmatch(p, "writedata")) { p = (UCHAR *) cmd_writedata(p); continue; } if (cmdmatch(p, "list")) { p = (UCHAR *) cmd_list(p); continue; } if (cmdmatch(p, "copyall")) { p = (UCHAR *) cmd_copyall(p); continue; } if (cmdmatch(p, "exe2bin")) { p = (UCHAR *) cmd_exe2bin(p); continue; } if (cmdmatch(p, "opt")) { p += *p + 2; continue; } if (optmatch(p, "imgin")) { p = (UCHAR *) opt_imgin(p); continue; } if (optmatch(p, "vsiz")) { p = (UCHAR *) opt_vsiz(p); continue; } if (optmatch(p, "imgout")) { p = (UCHAR *) opt_imgout(p); continue; } if (optmatch(p, "binin")) { p = (UCHAR *) opt_binin(p); continue; } if (optmatch(p, "binout")) { p = (UCHAR *) opt_binout(p); continue; } if (optmatch(p, "_path")) { p = (UCHAR *) opt_bpath(p); continue; } if (optmatch(p, "bias")) { p = (UCHAR *) opt_bias(p); continue; } if (cmdmatch(p, "/*")) { i = 1; do { p += *p + 2; if (*p == '\0') errend(9); /* comment nesting error */ if (cmdmatch(p, "/*")) i++; if (cmdmatch(p, "*/")) i--; } while (i > 0); p += *p + 2; continue; } fputs("script syntax error. : ", stderr); fputs(p + 1, stderr); errend(8); /* script syntax error */ } return 0; }
int main( void ) #endif { iu8 i, len, b; /* TODO: On error? */ hal_init(); /* Send ATR */ /* TODO: Possible from EEPROM? */ hal_io_sendByteT0( 0x3B ); #if CONF_WITH_LOGGING==1 log_init(); #endif resplen = 0; #if CONF_WITH_TRANSACTIONS==1 /* Commit transactions not yet done. */ /* TODO: On error? */ ta_commit(); #endif /* CONF_WITH_TRANSACTIONS */ /* Initialize FS state in RAM. */ /* TODO: On error? */ fs_init(); #if CONF_WITH_PINAUTH==1 /* Initialize authentication state. */ /* TODO: On error? */ auth_init(); #endif /* CONF_WITH_PINAUTH==1 */ if( !(hal_eeprom_read( &len, ATR_LEN_ADDR, 1 ) && (len<=ATR_MAXLEN)) ) for(;;) {} /* XXX good loop mechanism? what is it anyway */ for( i=1; i<len; i++ ) { if( !hal_eeprom_read( &b, ATR_ADDR+i, 1 ) ) for(;;) {} hal_io_sendByteT0( b ); } /* Command loop */ for(;;) { for( i=0; i<5; i++ ) { header[i] = hal_io_recByteT0(); } #if CONF_WITH_KEYAUTH==1 if( challvalidity ) challvalidity--; #endif /* CONF_WITH_KEYAUTH==1 */ #if CONF_WITH_TRNG==1 hal_rnd_addEntropy(); #endif /* CONF_WITH_TRNG==1 */ if( (header[0]&0xFC)==CLA_PROP ) { switch( header[1]&0xFE ) { #if CONF_WITH_TESTCMDS==1 case INS_WRITE: cmd_write(); break; case INS_READ: cmd_read(); break; #endif /* CONF_WITH_TESTCMDS==1 */ #if CONF_WITH_FUNNY==1 case INS_LED: cmd_led(); break; #endif /* CONF_WITH_FUNNY==1 */ #if CONF_WITH_PINCMDS==1 case INS_CHANGE_PIN: cmd_changeUnblockPIN(); break; #endif /* CONF_WITH_PINCMDS==1 */ #if CONF_WITH_CREATECMD==1 case INS_CREATE: cmd_create(); break; #endif /* CONF_WITH_CREATECMD==1 */ #if CONF_WITH_DELETECMD==1 case INS_DELETE: cmd_delete(); break; #endif /* CONF_WITH_DELETECMD==1 */ #if CONF_WITH_KEYCMDS==1 case INS_EXTERNAL_AUTH: cmd_extAuth(); break; #endif /* CONF_WITH_KEYCMDS==1 */ #if CONF_WITH_KEYCMDS==1 case INS_GET_CHALLENGE: cmd_getChallenge(); break; #endif /* CONF_WITH_KEYCMDS==1 */ case INS_GET_RESPONSE: cmd_getResponse(); break; #if CONF_WITH_KEYCMDS==1 case INS_INTERNAL_AUTH: cmd_intAuth(); break; #endif /* CONF_WITH_KEYCMDS==1 */ case INS_READ_BINARY: cmd_readBinary(); break; case INS_SELECT: cmd_select(); break; #if CONF_WITH_PINCMDS==1 case INS_UNBLOCK_PIN: cmd_changeUnblockPIN(); break; #endif /* CONF_WITH_PINCMDS==1 */ case INS_UPDATE_BINARY: cmd_updateBinary(); break; #if CONF_WITH_KEYCMDS==1 case INS_VERIFY_KEY: cmd_verifyKeyPIN(); break; #endif /* CONF_WITH_KEYCMDS==1 */ #if CONF_WITH_PINCMDS==1 case INS_VERIFY_PIN: cmd_verifyKeyPIN(); break; #endif /* CONF_WITH_PINCMDS==1 */ default: t0_sendWord( SW_WRONG_INS ); } } else { t0_sendWord( SW_WRONG_CLA ); } #if CONF_WITH_TRNG==1 hal_rnd_addEntropy(); #endif /* Return the SW in sw */ t0_sendSw(); } }