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) {
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);
#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)));
#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;
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)