zeek/auxil/libunistd/unistd/sigaction.cpp
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

119 lines
2.4 KiB
C++

// uni_signal.cpp
// Libunistd Copyright 2016 Robin.Rowe@CinePaint.org
// License open source MIT
#include <unistd.h>
#include <sigaction.h>
#ifdef __cplusplus
extern "C"
{
#endif
void (*CtrlCHandler)(int, struct siginfo_t *, void *) = 0;
BOOL WindowsCtrlCHandler(DWORD fdwCtrlType)
{ if(fdwCtrlType == CTRL_C_EVENT && CtrlCHandler != 0)
{ CtrlCHandler(SIGINT,nullptr,nullptr);
}
return true;
}
int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact)
{ if(!act && !oldact)
{ return -1;
}
if(SIGINT == signum)
{ if(act)
{ CtrlCHandler = act->sa_sigaction;
}
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) WindowsCtrlCHandler,TRUE);
return 0;
}
void (*sa_handler)(int);
if(!act)
{ sa_handler = signal(signum,SIG_IGN);
if(SIG_ERR==sa_handler)
{ return -1;
}
signal (signum,sa_handler);
oldact->sa_handler=sa_handler;
return 0;
}
sa_handler = signal(signum,act->sa_handler);
if(SIG_ERR==sa_handler)
{ return -1;
}
return 0;
}
int setenv(const char *name, const char *value, int overwrite)
{ if(!name || !value)
{ return -1;
}
#pragma warning(disable : 4996)
if(!overwrite)
{ char* p = getenv(name);
if(p)
{ return -1;
} }
const int bufsize = 256;
const size_t len = strlen(name) + 1 + strlen(value);
if(len+1 >= bufsize)
{ return -1;
}
char buf[bufsize];
buf[0] = 0;
strcat(buf,name);
strcat(buf,"=");
strcat(buf,value);
return _putenv(buf);
}
int unsetenv(const char *name)
{ const size_t len = strlen(name) + 1;
const int bufsize = 256;
if(len+1 >= bufsize)
{ return -1;
}
char buf[bufsize];
strcpy(buf,name);
strcat(buf,"=");
return _putenv(buf);
}
#pragma warning(default : 4996)
int truncate(const char *filename,off_t length)
{ //OFSTRUCT buffer;
//HANDLE h = OpenFileA(path, &buffer, OF_WRITE);
if(length)
{ HANDLE h = CreateFileA(filename, GENERIC_WRITE, 0, 0, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
CloseHandle(h);
}
HANDLE h = CreateFileA(filename, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
const DWORD p = SetFilePointer(h,length,0,FILE_BEGIN);
if(!p)
{ CloseHandle(h);
return -1;
}
const BOOL ok = SetEndOfFile(h);
CloseHandle((HANDLE)h);
return ok ? 0:-1;
}
#if 0
int ftruncate(int fd, off_t length)
{ intptr_t h = _get_osfhandle(fd);
const BOOL ok = SetEndOfFile((HANDLE)h);
return ok;
}
int ftruncate(int fd, off_t length)
{ return _chsize(fd, length);
}
#endif
#ifdef __cplusplus
}
#endif