#include "SharedMemory.h" #include #include #include #include #include key_t changedKey() { std::ofstream keyFile; keyFile.open("/tmp/vkvmKey.log", std::ofstream::out | std::ofstream::trunc); keyFile.clear(); int newKey; std::cout << "Type in a new Key for the Shared Memory Segment" << std::endl; std::cout << "new Key#"; std::cin >> newKey; std::cout << "New Key is -> " << newKey << std::endl; keyFile << newKey; keyFile.close(); return key_t(newKey); } std::string getAnswerFromUser() { std::cout << "answer# "; std::string answer; std::cin >> answer; if (answer == "y" || answer == "n" || answer == "override") { return answer; } std::cout << "wrong input: pls answer with (y) for yes, (n) for no, or (override)\n"; getAnswerFromUser(); return "-0"; } void initSharedMemory() { if (vkvm::impl.sharedMemoryKey != key_t(0)) { if (shmget(vkvm::impl.sharedMemoryKey, Max_Memory_Size, IPC_CREAT | IPC_EXCL | 0666) < 0) { std::cout << "Shared Memory with Key: " << vkvm::impl.sharedMemoryKey << " is already in use\n" << "You can change the Key( type -> y or n ), or you can override the shared memory Segment(type -> override)\n"; std::string answer = getAnswerFromUser(); if (answer == "y") { vkvm::impl.sharedMemoryKey = changedKey(); std::cout << "new Try with Key: " << vkvm::impl.sharedMemoryKey << std::endl; initSharedMemory(); } else if (answer == "n") { std::cout << "This will end shared memory" << std::endl; exit(0); } else if (answer == "override") { deleteSharedMemory(); initSharedMemory(); } } else { std::cout << "Shared Memory is (Re-) allocated with Key: " << vkvm::impl.sharedMemoryKey << std::endl; } } else { std::cerr << "key -> " << vkvm::impl.sharedMemoryKey << " is not allowed here " << std::endl; vkvm::impl.sharedMemoryKey = changedKey(); initSharedMemory(); } } void deleteSharedMemory() { int id = shmctl(shmget(vkvm::impl.sharedMemoryKey, 0, 0), IPC_RMID, 0); if (id < 0) { std::cerr << "Failed to remove shared Memory, maybe not existing: try cmd: ipcs " << std::endl; } else { int x =0; std::cout << "shared Memory deleted" << std::endl; } } void getConfig() { auto config = cpptoml::parse_file(configFile); int layoutVersion = config->get_as("layoutVersion").value_or(0); int width = config->get_as("width").value_or(0); int height = config->get_as("height").value_or(0); int mode = config->get_as("mode").value_or(0); int timerInterruptInterval = config->get_as("timerInterruptInterval").value_or(0); int backgroundColor = config->get_as("backgroundColor").value_or(0); int foregroundColor = config->get_as("foregroundColor").value_or(0); int charactersPerRow = config->get_as("charactersPerRow").value_or(0); int charactersPerColumn = config->get_as("charactersPerColumn").value_or(0); int font = config->get_as("font").value_or(0); int mousePositionX = config->get_as("mousePositionX").value_or(0); int mousePositionY = config->get_as("mousePositionY").value_or(0); /* //convert to hex std::string result; std::stringstream ss; ss << std::hex << result; ss >> result; */ vkvm::setLayoutVersion((vkvm::LayoutVersion) layoutVersion); vkvm::setWidth(width); vkvm::setHeight(height); vkvm::setMode((vkvm::GraphicMode) mode); vkvm::setTimerInterruptInterval(timerInterruptInterval); vkvm::setBackgroundColor(vkvm::Color(backgroundColor)); vkvm::setForegroundColor(vkvm::Color(foregroundColor)); vkvm::setCharactersPerRow(charactersPerRow); vkvm::setCharactersPerColumn(charactersPerColumn); vkvm::setFont(vkvm::FontType(font, "", 0, 0)); vkvm::setMousePosition(mousePositionX, mousePositionY); }