Beispiel #1
0
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);
}
Beispiel #2
0
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
	    }
	}