aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--miscutils/hdparm.c63
1 files changed, 32 insertions, 31 deletions
diff --git a/miscutils/hdparm.c b/miscutils/hdparm.c
index d0ea6135e..006dc0d49 100644
--- a/miscutils/hdparm.c
+++ b/miscutils/hdparm.c
@@ -544,20 +544,21 @@ static void sync_and_sleep(int i)
544 sleep(i); 544 sleep(i);
545} 545}
546 546
547static void check_if_min_and_set_val(uint16_t a, uint16_t b) 547static uint16_t check_if_min_and_set_val(uint16_t a, uint16_t b)
548{ 548{
549 if( a < b) 549 if( a < b)
550 a = b; 550 a = b;
551 return a;
551} 552}
552 553
553static void check_if_maj_and_set_val(uint16_t a, uint16_t b) 554static uint16_t check_if_maj_and_set_val(uint16_t a, uint16_t b)
554{ 555{
555 if( a > b) 556 if( a > b)
556 a = b; 557 a = b;
558 return a;
557} 559}
558 560
559static 561static unsigned long int set_flag(char *p, char max)
560unsigned long int set_flag(char *p, char max)
561{ 562{
562 if (*p >= '0' && *p <= max ) 563 if (*p >= '0' && *p <= max )
563 return 1; 564 return 1;
@@ -728,7 +729,7 @@ static void identify (uint16_t *id_supplied, const char *devname)
728 { 729 {
729 if(val[MINOR] && (val[MINOR] <= MINOR_MAX)) 730 if(val[MINOR] && (val[MINOR] <= MINOR_MAX))
730 { 731 {
731 check_if_min_and_set_val( like_std, 3); 732 like_std=check_if_min_and_set_val(like_std, 3);
732 std = actual_ver[val[MINOR]]; 733 std = actual_ver[val[MINOR]];
733 if_printf(std,"\n\tUsed: %s ",minor_str[val[MINOR]]); 734 if_printf(std,"\n\tUsed: %s ",minor_str[val[MINOR]]);
734 735
@@ -751,17 +752,17 @@ static void identify (uint16_t *id_supplied, const char *devname)
751 like_std = ii; 752 like_std = ii;
752 kk = like_std >4 ? like_std-4: 0; 753 kk = like_std >4 ? like_std-4: 0;
753 } 754 }
754 check_if_maj_and_set_val(min_std, ii); 755 min_std=check_if_maj_and_set_val(min_std, ii);
755 } 756 }
756 jj <<= 1; 757 jj <<= 1;
757 } 758 }
758 check_if_min_and_set_val( like_std, 3); 759 like_std=check_if_min_and_set_val(like_std, 3);
759 } 760 }
760 /* Figure out what standard the device is using if it hasn't told 761 /* Figure out what standard the device is using if it hasn't told
761 * us. If we know the std, check if the device is using any of 762 * us. If we know the std, check if the device is using any of
762 * the words from the next level up. It happens. 763 * the words from the next level up. It happens.
763 */ 764 */
764 check_if_min_and_set_val( like_std, std); 765 like_std=check_if_min_and_set_val(like_std, std);
765 766
766 if(((std == 5) || (!std && (like_std < 6))) && 767 if(((std == 5) || (!std && (like_std < 6))) &&
767 ((((val[CMDS_SUPP_1] & VALID) == VALID_VAL) && 768 ((((val[CMDS_SUPP_1] & VALID) == VALID_VAL) &&
@@ -2104,8 +2105,8 @@ static void process_dev (char *devname)
2104 { 2105 {
2105 unsigned char args[4] = {WIN_SETFEATURES,0,0,0}; 2106 unsigned char args[4] = {WIN_SETFEATURES,0,0,0};
2106 no_scsi(); 2107 no_scsi();
2107 check_if_min_and_set_val(apmmode,1); 2108 apmmode=check_if_min_and_set_val(apmmode,1);
2108 check_if_maj_and_set_val(apmmode,255); 2109 apmmode=check_if_maj_and_set_val(apmmode,255);
2109 if_printf(get_apmmode," setting APM level to"); 2110 if_printf(get_apmmode," setting APM level to");
2110 if (apmmode==255) 2111 if (apmmode==255)
2111 { 2112 {
@@ -2521,12 +2522,16 @@ static int identify_from_stdin (void)
2521} 2522}
2522#endif 2523#endif
2523 2524
2525static void missing_arg(int arg, char c, char* add)
2526{
2527 if (!arg)
2528 bb_error_msg("-%c: missing value %s", c, (add!=NULL)? add :"");
2529}
2530
2524/* our main() routine: */ 2531/* our main() routine: */
2525int hdparm_main(int argc, char **argv) 2532int hdparm_main(int argc, char **argv)
2526{ 2533{
2527 const char * const bb_msg_missing_value ="missing value";
2528 char c, *p; 2534 char c, *p;
2529 /*int neg;*/
2530 2535
2531 ++argv; 2536 ++argv;
2532 if (!--argc) 2537 if (!--argc)
@@ -2638,8 +2643,7 @@ int hdparm_main(int argc, char **argv)
2638 if (!*p && argc && isalnum(**argv)) 2643 if (!*p && argc && isalnum(**argv))
2639 p = *argv++, --argc; 2644 p = *argv++, --argc;
2640 p=GET_NUMBER(p,&set_standby,&standby_requested); 2645 p=GET_NUMBER(p,&set_standby,&standby_requested);
2641 if (!set_standby) 2646 missing_arg(set_standby, c, NULL);
2642 bb_error_msg("-S: %s", bb_msg_missing_value);
2643 break; 2647 break;
2644 2648
2645 case 'D': 2649 case 'D':
@@ -2648,8 +2652,7 @@ int hdparm_main(int argc, char **argv)
2648 if (!*p && argc && isalnum(**argv)) 2652 if (!*p && argc && isalnum(**argv))
2649 p = *argv++, --argc; 2653 p = *argv++, --argc;
2650 p=GET_NUMBER(p,&set_defects,&defects); 2654 p=GET_NUMBER(p,&set_defects,&defects);
2651 if (!set_defects) 2655 missing_arg(set_defects, c, NULL);
2652 bb_error_msg("-D: %s", bb_msg_missing_value);
2653 break; 2656 break;
2654 case 'P': 2657 case 'P':
2655 get_prefetch = noisy; 2658 get_prefetch = noisy;
@@ -2657,8 +2660,7 @@ int hdparm_main(int argc, char **argv)
2657 if (!*p && argc && isalnum(**argv)) 2660 if (!*p && argc && isalnum(**argv))
2658 p = *argv++, --argc; 2661 p = *argv++, --argc;
2659 p=GET_NUMBER(p,&set_prefetch,&prefetch); 2662 p=GET_NUMBER(p,&set_prefetch,&prefetch);
2660 if (!set_prefetch) 2663 missing_arg(set_prefetch, c, NULL);
2661 bb_error_msg("-P: %s", bb_msg_missing_value);
2662 break; 2664 break;
2663 2665
2664 case 'X': 2666 case 'X':
@@ -2667,8 +2669,7 @@ int hdparm_main(int argc, char **argv)
2667 if (!*p && argc && isalnum(**argv)) 2669 if (!*p && argc && isalnum(**argv))
2668 p = *argv++, --argc; 2670 p = *argv++, --argc;
2669 p=GET_STRING(p,&set_xfermode,&xfermode_requested); 2671 p=GET_STRING(p,&set_xfermode,&xfermode_requested);
2670 if (!set_xfermode) 2672 missing_arg(set_xfermode, c, NULL);
2671 bb_error_msg("-X: %s", bb_msg_missing_value);
2672 break; 2673 break;
2673 2674
2674 case 'K': 2675 case 'K':
@@ -2679,7 +2680,7 @@ int hdparm_main(int argc, char **argv)
2679 if((set_dkeep = set_flag(p,'1'))==1) 2680 if((set_dkeep = set_flag(p,'1'))==1)
2680 dkeep = *p++ - '0'; 2681 dkeep = *p++ - '0';
2681 else 2682 else
2682 bb_error_msg("-K: %s (0/1)", bb_msg_missing_value); 2683 goto missing_arg_error;
2683 break; 2684 break;
2684 2685
2685 case 'A': 2686 case 'A':
@@ -2690,7 +2691,7 @@ int hdparm_main(int argc, char **argv)
2690 if((set_lookahead = set_flag(p,'1'))==1) 2691 if((set_lookahead = set_flag(p,'1'))==1)
2691 lookahead = *p++ - '0'; 2692 lookahead = *p++ - '0';
2692 else 2693 else
2693 bb_error_msg("-A: %s (0/1)", bb_msg_missing_value); 2694 goto missing_arg_error;
2694 break; 2695 break;
2695 2696
2696 case 'L': 2697 case 'L':
@@ -2701,7 +2702,7 @@ int hdparm_main(int argc, char **argv)
2701 if((set_doorlock = set_flag(p,'1'))==1) 2702 if((set_doorlock = set_flag(p,'1'))==1)
2702 doorlock = *p++ - '0'; 2703 doorlock = *p++ - '0';
2703 else 2704 else
2704 bb_error_msg("-L: %s (0/1)", bb_msg_missing_value); 2705 goto missing_arg_error;
2705 break; 2706 break;
2706 2707
2707 case 'W': 2708 case 'W':
@@ -2712,7 +2713,8 @@ int hdparm_main(int argc, char **argv)
2712 if((set_wcache = set_flag(p,'1'))==1) 2713 if((set_wcache = set_flag(p,'1'))==1)
2713 wcache = *p++ - '0'; 2714 wcache = *p++ - '0';
2714 else 2715 else
2715 bb_error_msg("-W: %s (0/1)", bb_msg_missing_value); 2716missing_arg_error:
2717 missing_arg(1, c, "(0/1)");
2716 break; 2718 break;
2717 2719
2718 case 'C': 2720 case 'C':
@@ -2755,7 +2757,7 @@ int hdparm_main(int argc, char **argv)
2755 if (!*p && argc && isdigit(**argv)) 2757 if (!*p && argc && isdigit(**argv))
2756 p = *argv++, --argc; 2758 p = *argv++, --argc;
2757 if(! p) 2759 if(! p)
2758 goto error; /* "expected hwif_nr" */ 2760 goto expected_hwif_error; /* "expected hwif_nr" */
2759 2761
2760 sscanf(p++, "%i", &hwif); 2762 sscanf(p++, "%i", &hwif);
2761 2763
@@ -2767,21 +2769,21 @@ int hdparm_main(int argc, char **argv)
2767 if (!*p && argc && isdigit(**argv)) 2769 if (!*p && argc && isdigit(**argv))
2768 p = *argv++, --argc; 2770 p = *argv++, --argc;
2769 if(! p) 2771 if(! p)
2770 goto error; /* "expected hwif_data" */ 2772 goto expected_hwif_error; /* "expected hwif_data" */
2771 2773
2772 sscanf(p++, "%i", &hwif_data); 2774 sscanf(p++, "%i", &hwif_data);
2773 2775
2774 if (argc && isdigit(**argv)) 2776 if (argc && isdigit(**argv))
2775 p = *argv++, --argc; 2777 p = *argv++, --argc;
2776 else 2778 else
2777 goto error; /* "expected hwif_ctrl" */ 2779 goto expected_hwif_error; /* "expected hwif_ctrl" */
2778 2780
2779 sscanf(p, "%i", &hwif_ctrl); 2781 sscanf(p, "%i", &hwif_ctrl);
2780 2782
2781 if (argc && isdigit(**argv)) 2783 if (argc && isdigit(**argv))
2782 p = *argv++, --argc; 2784 p = *argv++, --argc;
2783 else 2785 else
2784error: 2786expected_hwif_error:
2785 bb_error_msg_and_die("expected hwif value"); /* "expected hwif_irq" */ 2787 bb_error_msg_and_die("expected hwif value"); /* "expected hwif_irq" */
2786 2788
2787 sscanf(p, "%i", &hwif_irq); 2789 sscanf(p, "%i", &hwif_irq);
@@ -2818,7 +2820,7 @@ error:
2818 if((perform_tristate = set_flag(p,'1'))==1) 2820 if((perform_tristate = set_flag(p,'1'))==1)
2819 tristate = *p++ - '0'; 2821 tristate = *p++ - '0';
2820 else 2822 else
2821 bb_error_msg("-x: %s (0/1)", bb_msg_missing_value); 2823 missing_arg(1, c, "(0/1)");
2822 break; 2824 break;
2823 2825
2824#endif /* CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF */ 2826#endif /* CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF */
@@ -2835,8 +2837,7 @@ error:
2835 if (!*p && argc && isalnum(**argv)) 2837 if (!*p && argc && isalnum(**argv))
2836 p = *argv++, --argc; 2838 p = *argv++, --argc;
2837 p=GET_NUMBER(p,&set_apmmode,&apmmode); 2839 p=GET_NUMBER(p,&set_apmmode,&apmmode);
2838 if (!set_apmmode) 2840 missing_arg(set_apmmode, c, "(1-255)");
2839 bb_error_msg("-B: %s (1-255)", bb_msg_missing_value);
2840 break; 2841 break;
2841 case 't': 2842 case 't':
2842 do_timings = 1; 2843 do_timings = 1;