uint16_t handle_StreamsCommand(TCF_Command* command, char* buf) { TCF_Streams_Command streams_cmd; /* Start building return message */ start_tcf_field(buf, (char *)TCF_S_R); /* Start */ append_tcf_field(buf, command->token); /* Token */ if (strcmp(command->commandName, Streams_Read) == 0) { /* C • <token> • Streams • read • <string: stream ID> • <int: size> • */ /* R • <token> • <string: data> • <error report> • <int: lost size> • <boolean: EOS> */ if(parse_read(command->arguments,&streams_cmd,command->args_len) != E_OK){ return 0; } /* Add data field */ mystrcat(buf, JSON_Stringify); int len = TCF_TTY_ReadString(tmp_stream, 199); if(len >= 200){ return 0; } tmp_stream[len] = '\0'; /* Terminate to be sure */ mystrcat(buf, tmp_stream); mystrcat(buf, JSON_Stringify); mystrcat(buf, TCF_S_EOFIELD_MARKER); /* Add error field */ mystrcat(buf, JSON_null); mystrcat(buf, TCF_S_EOFIELD_MARKER); //mystrcat(buf, Streams_LostSize); ultoa(0,tmp_stream,10); mystrcat(buf,tmp_stream); mystrcat(buf, TCF_S_EOFIELD_MARKER); //mystrcat(buf, Streams_EOS); mystrcat(buf, Streams_false); mystrcat(buf, TCF_S_EOFIELD_MARKER); } else if (strcmp(command->commandName, Streams_Write) == 0) { /* C • <token> • Streams • write • <string: stream ID> • <int: size> • <string: data> • */ /* R • <token> • <error report> */ if(parse_write(command->arguments,&streams_cmd,command->args_len) != E_OK){ return 0; } /* Add error field */ mystrcat(buf, JSON_null); mystrcat(buf, TCF_S_EOFIELD_MARKER); } else if (strcmp(command->commandName, Streams_Subscribe) == 0) { /* R • <token> • <error report> */ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){ return 0; } /* Add error field */ mystrcat(buf, JSON_null); mystrcat(buf, TCF_S_EOFIELD_MARKER); }else if (strcmp(command->commandName, Streams_Unsubscribe) == 0) { /* R • <token> • <error report> */ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){ return 0; } /* Add error field */ mystrcat(buf, JSON_null); mystrcat(buf, TCF_S_EOFIELD_MARKER); }else if (strcmp(command->commandName, Streams_Connect) == 0) { /* R • <token> • <error report> */ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){ return 0; } /* Add error field */ mystrcat(buf, JSON_null); mystrcat(buf, TCF_S_EOFIELD_MARKER); }else if (strcmp(command->commandName, Streams_Disconnect) == 0) { /* R • <token> • <error report> */ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){ return 0; } /* Add error field */ mystrcat(buf, JSON_null); mystrcat(buf, TCF_S_EOFIELD_MARKER); } convert_to_tcf_message(buf); uint16_t len = message_length(buf, TCF_MAX_FIELD_LENGTH); return len; }
int main(int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "[-] Error: usage: %s config_file\n", argv[0]); return EXIT_FAILURE; } char* filename = argv[1]; FILE* fp = fopen(filename, "r"); if (!fp) { fprintf(stderr, "[-] Error: failed to open file %s\n", filename); return EXIT_FAILURE; } /* File buffer */ char* buffer; int nbytes = 128; buffer = (char*)malloc(2048*sizeof(char)); /* Parsing vars */ int m_size; int p_id; int p_size; int r_page; int r_id; int w_page; int w_id; int e_id; init_process_table(); /* Main loop */ while ((getline(&buffer, (size_t*)&nbytes, fp) != -1)) { /* Todas as operações começam com letras diferentes */ switch(buffer[0]) { case 'M': /* MEMSIZE SIZE */ case 'm': parse_memsize(buffer, &m_size); printf("[+] MEMSIZE %d\n", m_size); memsize(m_size); break; case 'P': /* PROCSIZE ID SIZE */ case 'p': parse_procsize(buffer, &p_id, &p_size); printf("[+] PROCSIZE %d %d\n", p_id, p_size); procsize(p_id, p_size); break; case 'R': /* READ PAGE ID */ case 'r': parse_read(buffer, &r_page, &r_id); printf("[+] READ %d %d\n", r_page, r_id); read_p(r_page, r_id); break; case 'W': /* WRITE PAGE ID */ case 'w': parse_write(buffer, &w_page, &w_id); printf("[+] WRITE %d %d\n", w_page, w_id); write_p(w_page, w_id); break; case 'E': /* ENDPROC ID */ case 'e': parse_endproc(buffer, &e_id); printf("[+] ENDPROC %d\n", e_id); endproc(e_id); break; default: printf("[-] Invalid Operation!\n"); } } /* Write stats here */ write_stats(); fclose(fp); return EXIT_SUCCESS; }