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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.]
	}

> +		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



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux