<short summary of the patch>
authorCamm Maguire <camm@debian.org>
Thu, 11 Aug 2022 17:16:42 +0000 (18:16 +0100)
committerCamm Maguire <camm@debian.org>
Thu, 11 Aug 2022 17:16:42 +0000 (18:16 +0100)
TODO: Put a short summary on the line above and replace this paragraph
with a longer explanation of this change. Complete the meta-information
with other relevant fields (see below for details). To make it easier, the
information below has been extracted from the changelog. Adjust it or drop
it.

gcl (2.6.12-90) unstable; urgency=medium

  * Version_2_6_13pre87
  * latest standards

Gbp-Pq: Name Version_2_6_13pre88

h/pool.h
h/protoize.h
o/unixfsys.c

index ec8fc227aa5af9a2720b15028fc0cd3e852ccdf6..4e650aa80333886c8a6bacbeeb4bd0048e2f7824 100644 (file)
--- a/h/pool.h
+++ b/h/pool.h
@@ -20,9 +20,8 @@ static struct pool {
   ufixnum s;
 } *Pool;
 
-static struct flock pl,*plp=&pl;
-
-static const char *gcl_pool="/tmp/gcl_pool";
+static struct flock f,pl,*plp=&pl;
+static char gcl_pool[PATH_MAX];
 
 static int
 set_lock(void) {
@@ -66,8 +65,8 @@ open_pool(void) {
 
   if (pool==-1) {
 
-    struct flock f;
-
+    massert(!home_namestring1("~",1,FN1,sizeof(FN1)));
+    massert(snprintf(gcl_pool,sizeof(gcl_pool),"%sgcl_pool",FN1)>=0);
     massert((pool=open(gcl_pool,O_CREAT|O_RDWR,0644))!=-1);
     massert(!ftruncate(pool,sizeof(struct pool)));
     massert((Pool=mmap(NULL,sizeof(struct pool),PROT_READ|PROT_WRITE,MAP_SHARED,pool,0))!=(void *)-1);
@@ -111,6 +110,9 @@ close_pool(void) {
 
 #ifndef NO_FILE_LOCKING
   if (pool!=-1) {
+    f.l_type=F_WRLCK;
+    if (!fcntl(pool,F_SETLK,&f))
+      massert(!unlink(gcl_pool));
     register_pool(-1);
     massert(!close(pool));
     massert(!munmap(Pool,sizeof(struct pool)));
index b402a5b2b7c7f93997d01feeff6c661819a354bf..ba12a5dddf5c8ced93dcb5fc4c4e75dbcccb528d 100644 (file)
@@ -1971,3 +1971,6 @@ travel_find_sharing(object,object);
 
 object
 new_cfdata(void);
+
+int
+home_namestring1(const char *,int,char *,int);
index 25f9275d2f8cdab3f178ee2e860f829dbfc8f0c3..69546a023b3535c66d65f5b8f5e149bd493ece1e 100755 (executable)
@@ -95,16 +95,20 @@ DEFUN_NEW("UID-TO-NAME",object,fSuid_to_name,SI,1,1,NONE,OI,OO,OO,OO,(fixnum uid
 #endif
 }
 
-DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") {
+int
+home_namestring1(const char *n,int s,char *o,int so) {
 
-#ifndef __MINGW32__
+  #ifndef __MINGW32__
   struct passwd *pwent,pw;
   long r;
 
+  massert(s>0);
+  massert(*n=='~');
+
   massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0);
   massert(r<=sizeof(GETPW_BUF));/*FIXME maybe once at image startup*/
 
-  if (nm->st.st_fillp==1)
+  if (s==1)
 
     if ((pw.pw_dir=getenv("HOME")))
       pwent=&pw;
@@ -113,26 +117,44 @@ DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(ob
 
   else {
 
-    massert(nm->st.st_fillp<sizeof(FN2));
-    memcpy(FN2,nm->st.st_self+1,nm->st.st_fillp-1);
-    FN2[nm->st.st_fillp-1]=0;
+    massert(s<sizeof(FN2));
+    memcpy(FN2,n+1,s-1);
+    FN2[s-1]=0;
 
     massert(!getpwnam_r(FN2,&pw,GETPW_BUF,r,&pwent) && pwent);
 
   }
 
-  massert((r=strlen(pwent->pw_dir))+2<sizeof(FN3));
-  memcpy(FN3,pwent->pw_dir,r);
-  FN3[r]='/';
-  FN3[r+1]=0;
-  RETURN1(make_simple_string(FN3));
+  massert((r=strlen(pwent->pw_dir))+2<so);
+  memcpy(o,pwent->pw_dir,r);
+  o[r]='/';
+  o[r+1]=0;
+  return 0;
 #else
-  massert(snprintf(FN1,sizeof(FN1)-1,"%s%s",getenv("SystemDrive"),getenv("HOMEPATH"))>=0);
-  RETURN1(make_simple_string(FN1));
+  massert(snprintf(o,so-1,"%s%s",getenv("SystemDrive"),getenv("HOMEPATH"))>=0);
+  return 0;
 #endif
 
 }
 
+
+DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") {
+
+  check_type_string(&nm);
+
+  massert(!home_namestring1(nm->st.st_self,nm->st.st_fillp,FN1,sizeof(FN1)));
+  RETURN1(make_simple_string(FN1));
+
+}
+#ifdef STATIC_FUNCTION_POINTERS
+object
+fShome_namestring(object x) {
+  return FFN(fShome_namestring)(x);
+}
+#endif
+
+
+
 #define FILE_EXISTS_P(a_,b_) !stat(a_,&b_) && S_ISREG(b_.st_mode)
 #define DIR_EXISTS_P(a_,b_) !stat(a_,&b_) && S_ISDIR(b_.st_mode)