Пример #1
0
/**
 * Response message
 *
 * @param snum message code (1 - error, 2 - critical error, 3 - unknown command, 100 - okay)
 * @param sdesc text message
 * @param write
 */
void CommandsSession::response_msg(unsigned int snum, const char * sdesc, bool write)
{
    binn *write_binn = binn_list();
    binn_list_add_uint32(write_binn, snum);
    binn_list_add_str(write_binn, (char *)sdesc);

    m_write_msg = std::string(static_cast<char*>(binn_ptr(write_binn)), static_cast<uint>(binn_size(write_binn)));
}
Пример #2
0
static bool write_list(binn* parent, object_t* object) {
    for (size_t i = 0; i < object->l; ++i) {
        object_t* value = object->children + i;
        switch (value->type) {
            case type_nil:     if (!binn_list_add_null(parent))                        return false;  break;
            case type_bool:    if (!binn_list_add_bool(parent, (BOOL)value->b))        return false;  break;
            case type_double:  if (!binn_list_add_double(parent, value->d))            return false;  break;
            case type_int:     if (!binn_list_add_int64(parent, value->i))             return false;  break;
            case type_uint:    if (!binn_list_add_uint64(parent, value->u))            return false;  break;
            case type_str:     if (!binn_list_add_str(parent, CONST_CAST(value->str))) return false;  break;

            case type_array: {
                binn child;
                binn_create_list(&child);
                bool ok = write_list(&child, value);
                if (ok)
                    ok = binn_list_add_object(parent, &child);
                binn_free(&child);
                if (!ok)
                    return false;
            } break;

            case type_map: {
                binn child;
                binn_create_object(&child);
                bool ok = write_object(&child, value);
                if (ok)
                    ok = binn_list_add_object(parent, &child);
                binn_free(&child);
                if (!ok)
                    return false;
            } break;

            default:
                return false;
        }
    }
    return true;
}
Пример #3
0
/**
 * Main command operations
 */
void CommandsSession::cmd_process()
{
    binn *read_binn;
    read_binn = binn_open((void*)&m_read_msg[0]);

    unsigned char command;

    if (!binn_list_get_uint8(read_binn, 1, &command)) {
        response_msg(STATUS_ERROR, "Invalid Binn data: reading command failed", true);
        return;
    }

    switch (command) {
        case COMMAND_EXEC: {
            char * exec_command;
            char * work_dir;

            if (!binn_list_get_str(read_binn, 2, &exec_command)) {
                response_msg(STATUS_ERROR, "Invalid exec command", true);
                break;
            }

            if (!binn_list_get_str(read_binn, 3, &work_dir)) {
                response_msg(STATUS_ERROR, "Invalid work directory", true);
                break;
            }

            if (strlen(work_dir) == 0) {
                response_msg(STATUS_ERROR, "Empty work directory", true);
                break;
            }

            if (!fs::is_directory(work_dir)) {
                response_msg(STATUS_ERROR, "Invalid work directory", true);
                break;
            }

            fs::current_path(work_dir);

            std::cout << "Executing command: \"" << exec_command << "\"" << std::endl;
            std::string out;
            int exit_code = GameAP::exec(std::string(exec_command), out);

            binn *write_binn = binn_list();
            binn_list_add_uint32(write_binn, STATUS_OK);
            binn_list_add_int32(write_binn, exit_code);
            binn_list_add_str(write_binn, &out[0]);

            m_write_msg = std::string(static_cast<char*>(binn_ptr(write_binn)), static_cast<uint>(binn_size(write_binn)));

            break;
        };

        default: {
            std::cerr << "Unknown Command" << std::endl;
            response_msg(STATUS_UNKNOWN_COMMAND, "Unknown command", true);
            return;
        };
    }

    do_write();
}