int s_open(IncomingRequest *inc_request) { FsResponse response; FsOpenC data_c = inc_request->request.data.open; int lock_result; int server_handler = data_c.server_handler; if (session_check_if_exist(server_handler) == -1) { response.answer= EC_SESSION_TIMED_OUT; response.data.open.status = -1; VDP1 ("Session timed out with: %d\n", server_handler); status = sendto(sockd, &response, sizeof(FsResponse), 0,(struct sockaddr*) &(inc_request->client_addr), inc_request->client_addr_len); return -1; } char *file_name = (char *) calloc(data_c.name_len, sizeof(char)); strncpy(file_name, data_c.name, data_c.name_len); VDP3("Incoming OPEN request: %s, len = %zu (flags: %d)\n", file_name, data_c.name_len, data_c.flags); if (inc_request->request.data.open.flags == O_RDONLY) lock_result = session_lock_file(inc_request->request.data.open.server_handler, file_name, FLOCK_SH); else lock_result = session_lock_file(inc_request->request.data.open.server_handler, file_name, FLOCK_EX); if(lock_result < 0) { /* Nie udalo sie dostac blokady na plik - trzeba powiadomic o tym klienta. */ VDP0("Lock failed, request turned down.\n"); response.data.open.status = -1; response.answer = EF_FILE_BLOCKED; } else { VDP0("Lock accepted, request accepted.\n"); VDP2("Attempting to open %s file in %d mode...\n", file_name, data_c.flags); int fh = open(file_name, data_c.flags); if(fh == -1) { VDP1("File %s cannot be opened.\n", file_name); session_unlock_file(inc_request->request.data.open.server_handler, lock_result); response.data.open.status = -1; response.answer = EF_NOT_FOUND; response.data.open.fd = -1; } else { VDP1("File %s opened successfully. \n", file_name); status = session_set(inc_request->request.data.open.server_handler, lock_result, fh); response.data.open.status = lock_result; response.answer = IF_OK; response.data.open.fd = lock_result; } } free(file_name); return sendto(sockd, &response, sizeof(FsResponse), 0,(struct sockaddr*) &(inc_request->client_addr), inc_request->client_addr_len); }
bool lock_session_dir(Display *display, const string& session, LockInfo& info) { info.pid = 0; string lock_file = session_lock_file(session); { std::ifstream is(lock_file.chars()); if (!is.bad()) { string version; is >> version; if (version.contains(DDD_NAME, 0)) { // Lock already exists -- use contents as diagnostics is >> info.hostname >> info.pid >> info.display >> info.uid >> info.username; if (info.username.empty()) { // DDD 3.0.90 and earlier do not save the user name info.username = itostring(info.uid); } if (info.hostname != fullhostname()) return false; // Process running on remote host if (info.pid > 0 && kill(info.pid, 0) == 0) return false; // Process running on host } }