chiark / gitweb /
prefork-interp: ident
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 15:15:32 +0000 (16:15 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 20:21:10 +0000 (21:21 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
cprogs/prefork-interp.c
cprogs/prefork.c
cprogs/prefork.h

index 61dcca93bf370a578bcd5a72cc5c4ad7b12c3360..fe02827c1d67466d325e801572efbc7932eeb144 100644 (file)
@@ -426,21 +426,19 @@ static void ident_add_stat(const char *path) {
   int r = stat(path, &stab);
   if (r) diee("failed to stat %s", path);
 
-  IDENT_ADD_OBJ(stab.st_dev);
-  IDENT_ADD_OBJ(stab.st_ino);
+  IDENT_ADD_OBJ(path[0], stab.st_dev);
+  IDENT_ADD_OBJ('i',     stab.st_ino);
 }
 
 void ident_addinit(void) {
-  char magic = 1;
-
-  IDENT_ADD_OBJ(magic);
+  ident_add_key_byte(1);
 
   struct utsname uts = { };
   size_t utslen = sizeof(uts);
   int r = uname(&uts);
   if (r) diee("uname failed!");
-  IDENT_ADD_OBJ(utslen);
-  IDENT_ADD_OBJ(uts);
+  IDENT_ADD_OBJ('u', utslen);
+  IDENT_ADD_OBJ('u', uts);
 
   ident_add_stat(".");
   ident_add_stat("/");
index eca03c85f5177e39a37033162958d612595f2a4a..e82fb11a0b89dbfee37328afcb9a30f61fc9fadc 100644 (file)
@@ -55,28 +55,26 @@ void of_iassign(const struct cmdinfo *ci, const char *val) {
   *ci->iassignto = v;
 }
 
-static void ident_addbyte(char c) {
-  IDENT_ADD_OBJ(c);
+void ident_add_key_byte(char key) {
+  sha256_update(&identsc,1,&key);
 }
 
-void ident_addstring(const char *string) {
+void ident_addstring(char key, const char *string) {
+  ident_add_key_byte(key);
   sha256_update(&identsc,strlen(string)+1,string);
 }
 
 void off_ident_addstring(const struct cmdinfo *ci, const char *string) {
-  ident_addbyte('S');
-  ident_addstring(string);
+  ident_addstring('G', string);
 }
 
 void off_ident_addenv(const struct cmdinfo *ci, const char *name) {
+  ident_addstring('E', name);
   const char *val = getenv(name);
-  ident_addbyte('E');
   if (val) {
-    sha256_update(&identsc,strlen(name),name); /* no nul */
-    sha256_update(&identsc,1,"=");
-    ident_addstring(val);
+    ident_addstring('v', val);
   } else {
-    ident_addstring(name);
+    ident_add_key_byte(0);
   }
 }
 
@@ -161,9 +159,9 @@ void find_socket_path(void) {
     unsigned char bbuf[32];
     int i;
 
-    ident_addstring(interp);
+    ident_addstring('i', interp);
     if (script)
-      ident_addstring(script);
+      ident_addstring('s', script);
     sha256_digest(&identsc,sizeof(bbuf),bbuf);
 
     for (i=0; i<identlen; i += 2)
index eef6b2ca367d3700a90b3497faa41b1e5de7aeca..34e74b518e2b0f863681b282631718d9f6c1cf73 100644 (file)
@@ -83,13 +83,18 @@ void fusagemessage(FILE *f);
 void usagemessage(void);
 void of_help(const struct cmdinfo *ci, const char *val);
 void of_iassign(const struct cmdinfo *ci, const char *val);
-void ident_addstring(const char *string);
-void off_ident_addstring(const struct cmdinfo *ci, const char *name);
-void off_ident_addenv(const struct cmdinfo *ci, const char *name);
 void ident_addinit(void);
 bool stabs_same_inode(struct stat *a, struct stat *b);
+void ident_addstring(char key, const char *string);
+
+void off_ident_addstring(const struct cmdinfo *ci, const char *name);
+void off_ident_addenv(const struct cmdinfo *ci, const char *name);
+
+void ident_add_key_byte(char key);
 
-#define IDENT_ADD_OBJ(obj) \
-  sha256_update(&identsc, sizeof((obj)), (void*)&obj);
+#define IDENT_ADD_OBJ(key, obj) do{                            \
+    ident_add_key_byte(key);                                   \
+    sha256_update(&identsc, sizeof((obj)), (void*)&obj);       \
+  }while(0)
 
 #endif /*PREFORK_H*/