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