static int parse_init(line_t *line, const char *in, char **outbuf, int *outlen) { (void) in; // silence (void) line; // silence *outlen = 3; *outbuf = mem_alloc_c(3, "init_reset_response_buffer"); (*outbuf)[0] = FS_RESET; (*outbuf)[1] = 0x03; (*outbuf)[2] = 0x7d; return 0; }
static int cmd_assign(int sockfd, int argc, const char *argv[]) { log_error("cmd_assign(sockfd=%d, argc=%d, argv[]=%s) - not yet implemented!\n", sockfd, argc, argc>0 ? argv[0] : "-"); char *buf = mem_alloc_c(4, "assign buffer"); mem_free(buf); return 0; }
// convenience int send_longcmd(int sockfd, uint8_t cmd, uint8_t fd, nameinfo_t *ninfo) { uint8_t *buf = mem_alloc_c(256, "longcmd buffer"); if (ninfo->drive == NAMEINFO_UNUSED_DRIVE) { // default drive ninfo->drive = 0; } uint8_t len = assemble_filename_packet(buf+FSP_DATA, ninfo); len += FSP_DATA; buf[FSP_CMD] = cmd; buf[FSP_FD] = fd; buf[FSP_LEN] = len; int rv = send_packet(sockfd, buf, len); mem_free(buf); return rv; }
static int cmd_info(int sockfd, int argc, const char *argv[]) { log_debug("cmd_info(sockfd=%d, argc=%d, argv[]=%s\n", sockfd, argc, argc>0 ? argv[0] : "-"); // send command uint8_t *buf = mem_alloc_c(256, "info buffer"); int rv = send_cmd(sockfd, FS_INFO, FSFD_CMD); if (rv >= 0) { rv = recv_packet(sockfd, buf, 256); if (rv < 0) { log_errno("Could not receive packet!\n"); exit(1); } log_info("Info: %s\n", buf+3); } mem_free(buf); return 0; }
/** * returns the status of the execution * 0 = normal end * 1 = expect mismatch */ int execute_script(int sockfd, registry_t *script) { // current "pc" pointer to script line int curpos = 0; line_t *line = NULL; int lineno = 0; int err = 0; ssize_t size = 0; line_t *errmsg = NULL; scriptlet_t *scr = NULL; while ( (err == 0) && (line = reg_get(script, curpos)) != NULL) { lineno = line->num; switch (line->cmd) { case CMD_COMMENT: if (!trace) { break; } // fall-through case CMD_MESSAGE: log_info("> %s\n", line->buffer); break; case CMD_ERRMSG: errmsg = line; break; case CMD_SEND: for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) { if (scr->exec != NULL) { scr->exec(line, scr); } } if (trace) { log_hexdump2(line->buffer, line->length, 0, "Send : "); } size = write(sockfd, line->buffer, line->length); if (size < 0) { log_errno("Error writing to socket at line %d\n", lineno); err = -1; } break; case CMD_EXPECT: line->mask = mem_alloc_c(line->length, "line_mask"); memset(line->mask, 0xff, line->length); for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) { if (scr->exec != NULL) { scr->exec(line, scr); } } err = compare_packet(sockfd, line->buffer, line->mask, line->length, lineno); mem_free(line->mask); line->mask = NULL; if (err != 0) { if (errmsg != NULL) { log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err); } return err; } break; case CMD_INIT: send_sync(sockfd); err = compare_packet(sockfd, line->buffer, NULL, line->length, lineno); if (err != 0) { if (errmsg != NULL) { log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err); } return err; } break; } curpos++; } return 0; }
/** * returns the status of the execution * 0 = normal end * 1 = expect mismatch */ int execute_script(int sockfd, int toolsfd, registry_t *script) { // current "pc" pointer to script line int curpos = 0; line_t *line = NULL; int lineno = 0; int err = 0; ssize_t size = 0; line_t *errmsg = NULL; scriptlet_t *scr = NULL; // guaranteed to be valid; toolsfd may be not set (<0) int curfd = sockfd; while ( (err == 0) && (line = reg_get(script, curpos)) != NULL) { lineno = line->num; switch (line->cmd) { case CMD_COMMENT: if (!trace) { break; } // fall-through case CMD_MESSAGE: log_info("> %s\n", line->buffer); break; case CMD_ERRMSG: errmsg = line; break; case CMD_SEND: for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) { if (scr->exec != NULL) { scr->exec(line, scr); } } if (trace) { log_hexdump2(line->buffer, line->length, 0, "Send : "); } size = write(curfd, line->buffer, line->length); if (size < 0) { log_errno("Error writing to socket at line %d\n", lineno); err = -1; } break; case CMD_EXPECT: line->mask = mem_alloc_c(line->length, "line_mask"); memset(line->mask, 0xff, line->length); for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) { if (scr->exec != NULL) { scr->exec(line, scr); } } err = compare_packet(curfd, line->buffer, line->mask, line->length, lineno); mem_free(line->mask); line->mask = NULL; if (err != 0) { if (errmsg != NULL) { log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err); } return 1; } break; case CMD_INIT: send_sync(curfd); err = compare_packet(curfd, line->buffer, NULL, line->length, lineno); if (err != 0) { if (errmsg != NULL) { log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err); } return 1; } break; case CMD_CHANNEL: if ((!strcmp("tools", line->buffer)) && toolsfd >= 0) { curfd = toolsfd; } else if ((!strcmp("device", line->buffer)) && sockfd >= 0) { curfd = sockfd; } else { log_error("> %d: -> unknown channel name %s\n", lineno, line->buffer); return 1; } break; } curpos++; } return 0; }