* Pass various options to the worker so that flags like -K or -j work
in multi-user Nix (NIX-72). * Client/worker: exchange a protocol version number for future compatibility.
This commit is contained in:
		
							parent
							
								
									26f981c2e5
								
							
						
					
					
						commit
						f3441e6122
					
				
					 5 changed files with 49 additions and 7 deletions
				
			
		|  | @ -773,7 +773,6 @@ static Expr prim_listToAttrs(EvalState & state, const ATermVector & args) | |||
|       if (matchAttrs(evaledExpr, attrs)){ | ||||
|         Expr e = evalExpr(state, makeSelect(evaledExpr, toATerm("attr"))); | ||||
|         string attr = evalStringNoCtx(state,e); | ||||
|         ATerm value; | ||||
|         Expr r = makeSelect(evaledExpr, toATerm("value")); | ||||
|         res.set(toATerm(attr), makeAttrRHS(r, makeNoPos())); | ||||
|       } | ||||
|  | @ -783,7 +782,7 @@ static Expr prim_listToAttrs(EvalState & state, const ATermVector & args) | |||
|     } // for
 | ||||
|     return makeAttrs(res); | ||||
|   } catch (Error & e) { | ||||
|     e.addPrefix(format("while calling listToAttrs ")); | ||||
|     e.addPrefix(format("in `listToAttrs':\n")); | ||||
|     throw; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -53,18 +53,24 @@ RemoteStore::RemoteStore() | |||
|     from.fd = fdSocket; | ||||
|     to.fd = fdSocket; | ||||
| 
 | ||||
|      | ||||
|     /* Send the magic greeting, check for the reply. */ | ||||
|     try { | ||||
|         writeInt(WORKER_MAGIC_1, to); | ||||
|         writeInt(verbosity, to); | ||||
|         unsigned int magic = readInt(from); | ||||
|         if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch"); | ||||
| 
 | ||||
|         unsigned int daemonVersion = readInt(from); | ||||
|         if (GET_PROTOCOL_MAJOR(daemonVersion) != GET_PROTOCOL_MAJOR(PROTOCOL_VERSION)) | ||||
|             throw Error("Nix daemon protocol version not supported"); | ||||
|         writeInt(PROTOCOL_VERSION, to); | ||||
|         processStderr(); | ||||
| 
 | ||||
|     } catch (Error & e) { | ||||
|         throw Error(format("cannot start worker (%1%)") | ||||
|             % e.msg()); | ||||
|     } | ||||
| 
 | ||||
|     setOptions(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -154,6 +160,19 @@ RemoteStore::~RemoteStore() | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| void RemoteStore::setOptions() | ||||
| { | ||||
|     writeInt(wopSetOptions, to); | ||||
|     writeInt(keepFailed, to); | ||||
|     writeInt(keepGoing, to); | ||||
|     writeInt(tryFallback, to); | ||||
|     writeInt(verbosity, to); | ||||
|     writeInt(maxBuildJobs, to); | ||||
|     writeInt(maxSilentTime, to); | ||||
|     processStderr(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool RemoteStore::isValidPath(const Path & path) | ||||
| { | ||||
|     writeInt(wopIsValidPath, to); | ||||
|  |  | |||
|  | @ -77,6 +77,8 @@ private: | |||
|     void forkSlave(); | ||||
|      | ||||
|     void connectToDaemon(); | ||||
| 
 | ||||
|     void setOptions(); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,8 +5,11 @@ | |||
| namespace nix { | ||||
| 
 | ||||
| 
 | ||||
| #define WORKER_MAGIC_1 0x6e697864 | ||||
| #define WORKER_MAGIC_2 0x6478696e | ||||
| #define WORKER_MAGIC_1 0x6e697863 | ||||
| #define WORKER_MAGIC_2 0x6478696f | ||||
| 
 | ||||
| #define PROTOCOL_VERSION 0x101 | ||||
| #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) | ||||
| 
 | ||||
| 
 | ||||
| typedef enum { | ||||
|  | @ -28,6 +31,7 @@ typedef enum { | |||
|     wopExportPath, | ||||
|     wopImportPath, | ||||
|     wopQueryDeriver, | ||||
|     wopSetOptions, | ||||
| } WorkerOp; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -414,6 +414,19 @@ static void performOp(Source & from, Sink & to, unsigned int op) | |||
|          | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     case wopSetOptions: { | ||||
|         keepFailed = readInt(from) != 0; | ||||
|         keepGoing = readInt(from) != 0; | ||||
|         tryFallback = readInt(from) != 0; | ||||
|         verbosity = (Verbosity) readInt(from); | ||||
|         maxBuildJobs = readInt(from); | ||||
|         maxSilentTime = readInt(from); | ||||
|         startWork(); | ||||
|         stopWork(); | ||||
|         break; | ||||
|     } | ||||
|              | ||||
|              | ||||
|     default: | ||||
|         throw Error(format("invalid operation %1%") % op); | ||||
|  | @ -437,14 +450,19 @@ static void processConnection() | |||
|     /* Exchange the greeting. */ | ||||
|     unsigned int magic = readInt(from); | ||||
|     if (magic != WORKER_MAGIC_1) throw Error("protocol mismatch"); | ||||
|     verbosity = (Verbosity) readInt(from); | ||||
|     writeInt(WORKER_MAGIC_2, to); | ||||
| 
 | ||||
|     writeInt(PROTOCOL_VERSION, to); | ||||
|     unsigned int clientVersion = readInt(from); | ||||
| 
 | ||||
|     /* Send startup error messages to the client. */ | ||||
|     startWork(); | ||||
| 
 | ||||
|     try { | ||||
| 
 | ||||
|         /* If we can't accept clientVersion, then throw an error
 | ||||
|            *here* (not above). */ | ||||
| 
 | ||||
|         /* Prevent users from doing something very dangerous. */ | ||||
|         if (geteuid() == 0 && | ||||
|             querySetting("build-users-group", "") == "") | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue