* sockaddr_un doesn't allow path names of more than 108 characters.
This isn't usually a problem, except that it causes tests to fail when performed in a directory with a very long path name. So chdir to the socket directory and use a relative path name.
This commit is contained in:
		
							parent
							
								
									f8985d195e
								
							
						
					
					
						commit
						72034ab35d
					
				
					 2 changed files with 26 additions and 6 deletions
				
			
		|  | @ -137,14 +137,26 @@ void RemoteStore::connectToDaemon() | ||||||
| 
 | 
 | ||||||
|     string socketPath = nixStateDir + DEFAULT_SOCKET_PATH; |     string socketPath = nixStateDir + DEFAULT_SOCKET_PATH; | ||||||
| 
 | 
 | ||||||
|  |     /* Urgh, sockaddr_un allows path names of only 108 characters.  So
 | ||||||
|  |        chdir to the socket directory so that we can pass a relative | ||||||
|  |        path name.  !!! this is probably a bad idea in multi-threaded | ||||||
|  |        applications... */ | ||||||
|  |     AutoCloseFD fdPrevDir = open(".", O_RDONLY); | ||||||
|  |     if (fdPrevDir == -1) throw SysError("couldn't open current directory"); | ||||||
|  |     chdir(dirOf(socketPath).c_str());  | ||||||
|  |     Path socketPathRel = "./" + baseNameOf(socketPath); | ||||||
|  |      | ||||||
|     struct sockaddr_un addr; |     struct sockaddr_un addr; | ||||||
|     addr.sun_family = AF_UNIX; |     addr.sun_family = AF_UNIX; | ||||||
|     if (socketPath.size() >= sizeof(addr.sun_path)) |     if (socketPathRel.size() >= sizeof(addr.sun_path)) | ||||||
|         throw Error(format("socket path `%1%' is too long") % socketPath); |         throw Error(format("socket path `%1%' is too long") % socketPathRel); | ||||||
|     strcpy(addr.sun_path, socketPath.c_str()); |     strcpy(addr.sun_path, socketPathRel.c_str()); | ||||||
|      |      | ||||||
|     if (connect(fdSocket, (struct sockaddr *) &addr, sizeof(addr)) == -1) |     if (connect(fdSocket, (struct sockaddr *) &addr, sizeof(addr)) == -1) | ||||||
|         throw SysError(format("cannot connect to daemon at `%1%'") % socketPath); |         throw SysError(format("cannot connect to daemon at `%1%'") % socketPath); | ||||||
|  | 
 | ||||||
|  |     if (fchdir(fdPrevDir) == -1) | ||||||
|  |         throw SysError("couldn't change back to previous directory"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -542,11 +542,17 @@ static void daemonLoop() | ||||||
| 
 | 
 | ||||||
|     createDirs(dirOf(socketPath)); |     createDirs(dirOf(socketPath)); | ||||||
| 
 | 
 | ||||||
|  |     /* Urgh, sockaddr_un allows path names of only 108 characters.  So
 | ||||||
|  |        chdir to the socket directory so that we can pass a relative | ||||||
|  |        path name. */ | ||||||
|  |     chdir(dirOf(socketPath).c_str()); | ||||||
|  |     Path socketPathRel = "./" + baseNameOf(socketPath); | ||||||
|  |      | ||||||
|     struct sockaddr_un addr; |     struct sockaddr_un addr; | ||||||
|     addr.sun_family = AF_UNIX; |     addr.sun_family = AF_UNIX; | ||||||
|     if (socketPath.size() >= sizeof(addr.sun_path)) |     if (socketPathRel.size() >= sizeof(addr.sun_path)) | ||||||
|         throw Error(format("socket path `%1%' is too long") % socketPath); |         throw Error(format("socket path `%1%' is too long") % socketPathRel); | ||||||
|     strcpy(addr.sun_path, socketPath.c_str()); |     strcpy(addr.sun_path, socketPathRel.c_str()); | ||||||
| 
 | 
 | ||||||
|     unlink(socketPath.c_str()); |     unlink(socketPath.c_str()); | ||||||
| 
 | 
 | ||||||
|  | @ -559,6 +565,8 @@ static void daemonLoop() | ||||||
|     if (res == -1) |     if (res == -1) | ||||||
|         throw SysError(format("cannot bind to socket `%1%'") % socketPath); |         throw SysError(format("cannot bind to socket `%1%'") % socketPath); | ||||||
| 
 | 
 | ||||||
|  |     chdir("/"); /* back to the root */ | ||||||
|  | 
 | ||||||
|     if (listen(fdSocket, 5) == -1) |     if (listen(fdSocket, 5) == -1) | ||||||
|         throw SysError(format("cannot listen on socket `%1%'") % socketPath); |         throw SysError(format("cannot listen on socket `%1%'") % socketPath); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue