[Nut-upsdev] drivers/bcmxcp.c portability issue

Kjell Claesson kjell.claesson at epost.tidanet.se
Tue Dec 15 07:27:30 UTC 2009


Hi Tim,
> I ran into a portability issue with drivers/bcmxcp.c in nut-2.4.1 on
> my UnixWare 7.1.4 machine. The error I get is
> .....
> UX:acomp: ERROR: "/opt/src/utils/nut-2.4.1/drivers/bcmxcp.c", line 835:
>  integral constant expression expected .....
> 
> Looking at the code we see
> .....
> int init_outlet(unsigned char len)
> {
>         unsigned char answer[len];
> .....
> 
> Although gcc can handle it, it's not portable C code.
> 
> What size should the answer array be?
> 

It depends on the ups.
In the upsdrv_initinfo parsing the ID Block you get the length of the outlet_block.
---------------------------------
	/* Size of outlet monitoring block */
	outlet_block_len = get_word(answer+iIndex);
	upsdebugx(2, "Length of outlet_block: %d\n", outlet_block_len);
	iIndex += 2;
---------------------------------
If this block is larger that 8 this indicate more than one outlet. So we go to
setup and read the outlet. Also add the commands.
---------------------------------
	/* Due to a bug in PW5115 firmware, we need to use blocklength > 8.
	The protocol state that outlet block is only implemented if there is
	at least 2 outlet block. 5115 has only one outlet, but has outlet block! */ 
	if (outlet_block_len > 8) {
		len = init_outlet(outlet_block_len);

		for(res = 1 ; res <= len ; res++) {
			snprintf(outlet_name, sizeof(outlet_name)-1, "outlet.%d.shutdown.return", res);
			dstate_addcmd(outlet_name);
		}
	}
---------------------------

So setting the length of the answer from the ID_block. So from 0 - 20 at the moment.
It would be possible to hardcode this len, and leave some space for 4 outlet.

Would be 2+6+6+6+6 = 26

Regards
Kjell





More information about the Nut-upsdev mailing list