void * setupDbDump(void *param) { int writeFid = (intptr_t)param; afs_int32 code = 0; code = InitRPC(&dumpSyncPtr->ut, LOCKREAD, 1); if (code) goto error_exit; code = writeDatabase(dumpSyncPtr->ut, writeFid); if (code) LogError(code, "writeDatabase failed\n"); code = close(writeFid); if (code) LogError(code, "pipe writer close failed\n"); LogDebug(5, "writeDatabase complete\n"); error_exit: if (dumpSyncPtr->ut) ubik_EndTrans(dumpSyncPtr->ut); return (void *)(intptr_t)(code); }
int main(int argc, char *argv[]) { char *ifname, *odname, *ofname; ObjectDB odb; Image im; if (argc < 4) { fprintf(stderr, "usage: %s <input labeled image> <output database> <output image>", argv[0]); return 1; } ifname=argv[1]; odname=argv[2]; ofname=argv[3]; readImage(&im, ifname); makeODB(&odb, getColors(&im)); getObjects(&im, &odb); writeDatabase(&odb, odname); drawLines(&im, &odb); writeImage(&im, ofname); free(odb.objs); free(im.data); return 0; }
void KeePass2Writer::writeDatabase(const QString& filename, Database* db) { QFile file(filename); if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) { raiseError(file.errorString()); return; } writeDatabase(&file, db); }
int main(int argc, char **argv) { if (argc < 4) { printUsage(); return 1; } std::string database_filename = argv[1]; std::string image_dir = argv[2]; std::string command = argv[3]; std::vector<std::string> args; for(int i = 4; i < argc; ++i) args.push_back(argv[i]); PhotoDatabase db; loadDatabase(database_filename, db); db.setPhotoPrefixPath(image_dir); if (command == "gui") { unsigned int photo_idx_start = 0; if (args.size() > 0) photo_idx_start = atoi(args[0].c_str()); GUI gui(&db, photo_idx_start); gui.run(); } else if (command == "search") { search(db, args); } else if (command == "scan") { scan(db, image_dir); } else { std::cout << "Unknown command: " << command << std::endl; return 0; } writeDatabase(db, database_filename); return 0; }
void KeePass2XmlWriter::writeDatabase(const QString& filename, Database* db) { QFile file(filename); file.open(QIODevice::WriteOnly|QIODevice::Truncate); writeDatabase(&file, db); }
/** * Save the database to a file. * * This function uses QTemporaryFile instead of QSaveFile due to a bug * in Qt (https://bugreports.qt.io/browse/QTBUG-57299) that may prevent * the QSaveFile from renaming itself when using Dropbox, Drive, or OneDrive. * * The risk in using QTemporaryFile is that the rename function is not atomic * and may result in loss of data if there is a crash or power loss at the * wrong moment. * * @param filePath Absolute path of the file to save * @param atomic Use atomic file transactions * @param backup Backup the existing database file, if exists * @param error error message in case of failure * @return true on success */ bool Database::save(const QString& filePath, QString* error, bool atomic, bool backup) { Q_ASSERT(!m_data.isReadOnly); if (m_data.isReadOnly) { return false; } if (atomic) { QSaveFile saveFile(filePath); if (saveFile.open(QIODevice::WriteOnly)) { // write the database to the file if (!writeDatabase(&saveFile, error)) { return false; } if (backup) { backupDatabase(filePath); } if (saveFile.commit()) { // successfully saved database file setFilePath(filePath); return true; } } if (error) { *error = saveFile.errorString(); } } else { QTemporaryFile tempFile; if (tempFile.open()) { // write the database to the file if (!writeDatabase(&tempFile, error)) { return false; } tempFile.close(); // flush to disk if (backup) { backupDatabase(filePath); } // Delete the original db and move the temp file in place QFile::remove(filePath); // Note: call into the QFile rename instead of QTemporaryFile // due to an undocumented difference in how the function handles // errors. This prevents errors when saving across file systems. if (tempFile.QFile::rename(filePath)) { // successfully saved the database tempFile.setAutoRemove(false); setFilePath(filePath); return true; } else if (!backup || !restoreDatabase(filePath)) { // Failed to copy new database in place, and // failed to restore from backup or backups disabled tempFile.setAutoRemove(false); if (error) { *error = tr("%1\nBackup database located at %2").arg(tempFile.errorString(), tempFile.fileName()); } markAsModified(); return false; } } if (error) { *error = tempFile.errorString(); } } // Saving failed markAsModified(); return false; }
int main(int argc, char *argv[]) { static struct sockaddr_in ZERO_SOCKADDR; WSADATA w; struct sockaddr_in client, server = ZERO_SOCKADDR; SOCKADDR *c = (SOCKADDR *)&client; int cLen = (int)sizeof(struct sockaddr_in); int sd = 0; char *dbPath = NULL; unsigned short port = 0; User *head = NULL; char doLogin = FALSE; char doShutDown = FALSE; time_t currTime; int option = 0; char ipAddr[MAX_IP_LEN]; char initialized = FALSE; // Test for correct number of arguments if (argc != 3) { usage(); exit(0); } dbPath = argv[1]; port = atoi(argv[2]); // Validate port number if (!port || port < 256 || port > 65535) { fprintf(stderr, "Invalid port number.\n"); usage(); exit(0); } // Open and parse the database file head = readDatabase(dbPath); if (!head) DieWithError("Error reading database file.\n"); // Initialize Winsock if (WSAStartup(MAKEWORD(2, 0), &w)) DieWithError("WSAStartup() failed."); // Open a datagram socket sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sd == INVALID_SOCKET) DieWithError("Could not create socket.\n"); // Clear out server struct server = ZERO_SOCKADDR; // Set family, port, and address server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = htonl(INADDR_ANY); // Bind to the local address if (bind(sd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { closesocket(sd); DieWithError("bind() failed"); } printf("\nWaiting for connection...\n\n"); for (;;) // Run forever { char buffer[BUFFER_SIZE]; User *clientUser; // Shut down the server if the flag is set if (doShutDown == TRUE) break; // Wait for client to send initial packet to confirm connection if (!doLogin && recvDecrypt(sd, buffer, BUFFER_SIZE, c, &cLen) == SOCKET_ERROR) { fprintf(stderr, "recvfrom() failed.\n"); continue; } // Login on initial connection and if flag is set if(!strcmp(buffer, "connect") || doLogin) { // Get IP address if first transmission if (!initialized) { recvDecrypt(sd, buffer, BUFFER_SIZE, c, &cLen); sscanf(buffer, "%s", &ipAddr); } // Loop until successful login while (!(clientUser = login(sd, c, cLen, head, ipAddr))) sendEncrypt(sd, "\nInvalid credentials. Please try again.\n", BUFFER_SIZE, 0, c, cLen); initialized = TRUE; } // Display successful login currTime = time(NULL); printf("%.24s : %s %s has logged in from %s.\n", ctime(&currTime), clientUser->firstName, clientUser->lastName, clientUser->ipAddr); sprintf(buffer, "\n\nLogin successful. Welcome, %s %s!\n", clientUser->firstName, clientUser->lastName); sendEncrypt(sd, buffer, BUFFER_SIZE, 0, c, cLen); sprintf(buffer, "User type: %s\n", clientUser->userType == 'C' ? "Customer" : "Manager"); sendEncrypt(sd, buffer, BUFFER_SIZE, 0, c, cLen); if ((long long)clientUser->lastLogin > 0) sprintf(buffer, "Last login: %.24s\n", ctime(&clientUser->lastLogin)); else sprintf(buffer, "Last login: N/A\n"); sendEncrypt(sd, buffer, BUFFER_SIZE, 0, c, cLen); sprintf(buffer, "Last IP address: %s\n\n", clientUser->ipAddr); sendEncrypt(sd, buffer, BUFFER_SIZE, 0, c, cLen); // Set the last login time to the current time clientUser->lastLogin = currTime; // Initialize login flag doLogin = FALSE; while (doLogin == FALSE && doShutDown == FALSE) { // Print menu for correct user type switch(clientUser->userType) { case 'M': // Manager sendEncrypt(sd, "\nRequest Code\t Action\n\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "1\t\t Report balance of a selected customer\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "2\t\t Transfer money between two accounts\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "3\t\t Add a new customer to the system\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "4\t\t See the list of customers and their account information\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "5\t\t Report customer accounts sorted by balance\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "6\t\t See the total balance of all customers\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "7\t\t Shut down the server\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "8\t\t Logout\n", BUFFER_SIZE, 0, c, cLen); break; case 'C': // Customer sendEncrypt(sd, "Request Code\t Action\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "1\t\t Report balance of the customer\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "2\t\t Transfer money to another customer account\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "3\t\t Change password\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "4\t\t Logout\n", BUFFER_SIZE, 0, c, cLen); break; default: // Shouldn't reach here since it loops until successful login. break; } sendEncrypt(sd, "\nPlease enter a Request Code: ", BUFFER_SIZE, 0, c, cLen); sendDone(sd, c, cLen); // Blocking wait for menu option from client if(recvDecrypt(sd, buffer, BUFFER_SIZE, c, &cLen) == (BUFFER_SIZE+1)) { doLogin = TRUE; continue; } // Get user input if (sscanf(buffer, "%d", &option) != 1) option = -1; // Perform appropriate action if (clientUser->userType == 'M') // Manager { switch(option) { case 1: if(seeBalanceSelected(sd, c, cLen, head) == -1){ doLogin = TRUE;} break; case 2: if(transferBetweenAccounts(sd, c, cLen, head) == -1){ doLogin = TRUE;} break; case 3: if(addNewCustomer(sd, c, cLen, &head) == -1){ doLogin = TRUE;} break; case 4: listCustomers(sd, c, cLen, head); break; case 5: sortByBalance(sd, c, cLen, &head); listCustomers(sd, c, cLen, head); break; case 6: totalBalanceOfAll(sd, c, cLen, head); break; case 7: doShutDown = TRUE; break; // Sets flag to shut down server case 8: doLogin = TRUE; break; // Sets flag to loop back to login state default: sendEncrypt(sd, "\n\nInvalid input. Please enter a valid option.\n\n", BUFFER_SIZE, 0, c, cLen); break; } } else if (clientUser->userType == 'C') // Customer { switch(option) { case 1: seeUserBalance(sd, c, cLen, clientUser); break; case 2: if(transferToCustomer(sd, c, cLen, clientUser, head) == -1){ doLogin = TRUE;} break; case 3: if(changePassword(sd, c, cLen, clientUser) == -1){ doLogin = TRUE;} break; case 4: doLogin = TRUE; break; // Sets flag to loop back to login state default: sendEncrypt(sd, "\n\nInvalid input. Please enter a valid option.\n\n", BUFFER_SIZE, 0, c, cLen); break; } } else{} } // Reached when log out OR shut down flag is set to true sendEncrypt(sd, "\n\nLogging out.", BUFFER_SIZE, 0, c, cLen); currTime=time(NULL); printf("%.24s : %s %s has logged out.\n\n", ctime(&currTime), clientUser->firstName, clientUser->lastName); writeDatabase(dbPath, head); if (doShutDown == FALSE) sendEncrypt(sd, BORDER, BUFFER_SIZE, 0, c, cLen); } // Reached when shut down flag is set to true sendEncrypt(sd, BORDER, BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "\nThe server has shut down. Client is closing. Thank you.\n\n", BUFFER_SIZE, 0, c, cLen); sendEncrypt(sd, "close", BUFFER_SIZE, 0, c, cLen); // message to close the client printf("Server is shutting down by client request.\n\n"); }