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

📄 tclrrd.c

📁 rrdtool
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * tclrrd.c -- A TCL interpreter extension to access the RRD library. * * Copyright (c) 1999,2000 Frank Strauss, Technical University of Braunschweig. * * Thread-safe code copyright (c) 2005 Oleg Derevenetz, CenterTelecom Voronezh ISP. * * See the file "COPYING" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id: tclrrd.c 705 2005-10-24 20:55:03Z oetiker $ */#include <errno.h>#include <string.h>#include <time.h>#include <unistd.h>#include <tcl.h>#include <rrd_tool.h>#include <rrd_format.h>extern int Tclrrd_Init(Tcl_Interp *interp);extern int Tclrrd_SafeInit(Tcl_Interp *interp);/* * some rrd_XXX() and new thread-safe versions of Rrd_XXX() * functions might modify the argv strings passed to it. * Hence, we need to do some preparation before * calling the rrd library functions. */static char ** getopt_init(int argc, CONST84 char *argv[]){    char **argv2;    int i;        argv2 = calloc(argc, sizeof(char *));    for (i = 0; i < argc; i++) {	argv2[i] = strdup(argv[i]);    }    return argv2;}static void getopt_cleanup(int argc, char **argv2){    int i;        for (i = 0; i < argc; i++) {	if (argv2[i] != NULL) {	    free(argv2[i]);	}    }    free(argv2);}static void getopt_free_element(argv2, argn)    char *argv2[];    int  argn;{    if (argv2[argn] != NULL) {	free(argv2[argn]);	argv2[argn] = NULL;    }}static void getopt_squieeze(argc, argv2)    int  *argc;    char *argv2[];{    int i, null_i = 0, argc_tmp = *argc;    for (i = 0; i < argc_tmp; i++) {	if (argv2[i] == NULL) {	    (*argc)--;	} else {	    argv2[null_i++] = argv2[i];	}    }}/* Thread-safe version */static intRrd_Create(ClientData clientData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){    int				argv_i;    char			**argv2;    char			*parsetime_error = NULL;    time_t			last_up = time(NULL) - 10;    long int			long_tmp;    unsigned long int		pdp_step = 300;    struct rrd_time_value	last_up_tv;    argv2 = getopt_init(argc, argv);    for (argv_i = 1; argv_i < argc; argv_i++) {	if (!strcmp(argv2[argv_i], "--start") || !strcmp(argv2[argv_i], "-b")) {	    if (argv_i++>=argc) {		Tcl_AppendResult(interp, "RRD Error: option '",				 argv2[argv_i - 1], "' needs an argument", (char *) NULL);		getopt_cleanup(argc, argv2);		return TCL_ERROR;	    }	    if ((parsetime_error = parsetime(argv2[argv_i], &last_up_tv))) {		Tcl_AppendResult(interp, "RRD Error: invalid time format: '",				 argv2[argv_i], "'", (char *) NULL);		getopt_cleanup(argc, argv2);		return TCL_ERROR;	    }	    if (last_up_tv.type == RELATIVE_TO_END_TIME ||		last_up_tv.type == RELATIVE_TO_START_TIME) {		Tcl_AppendResult(interp, "RRD Error: specifying time relative to the 'start' ",				 "or 'end' makes no sense here", (char *) NULL);		getopt_cleanup(argc, argv2);		return TCL_ERROR;	    }	    last_up = mktime(&last_up_tv.tm) + last_up_tv.offset;	    if (last_up < 3600*24*365*10) {		Tcl_AppendResult(interp, "RRD Error: the first entry to the RRD should be after 1980",				 (char *) NULL);		getopt_cleanup(argc, argv2);		return TCL_ERROR;	    }	    getopt_free_element(argv2, argv_i - 1);	    getopt_free_element(argv2, argv_i);	} else if (!strcmp(argv2[argv_i], "--step") || !strcmp(argv2[argv_i], "-s")) {	    if (argv_i++>=argc) {		Tcl_AppendResult(interp, "RRD Error: option '",				 argv2[argv_i - 1], "' needs an argument", (char *) NULL);		getopt_cleanup(argc, argv2);		return TCL_ERROR;	    }	    long_tmp = atol(argv2[argv_i]);	    if (long_tmp < 1) {		Tcl_AppendResult(interp, "RRD Error: step size should be no less than one second",				 (char *) NULL);		getopt_cleanup(argc, argv2);		return TCL_ERROR;	    }	    pdp_step = long_tmp;	    getopt_free_element(argv2, argv_i - 1);	    getopt_free_element(argv2, argv_i);	} else if (!strcmp(argv2[argv_i], "--")) {	    getopt_free_element(argv2, argv_i);	    break;	} else if (argv2[argv_i][0]=='-') {	    Tcl_AppendResult(interp, "RRD Error: unknown option '",			     argv2[argv_i], "'", (char *) NULL);	    getopt_cleanup(argc, argv2);	    return TCL_ERROR;	}    }    getopt_squieeze(&argc, argv2);    if (argc < 2) {	Tcl_AppendResult(interp, "RRD Error: needs rrd filename",			 (char *) NULL);	getopt_cleanup(argc, argv2);	return TCL_ERROR;    }    rrd_create_r(argv2[1], pdp_step, last_up, argc - 2, argv2 + 2);    getopt_cleanup(argc, argv2);        if (rrd_test_error()) {	Tcl_AppendResult(interp, "RRD Error: ",			 rrd_get_error(), (char *) NULL);        rrd_clear_error();	return TCL_ERROR;    }    return TCL_OK;}/* Thread-safe version */static intRrd_Dump(ClientData clientData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){    if (argc < 2) {	Tcl_AppendResult(interp, "RRD Error: needs rrd filename",			 (char *) NULL);	return TCL_ERROR;    }    rrd_dump_r(argv[1]);    /* NOTE: rrd_dump() writes to stdout. No interaction with TCL. */    if (rrd_test_error()) {	Tcl_AppendResult(interp, "RRD Error: ",			 rrd_get_error(), (char *) NULL);        rrd_clear_error();	return TCL_ERROR;    }    return TCL_OK;}/* Thread-safe version */static intRrd_Last(ClientData clientData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){    time_t t;        if (argc < 2) {	Tcl_AppendResult(interp, "RRD Error: needs rrd filename",			 (char *) NULL);	return TCL_ERROR;    }    t = rrd_last_r(argv[1]);    if (rrd_test_error()) {	Tcl_AppendResult(interp, "RRD Error: ",			 rrd_get_error(), (char *) NULL);        rrd_clear_error();	return TCL_ERROR;    }    Tcl_SetIntObj(Tcl_GetObjResult(interp), t);    return TCL_OK;}/* Thread-safe version */static intRrd_Update(ClientData clientData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){    int		argv_i;    char	**argv2, *template = NULL;        argv2 = getopt_init(argc, argv);    for (argv_i = 1; argv_i < argc; argv_i++) {	if (!strcmp(argv2[argv_i], "--template") || !strcmp(argv2[argv_i], "-t")) {	    if (argv_i++>=argc) {		Tcl_AppendResult(interp, "RRD Error: option '",				 argv2[argv_i - 1], "' needs an argument", (char *) NULL);		if (template != NULL) {		    free(template);		}		getopt_cleanup(argc, argv2);		return TCL_ERROR;	    }	    if (template != NULL) {		free(template);	    }	    template = strdup(argv2[argv_i]);	    getopt_free_element(argv2, argv_i - 1);	    getopt_free_element(argv2, argv_i);	} else if (!strcmp(argv2[argv_i], "--")) {	    getopt_free_element(argv2, argv_i);	    break;	} else if (argv2[argv_i][0]=='-') {	    Tcl_AppendResult(interp, "RRD Error: unknown option '",			     argv2[argv_i], "'", (char *) NULL);	    if (template != NULL) {		free(template);	    }	    getopt_cleanup(argc, argv2);	    return TCL_ERROR;	}    }    getopt_squieeze(&argc, argv2);    if (argc < 2) {	Tcl_AppendResult(interp, "RRD Error: needs rrd filename",			 (char *) NULL);	if (template != NULL) {	    free(template);	}	getopt_cleanup(argc, argv2);	return TCL_ERROR;    }    rrd_update_r(argv2[1], template, argc - 2, argv2 + 2);    if (template != NULL) {	free(template);    }    getopt_cleanup(argc, argv2);    if (rrd_test_error()) {	Tcl_AppendResult(interp, "RRD Error: ",			 rrd_get_error(), (char *) NULL);        rrd_clear_error();	return TCL_ERROR;    }    return TCL_OK;}static intRrd_Fetch(ClientData clientData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){    time_t start, end, j;    unsigned long step, ds_cnt, i, ii;    rrd_value_t *data, *datai;    char **ds_namv;    Tcl_Obj *listPtr;    char s[30];    char **argv2;    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -