⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 merovingian.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 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 + -