Browse Source

fix lock files for sessions in subdirs

tags/v1.6.0
Nils 3 years ago
parent
commit
7ceb38d1dd
1 changed files with 9 additions and 9 deletions
  1. +9
    -9
      src/nsmd.cpp

+ 9
- 9
src/nsmd.cpp View File

@@ -1258,14 +1258,15 @@ command_client_to_quit ( Client *c )
} }


char * char *
get_lock_file_name( const char * session_name )
get_lock_file_name( const char * session_name, const char * full_absolute_session_path )
{ {
char *session_root_hash = simple_hash( session_root ); // To avoid collisions of two nsmd running on different session_root with the same simple-named session.
// To avoid collisions of two simple session names under either different subdirs o even different session roots.
char *session_hash = simple_hash( full_absolute_session_path );


char *session_lock; char *session_lock;
asprintf( &session_lock, "%s/%s%s", lockfile_directory, session_name, session_root_hash ); //lockfile_directory and session_name are variables in the current context.
asprintf( &session_lock, "%s/%s%s", lockfile_directory, session_name, session_hash ); //lockfile_directory and session_name are variables in the current context.


free(session_root_hash);
free(session_hash);
return session_lock; return session_lock;
} }


@@ -1276,7 +1277,6 @@ write_lock_file( const char *filename, const char * session_path )
//Not a GNU lockfile, which features were never used by nsmd anyway, //Not a GNU lockfile, which features were never used by nsmd anyway,
//but simply a file with information about the NSM Server and the loaded session //but simply a file with information about the NSM Server and the loaded session
FILE *fp = fopen( filename, "w" ); FILE *fp = fopen( filename, "w" );

if ( !fp ) { if ( !fp ) {
FATAL( "Failed to write lock file to %s with error: %s", filename, strerror( errno ) ); FATAL( "Failed to write lock file to %s with error: %s", filename, strerror( errno ) );
} }
@@ -1316,7 +1316,7 @@ close_session ( )


if ( session_path ) if ( session_path )
{ {
char * session_lock = get_lock_file_name(session_name);
char * session_lock = get_lock_file_name( session_name, session_path);
delete_lock_file( session_lock ); delete_lock_file( session_lock );
MESSAGE( "Session %s was closed.", session_path ); MESSAGE( "Session %s was closed.", session_path );


@@ -1373,7 +1373,7 @@ load_session_file ( const char * path )
if ( session_path && session_name ) { if ( session_path && session_name ) {
//We are already in a session. This is switch, or load during duplicate etc. //We are already in a session. This is switch, or load during duplicate etc.
MESSAGE ( "Instructed to load %s while %s is still open. This is a normal operation. Attempting to switch clients intelligently, if they support it. Otherwise closing and re-opening.", path, session_path ); MESSAGE ( "Instructed to load %s while %s is still open. This is a normal operation. Attempting to switch clients intelligently, if they support it. Otherwise closing and re-opening.", path, session_path );
char * session_lock = get_lock_file_name(session_name);
char * session_lock = get_lock_file_name( session_name, session_path);
delete_lock_file( session_lock ); delete_lock_file( session_lock );
} }


@@ -1383,7 +1383,7 @@ load_session_file ( const char * path )
asprintf( &session_file, "%s/session.nsm", path ); asprintf( &session_file, "%s/session.nsm", path );


//Check if the lockfile already exists, which means another nsmd currently has loaded the session we want to load. //Check if the lockfile already exists, which means another nsmd currently has loaded the session we want to load.
char * session_lock = get_lock_file_name(session_name);
char * session_lock = get_lock_file_name( session_name, path );
struct stat st_lockfile_exists_check; struct stat st_lockfile_exists_check;
if ( stat (session_lock, &st_lockfile_exists_check) == 0) if ( stat (session_lock, &st_lockfile_exists_check) == 0)
{ {
@@ -1756,7 +1756,7 @@ OSC_HANDLER( new )


set_name( session_path ); set_name( session_path );


char * session_lock = get_lock_file_name(session_name);
char * session_lock = get_lock_file_name( session_name, session_path);
write_lock_file( session_lock, session_path ); write_lock_file( session_lock, session_path );
free ( session_lock ); free ( session_lock );




Loading…
Cancel
Save