chiark / gitweb /
prefork-interp: add copyright licences
[chiark-utils.git] / cprogs / prefork.c
index 21c4b7af4e950ea90bcf4a7db00284817f3cdddd..b8f4c8a2b1834d8eeca8405eb56da798f4d39524 100644 (file)
@@ -1,13 +1,18 @@
 /* common stuff for cgi-fcgi-interp and prefork-interp */
+/*
+ * Copyright 2016-2022 Ian Jackson and contributors to chiark-utils
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ * There is NO WARRANTY.
+ */
 
 #include "prefork.h"
 
 const char *interp, *ident, *script, *socket_path, *lock_path;
 bool logging;
 struct sha256_ctx identsc;
+const char *run_base;
 
 static uid_t us;
-static const char *run_base;
 static const char *run_base_mkdir_p;
 
 void common_diee(const char *m) { diee("%s", m); }
@@ -55,19 +60,26 @@ void of_iassign(const struct cmdinfo *ci, const char *val) {
   *ci->iassignto = v;
 }
 
-void ident_addstring(const struct cmdinfo *ci, const char *string) {
-  /* ci may be 0 and is provided so this can be .call */
+void ident_add_key_byte(char key) {
+  sha256_update(&identsc,1,&key);
+}
+
+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_addstring('G', string);
+}
+
 void off_ident_addenv(const struct cmdinfo *ci, const char *name) {
+  ident_addstring('E', name);
   const char *val = getenv(name);
   if (val) {
-    sha256_update(&identsc,strlen(name),name); /* no nul */
-    sha256_update(&identsc,1,"=");
-    ident_addstring(0,val);
+    ident_addstring('v', val);
   } else {
-    ident_addstring(0,name);
+    ident_add_key_byte(0);
   }
 }
 
@@ -152,9 +164,9 @@ void find_socket_path(void) {
     unsigned char bbuf[32];
     int i;
 
-    ident_addstring(0,interp);
+    ident_addstring('i', interp);
     if (script)
-      ident_addstring(0,script);
+      ident_addstring('s', script);
     sha256_digest(&identsc,sizeof(bbuf),bbuf);
 
     for (i=0; i<identlen; i += 2)
@@ -184,14 +196,12 @@ void find_socket_path(void) {
 }  
 
 // Returns fd
-int acquire_lock(void) {
+int flock_file(const char *lock_path) {
   int r;
   int lockfd = -1;
   struct stat stab_fd;
   struct stat stab_path;
 
-  lock_path = m_asprintf("%s/l%s",run_base,ident);
-
   for (;;) {
     if (lockfd >= 0) { close(lockfd); lockfd = -1; }
 
@@ -216,6 +226,12 @@ int acquire_lock(void) {
   return lockfd;
 }
 
+// Returns fd
+int acquire_lock(void) {
+  lock_path = m_asprintf("%s/l%s",run_base,ident);
+  return flock_file(lock_path);
+}
+
 static void shbang_opts(const char *const **argv_io,
                        const struct cmdinfo *cmdinfos) {
   myopt(argv_io, cmdinfos);