[lm-sensors] [PATCH 8/8] sensord: Refactoring of rrdInit()

Andre Prendel andre.prendel at gmx.de
Mon May 11 10:32:10 CEST 2009


On Fri, May 08, 2009 at 04:54:06PM +0200, Jean Delvare wrote:
> On Mon, 6 Apr 2009 09:58:10 +0200, Andre Prendel wrote:
> > Refactoring of the rrdInit() function.
> > 
> > * Fix deep indentation levels
> > * Return with unique error code (-1)
> > ---
> > 
> > rrd.c |   85 ++++++++++++++++++++++++++++++------------------------------------
> >  1 file changed, 39 insertions(+), 46 deletions(-)
> > 
> > --- quilt-sensors.orig/prog/sensord/rrd.c	2009-04-04 20:40:28.000000000 +0200
> > +++ quilt-sensors/prog/sensord/rrd.c	2009-04-04 23:17:17.000000000 +0200
> > @@ -242,58 +242,51 @@
> >  
> >  int rrdInit(void)
> >  {
> > -	int ret = 0;
> > +	int ret;
> >  	struct stat tmp;
> > +	char stepBuff[STEP_BUFF], rraBuff[RRA_BUFF];
> > +	int argc = 4, num;
> > +	const char *argv[6 + MAX_RRD_SENSORS] = {
> > +		"sensord", sensord_args.rrdFile, "-s", stepBuff
> > +	};
> >  
> >  	sensorLog(LOG_DEBUG, "sensor RRD init");
> > -	if (stat(sensord_args.rrdFile, &tmp)) {
> > -		if (errno == ENOENT) {
> > -			char stepBuff[STEP_BUFF], rraBuff[RRA_BUFF];
> > -			int argc = 4, num;
> > -			const char *argv[6 + MAX_RRD_SENSORS] = {
> > -				"sensord", sensord_args.rrdFile, "-s", stepBuff
> > -			};
> > -
> > -			sensorLog(LOG_INFO, "creating round robin database");
> > -			num = rrdGetSensors(argv + argc);
> > -			if (num == 0) {
> > -				sensorLog(LOG_ERR,
> > -					  "Error creating RRD: %s: %s",
> > -					  sensord_args.rrdFile,
> > -					  "No sensors detected");
> > -				ret = 2;
> > -			} else if (num < 0) {
> > -				ret = -num;
> > -			} else {
> > -				sprintf(stepBuff, "%d", sensord_args.rrdTime);
> > -				sprintf(rraBuff, "RRA:%s:%f:%d:%d",
> > -					sensord_args.rrdNoAverage ? "LAST" :
> > -					"AVERAGE",
> > -					0.5 /* fraction of non-unknown samples needed per entry */,
> > -					1 /* samples per entry */,
> > -					7 * 24 * 60 * 60 /
> > -					sensord_args.rrdTime /* 1 week */);
> > -
> > -				argc += num;
> > -				argv[argc ++] = rraBuff;
> > -				argv[argc] = NULL;
> > -				if ((ret = rrd_create(argc,
> > -						      (char **) /* WEAK */ argv))) {
> > -					sensorLog(LOG_ERR,
> > -						  "Error creating RRD file: %s: %s",
> > -						  sensord_args.rrdFile,
> > -						  rrd_get_error());
> > -				}
> > -			}
> > -		} else {
> > -			sensorLog(LOG_ERR, "Error stat()ing RRD: %s: %s",
> > -				  sensord_args.rrdFile, strerror(errno));
> > -			ret = 1;
> > +
> > +	/* Create RRD if it does not exist. */
> > +	ret = stat(sensord_args.rrdFile, &tmp);
> > +	if (ret == -1 && errno != ENOENT) {
> > +		sensorLog(LOG_ERR, "Could not stat rrd file: %s\n",
> > +			  sensord_args.rrdFile);
> > +		return -1;
> > +	} else if (errno == ENOENT) {
> 
> "else" after a return statement isn't that useful ;)
> 
> But more importantly, ret may be != -1 at this point, in which case you
> have no guarantee that errno is up-to-date. It could carry an old error
> value. The original code did handle this properly... at the price of an
> additional level of indentation. Doesn't look unfeasible though:
> 
> 	if (stat(sensord_args.rrdFile, &tmp)) {
> 		if (errno != ENOENT) {
> 			sensorLog(LOG_ERR, "Error stat()ing RRD: %s: %s",
> 				  sensord_args.rrdFile, strerror(errno));
> 			return -1;		
> 		}
> 
> 		sensorLog(LOG_INFO, "Creating round robin database");
> 		[etc.]
> 	}
> 

You're right and I'm an idiot :) How to write stupid conditions :)
Will be fixed in v2.

> > +		sensorLog(LOG_INFO, "Creating round robin database");
> > +
> > +		num = rrdGetSensors(argv + argc);
> > +		if (num < 1) {
> > +			sensorLog(LOG_ERR, "Error creating RRD: %s: %s",
> > +				  sensord_args.rrdFile, "No sensors detected");
> > +			return -1;
> > +		}
> > +
> > +		sprintf(stepBuff, "%d", sensord_args.rrdTime);
> > +		sprintf(rraBuff, "RRA:%s:%f:%d:%d",
> > +			sensord_args.rrdNoAverage ? "LAST" :"AVERAGE",
> > +			0.5, 1, 7 * 24 * 60 * 60 / sensord_args.rrdTime);
> > +
> > +		argc += num;
> > +		argv[argc++] = rraBuff;
> > +		argv[argc] = NULL;
> > +
> > +		ret = rrd_create(argc, (char**) argv);
> > +		if (ret == -1) {
> > +			sensorLog(LOG_ERR, "Error creating RRD file: %s: %s",
> > +				  sensord_args.rrdFile, rrd_get_error());
> > +			return -1;
> >  		}
> >  	}
> > -	sensorLog(LOG_DEBUG, "sensor RRD inited");
> >  
> > -	return ret;
> > +	sensorLog(LOG_DEBUG, "sensor RRD initialized");
> > +	return 0;
> >  }
> >  
> >  #define RRDCGI "/usr/bin/rrdcgi"
> 
> Other than that, your cleanup look reasonable.
> 
> -- 
> Jean Delvare




More information about the lm-sensors mailing list