summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornrootconauto <nrootconauto@gmail.com>2022-10-21 11:47:18 -0400
committernrootconauto <nrootconauto@gmail.com>2022-10-21 11:47:18 -0400
commit9bfb79aa7734ada1a73e6738c60dfddc7006acba (patch)
tree23177ec166c1dbb3786a951390eeb13b2f8428cb
parent062a9d8629795418b8ccbb900b19c815b4a32bb3 (diff)
Exit3Days() fixed. poopalloc.c will return NULL on bad alloc.
DskStrA will return a dummy string if unable to construct a filename. Server will also find file if it has a ".Z" extension. Signed-off-by: nrootconauto <nrootconauto@gmail.com>
-rw-r--r--3d.h1
-rw-r--r--HCRT.BINbin1109344 -> 1109376 bytes
-rw-r--r--T/BlkDev2/DskStrA.HC2
-rw-r--r--T/HCRT.DBG.Zbin270431 -> 270366 bytes
-rw-r--r--T/Mem/MemPag.HC5
-rw-r--r--T/Server/gen_html.HC6
-rw-r--r--T/Server/utils.HC3
-rw-r--r--WIN_window.c2
-rw-r--r--main.c5
-rw-r--r--multic.c16
-rw-r--r--poopalloc.c3
11 files changed, 30 insertions, 13 deletions
diff --git a/3d.h b/3d.h
index 6330688..9082521 100644
--- a/3d.h
+++ b/3d.h
@@ -193,3 +193,4 @@ char **VFsDir(char *fn);
FILE *VFsFOpen(char *path,char*);
void VFsSetDrv(char d);
void *_3DaysSetResolution(int64_t w,int64_t h);
+extern int64_t _shutdown;
diff --git a/HCRT.BIN b/HCRT.BIN
index 8eb29f8..5349db1 100644
--- a/HCRT.BIN
+++ b/HCRT.BIN
Binary files differ
diff --git a/T/BlkDev2/DskStrA.HC b/T/BlkDev2/DskStrA.HC
index 1be49bc..57a7933 100644
--- a/T/BlkDev2/DskStrA.HC
+++ b/T/BlkDev2/DskStrA.HC
@@ -339,5 +339,7 @@ returns default.
}
Free(st);
Free(ext);
+ if(!dft) dft=DirNameAbs(dirname);
return dft;
}
+ \ No newline at end of file
diff --git a/T/HCRT.DBG.Z b/T/HCRT.DBG.Z
index 47a2fcc..8cb0016 100644
--- a/T/HCRT.DBG.Z
+++ b/T/HCRT.DBG.Z
Binary files differ
diff --git a/T/Mem/MemPag.HC b/T/Mem/MemPag.HC
index 49f7526..f99e592 100644
--- a/T/Mem/MemPag.HC
+++ b/T/Mem/MemPag.HC
@@ -82,7 +82,7 @@ U0 MemBlkCacheRemove(CBlkCache *cache,CMemBlk *blk) {
Bool IsValidPtr(U8 *ptr,I64 sz=1) {
"Use '-b' on 3d_loader to enable bounds-checker.\n";
throw('UseBC');
-};
+};
#endif
U8 *MemPagAlloc(I64 pags,CBlkPool *bp=NULL)
{/*Alloc pags from BlkPool. Don't link to task.
@@ -97,7 +97,8 @@ Return: NULL if out of memory.
PUSHFD
old=!Bts(&(Fs->task_flags),TASKf_BREAK_LOCKED);
res=NewVirtualChunk(pags<<MEM_PAG_BITS,!bp);
- ins:
+ if(!res) return NULL;
+ ins:
QueInit(res);
QueInit(&res->next2);
res->pags=pags;
diff --git a/T/Server/gen_html.HC b/T/Server/gen_html.HC
index 8eb119d..e503bec 100644
--- a/T/Server/gen_html.HC
+++ b/T/Server/gen_html.HC
@@ -6,7 +6,7 @@ U0 FileGet(CServer *srv,CDyadStream*stream,CURL *url,CHTTPRequest *req) {
U8 *link=ChrootFile(url->abs_path);
U8 *f,*mime,*dot=FileExtDot(link);
I64 len;
- if(dot&&FileFind(link)){
+ if(dot&&FileFind(link,,FUF_Z_OR_NOT_Z)){
if(!StrICmp(dot,".GIF")||!StrICmp(dot,".GIF.Z")) mime="image/gif";
else if(!StrICmp(dot,".JPEG")||!StrICmp(dot,".JPEG.Z")) mime="image/jpeg";
else if(!StrICmp(dot,".JPG")||!StrICmp(dot,".JPG.Z")) mime="image/jpg";
@@ -375,7 +375,7 @@ U0 WikiGet(CServer *srv,CDyadStream *stream,CURL *url,CHTTPRequest *req) {
QueInit(markup);
QueInit(headers);
cheader=headers;
- last=markup;
+ last=markup;
if(!StrLen(url->abs_path)||!StrCmp(url->abs_path,"/")) {
path=StrNew(WIKI_ROOT"/WikiHome");
//Copy into URL to "redirect"
@@ -387,7 +387,7 @@ U0 WikiGet(CServer *srv,CDyadStream *stream,CURL *url,CHTTPRequest *req) {
Free(path);
path=t1;
}
- if(FileFind(path)&&!IsDir(path)) {
+ if(FileFind(path,,FUF_Z_OR_NOT_Z)&&!IsDir(path)) {
//dummy write an index to compute its length
WriteLn(stream,,"HTTP/1.1 200 OK");
WriteLn(stream,,"Server: Bungis");
diff --git a/T/Server/utils.HC b/T/Server/utils.HC
index 0417bda..77ebd95 100644
--- a/T/Server/utils.HC
+++ b/T/Server/utils.HC
@@ -95,7 +95,8 @@ U8 *HTMLify(U8 *str) {
return r;
}
U8 *ChrootFile(U8 *fn,U8 *prefix=WIKI_ROOT) {
- U8 *virt=MStrPrint("/%s/%s",prefix,fn);
+ if(*fn=='/') fn++;
+ U8 *virt=MStrPrint("%s/%s",prefix,fn);
U8 *abs=FileNameAbs(virt),*abs2=FileNameAbs(prefix);
if(!StrNCmp(abs,abs2,StrLen(abs2))) {
Free(abs),Free(abs2);
diff --git a/WIN_window.c b/WIN_window.c
index 7e01e40..e289cca 100644
--- a/WIN_window.c
+++ b/WIN_window.c
@@ -464,6 +464,7 @@ LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
PAINTSTRUCT ps;
int64_t cx,cy;
RECT *lr;
+ if(_shutdown) goto kill;
switch(msg) {
case WM_SIZE:
case WM_SIZING:
@@ -501,6 +502,7 @@ LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
ReleaseMutex(mutex);
break;
case WM_DESTROY:
+kill:
PostQuitMessage(0);
return 0;
}
diff --git a/main.c b/main.c
index 7de0eac..2151358 100644
--- a/main.c
+++ b/main.c
@@ -73,7 +73,7 @@ static pthread_t core0;
static HANDLE core0;
#endif
static int is_cmd_line=0;
-static int64_t _shutdown=0;
+int64_t _shutdown=0;
int64_t IsCmdLine() {
return is_cmd_line;
}
@@ -230,6 +230,7 @@ int main(int argc,char **argv)
CLoader Loader;
void __Shutdown() {
_shutdown=1;
- __ShutdownCore(0);
+ __ShutdownCores();
+ exit(0);
}
char *cipher_passwd;
diff --git a/multic.c b/multic.c
index f37eb16..dbf8ed5 100644
--- a/multic.c
+++ b/multic.c
@@ -136,12 +136,20 @@ void __ShutdownCore(int core) {
pthread_kill(cores[core].thread,SIGUSR1);
pthread_join(cores[core].thread,NULL);
#else
- TerminateThread(cores[core].thread,0);
- WaitForMultipleObjects(1,&cores[core].thread,TRUE,INFINITE);
+ CONTEXT ctx;
+ SuspendThread(cores[core].thread);
+ GetThreadContext(cores[core].thread,&ctx);
+ ctx.Rip=&ExitCore;
+ SetThreadContext(cores[core].thread,&ctx);
+ ResumeThread(cores[core].thread);
+ WaitForSingleObject(cores[core].thread,INFINITE);
#endif
}
void __ShutdownCores() {
int c;
- for(c=0;c!=mp_cnt(NULL);c++)
- __ShutdownCore(c);
+ for(c=0;c<mp_cnt(NULL);c++) {
+ if(c!=__core_num)
+ __ShutdownCore(c);
+ }
+ __ShutdownCore(__core_num);
}
diff --git a/poopalloc.c b/poopalloc.c
index 1df671a..478a406 100644
--- a/poopalloc.c
+++ b/poopalloc.c
@@ -72,10 +72,11 @@ void *NewVirtualChunk(int64_t sz,int64_t low32) {
}
found:
fclose(map);
- return ret=mmap(down,sz/ps*ps+pad,PROT_EXEC|PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANON|MAP_FIXED|MAP_32BIT,-1,0);
+ ret=mmap(down,sz/ps*ps+pad,PROT_EXEC|PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANON|MAP_FIXED|MAP_32BIT,-1,0);
}
} else
ret=mmap(NULL,sz/ps*ps+pad,PROT_EXEC|PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANON,-1,0);
+ if(ret==MAP_FAILED) return NULL;
return ret;
#else
if(low32) {