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("/");
*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);
}
}
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)
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*/