Question about hdparm command line parsing

Tito farmatito at tiscali.it
Tue May 9 21:07:20 UTC 2006


Hi,
I've noticed that after applying the hdparm commandline arg parsing patch,
bb's hdparm behaviour differs a little from that of the real hdparm.
This is due to the use of getopt_long vs. hdparm's own black magic arg parsing.

From man 3 getopt:
 	If such  a  character is followed by a colon, the option requires an argu-
       ment, so getopt() places a pointer to the following text  in  the  same
       argv-element,  or  the  text  of the following argv-element, in optarg.
       Two colons mean an option takes an optional arg; if there  is  text  in
       the current argv-element, it is returned in optarg, otherwise optarg is
       set to zero. 

So there is a difference between args with ":" required args and "::" optional args i was unaware.

The program is still usable, but you have to specify carefully the commandline parameters.  
for options with optional args (maybe some scripts will break therefore...).

./busybox hdparm -u1d1 /dev/hda      doesn't work
./busybox hdparm -u 1 -d 1 /dev/hda  doesn't work
./busybox hdparm -u1 -d1 /dev/hda     works ok

I've tried to find a workaround to make bb's hdparm be more similar to the real
hdparm. 
Attached is a preliminary patch for review and comments by the list members.
I've tested it with all possible command line switch combinations i could think of,
but as i do some little hazardous stuff with argc, argv, optopt, optind, and optarg, i would like a little
help in testing from you. Try to make it segfault or do strange things ;-).
Maybe If the code is ok but the increase of size is to much it could  have its own
CONFIG_HDPARM_FANCY_ARG_PARSING to turn it off.

   text    data     bss     dec     hex filename
  23525     176     872   24573    5ffd miscutils/hdparm.o.old
   text    data     bss     dec     hex filename
  23710     176     904   24790    60d6 miscutils/hdparm.o.new

(BTW: a part of the size increase could be reduced by some minor optimisations,
I'm working on that are not included in this patch)

What I've tested so far is:
./busybox hdparm  -I /dev/hda    ok
./busybox hdparm  -i /dev/hda    ok
./busybox hdparm  -V /dev/hda  ok
./busybox hdparm  -d /dev/hda  ok
./busybox hdparm  -d /dev/hda /dev/hdb ok
./busybox hdparm  -d1 /dev/hda /dev/hdb ok
./busybox hdparm  -d 1 /dev/hda /dev/hdb ok
./busybox hdparm  -du /dev/hda /dev/hdb ok
./busybox hdparm  -d -u /dev/hda /dev/hdb  ok
./busybox hdparm  -d1u1 /dev/hda /dev/hdb ok
./busybox hdparm  -d1 -u1 /dev/hda /dev/hdb ok
./busybox hdparm  -d1 -u1 -R1 2 3 /dev/fd0 ok
./busybox hdparm  -d1 -u1 -R 1 2 3 /dev/fd0 ok
./busybox hdparm  -d1u1R 1 2 3 /dev/fd0 ok
./busybox hdparm  -d1u1R1 2 3 /dev/fd0
./busybox hdparm  -d1u1R12 3 /dev/fd0
./busybox hdparm -p pio1 /dev/fd0 ok
./busybox hdparm -ppio1 /dev/fd0 ok
./busybox hdparm -p1 /dev/fd0  ok
./busybox hdparm -p 1 /dev/fd0  ok

If you want there is also a script attached to run the tests
(the most dangerous ones................ that freezed my box are commented out)
 
Thanks in advance,

Ciao,
Tito
-------------- next part --------------
echo "------------------------------"
echo "busybox hdparm  -Istdin"
echo ""
cat /proc/ide/hda/identify | ./busybox hdparm  --Istdin
echo "------------------------------"
# Must show usage and exit and not loop forever
echo "busybox hdparm  -Istdin"
echo 
cat /proc/ide/hda/identify | ./busybox hdparm  -Istdin
echo "------------------------------"
echo "./busybox hdparm  -I /dev/hda"
echo 
./busybox hdparm  -I /dev/hda
echo "------------------------------"
echo "./busybox hdparm  -i /dev/hda"
echo
./busybox hdparm  -i /dev/hda
echo "------------------------------"
echo "./busybox hdparm  -V /dev/hda"
echo
./busybox hdparm  -V /dev/hda 
echo "------------------------------"
echo "./busybox hdparm  -d /dev/hda"
echo
./busybox hdparm  -d /dev/hda
echo "------------------------------"
echo "./busybox hdparm  -d /dev/hda /dev/hdb"
echo
./busybox hdparm  -d /dev/hda /dev/hdb
echo "------------------------------"
echo "./busybox hdparm  -d1 /dev/hda /dev/hdb"
echo
./busybox hdparm  -d1 /dev/hda /dev/hdb
echo "------------------------------"
echo "./busybox hdparm  -d 1 /dev/hda /dev/hdb" 
echo
./busybox hdparm  -d 1 /dev/hda /dev/hdb
echo "------------------------------"
echo "./busybox hdparm  -du /dev/hda /dev/hdb"
echo
./busybox hdparm  -du /dev/hda /dev/hdb
echo "------------------------------"
echo "./busybox hdparm  -d -u /dev/hda /dev/hdb"
echo
./busybox hdparm  -d -u /dev/hda /dev/hdb
echo "------------------------------"
echo "./busybox hdparm  -d1u1 /dev/hda /dev/hdb"
echo
./busybox hdparm  -d1u1 /dev/hda /dev/hdb
echo "------------------------------"
echo "./busybox hdparm  -d1 -u1 /dev/hda /dev/hdb"
echo
./busybox hdparm  -d1 -u1 /dev/hda /dev/hdb
echo "------------------------------"
#echo "./busybox hdparm  -d1 -u1 -R1 2 3 /dev/fd0"
#echo
#./busybox hdparm  -d1 -u1 -R1 2 3 /dev/fd0
#echo "------------------------------"
#echo "./busybox hdparm  -d1 -u1 -R 1 2 3 /dev/fd0"
#echo
#./busybox hdparm  -d1 -u1 -R 1 2 3 /dev/fd0
#echo "------------------------------"
#echo "./busybox hdparm  -d1u1R 1 2 3 /dev/fd0"
#echo
#./busybox hdparm  -d1u1R 1 2 3 /dev/fd0
#echo "------------------------------"
#echo "./busybox hdparm  -d1u1R1 2 3 /dev/fd0"
#echo
#./busybox hdparm  -d1u1R1 2 3 /dev/fd0
#echo "------------------------------"
# Must show usage
#echo "./busybox hdparm  -duR12 3 /dev/fd0"
#echo
#./busybox hdparm  -d1u1R12 3 /dev/fd0
#echo "------------------------------"
#./busybox hdparm -p pio1 /dev/fd0
#./busybox hdparm -ppio1 /dev/fd0
#./busybox hdparm -p1 /dev/fd0
#./busybox hdparm -p 1 /dev/fd0
-------------- next part --------------
A non-text attachment was scrubbed...
Name: hparm08.patch
Type: text/x-diff
Size: 431 bytes
Desc: not available
Url : http://lists.busybox.net/pipermail/busybox/attachments/20060509/e4faa886/attachment.bin 


More information about the busybox mailing list