Subject: bug#48960: stat v8.30 - device number in decimal shown as 16bit number instead of to converted 8bit

From: L A Walsh <[email-masked]>
Date: Fri, 11 Jun 2021 11:21:04 -0700

On 2021/06/11 00:37, Wolfgang Rohm wrote:
> Hello.
>
> Stat prints the device number, major and minor, in hex and decimal. 
> They are both 8bit numbers clamped together. While the hex number is 
> perfectly fine, the decimal doesn't respect how this number has come 
> to existence. There is no meaning in the decimal value, if the the hex 
> value is taken as one 16bit number and then converted.
>
> For example "fd00h" is converted to "64768d". There is no major device 
> with 647 and no minor device with 768. Its just completely wrong.
---
    Aside from complete bogus output on my system for either
hex or decimal and the "seemingly" undocumented appearance of 'd'
to convert a 16-bit decimal value back to 2 8-bit values
divide the number by 256 or shift the value right by 8 bits
for the high number and either mod the number with 256 or
'and' (&) the value with 0xff:

decimal_devno=64768   #(dropping the 'd' on the end)
high=$(($decimal_devno/256))
low=$(($decimal_devno%256))
printf "%s:%s\n" "$high" "$low"

  (output:)
253:0

  or via shifts+masks

decimal_devno=64768
high=$((decimal_devno>>8))
low=$((decimal_devno & 0xff))
printf "%s:%s\n" "$high" "$low"

  (output:)
253:0