📄 merovingian.c
字号:
#line 54 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/merovingian.mx"#include "mal_config.h"#include "merovingian.h"/*#include "mal_sabaoth.h"*/#include <stdlib.h> /* exit */#include <stdarg.h> /* variadic stuff */#include <stdio.h> /* fprintf */#include <sys/types.h>#include <unistd.h>#include <string.h> /* strdup, strerror */#include <errno.h>#ifdef _MSC_VER#include <process.h>#define snprintf _snprintf#define vsnprintf _vsnprintf#endiftypedef char* str;typedef char* err;#define freeErr(X) free(X)#define getErrMsg(X) X#define NO_ERR (err)0static size_t _merovingian_log_cnt = 0;/** * Tries to log the given string and formatting parameter stuff. This * function may decide how to log it, e.g. syslog, it's own logfile or * stderr. * * Currently this method just spits everything it gets to stderr. */static voidmerlog(str fmt, ...){ va_list ap; char message[4096]; int len; va_start(ap, fmt); len = snprintf(message, 4095, "[merovingian]:%lld ", (long long int)_merovingian_log_cnt++); len += vsnprintf(message + len, 4095 - len, fmt, ap); message[len] = '\0'; /* trim trailing newlines */ while (len > 0 && message[--len] == '\n') message[len] = '\0'; fprintf(stderr, "%s\n", message); va_end(ap);}static strnewErr(str fmt, ...){ va_list ap; char message[4096]; str ret; int len; va_start(ap, fmt); len = vsnprintf(message, 4095, fmt, ap); message[len] = '\0'; va_end(ap); ret = malloc(sizeof(char) * (len + 1)); memcpy(ret, message, len + 1); return(ret);}/** * Fork an Mserver and detach. The forked Mserver is not a child of * this process any more after this function. Hence, no client pid is * maintained or returned. */static errforkMserver(str database){#ifdef NATIVE_WIN32 intptr_t rv = 0; /*rv = _spawnv(_P_DETACH, ...); FIXME */ (void) database; if (rv == -1) { /* forking failed somehow */ return(newErr(strerror(errno))); } return(NO_ERR);#else pid_t pid; pid = fork(); if (pid == 0) { /* child: refork again, such that this child can die, and the * childchild becomes an orphan which init cares for */ pid = fork(); if (pid == 0) { /* ok, now exec that Mserver we want */ /*execv(.... mserver --dbname=%s, databse); FIXME */ merlog("todo: %s", database); return(NO_ERR); } else if (pid > 0) { /* we are the parent of the childchild, so let's die */ exit(0); } else { /* bleh... forking failed :( nothing we can do but log */ merlog("Forking sub-child failed, no Mserver spawned!"); exit(1); } } else if (pid > 0) { /* parent: fine, we're done */ return(NO_ERR); } /* forking failed somehow */ return(newErr(strerror(errno)));#endif}int main(int argc, char *argv[]) { merlog("Merovingian %s starting ...", MEROV_VERSION); if (argc > 1) { forkMserver(argv[1]); }}/* vim:set ts=4 sw=4 noexpandtab: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -