Changeset 138

Show
Ignore:
Timestamp:
12/29/98 20:48:43 (14 years ago)
Author:
frodo
Message:

Library and application support for 'set' statements

Location:
lm-sensors/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/lib/access.c

    r120 r138  
    1818*/ 
    1919 
    20 #include <stddef.h> 
     20#include <stdlib.h> 
    2121#include <string.h> 
    2222#include "access.h" 
     
    2525#include "error.h" 
    2626#include "proc.h" 
     27#include "general.h" 
     28 
     29static int sensors_do_this_chip_sets(sensors_chip_name name); 
    2730 
    2831/* Compare two chips name descriptions, to see whether they could match. 
     
    199202int sensors_set_feature(sensors_chip_name name, int feature, double value) 
    200203{ 
    201   const sensors_chip_feature *featureptr; 
     204  const sensors_chip_feature *main_feature; 
     205  const sensors_chip_feature *alt_feature; 
    202206  const sensors_chip *chip; 
    203207  const sensors_expr *expr = NULL; 
    204208  int i,res; 
     209  int final_expr=0; 
     210  double to_write; 
    205211 
    206212  if (sensors_chip_name_has_wildcards(name)) 
    207213    return -SENSORS_ERR_WILDCARDS; 
    208   if (! (featureptr = sensors_lookup_feature_nr(name.prefix,feature))) 
     214  if (! (main_feature = sensors_lookup_feature_nr(name.prefix,feature))) 
    209215    return -SENSORS_ERR_NO_ENTRY; 
    210   if (! (featureptr->mode && SENSORS_MODE_W)) 
     216  if (main_feature->compute_mapping == SENSORS_NO_MAPPING) 
     217    alt_feature = NULL; 
     218  else if (! (alt_feature = 
     219                   sensors_lookup_feature_nr(name.prefix, 
     220                                             main_feature->compute_mapping))) 
     221    return -SENSORS_ERR_NO_ENTRY; 
     222  if (! (main_feature->mode && SENSORS_MODE_W)) 
    211223    return -SENSORS_ERR_ACCESS; 
    212224  for (chip = NULL; !expr && (chip = sensors_for_all_config_chips(name,chip));) 
    213     for (i = 0; !expr && (i < chip->computes_count); i++) 
    214       if (!strcmp(featureptr->name,chip->computes->name)) 
     225    for (i = 0; !final_expr && (i < chip->computes_count); i++) 
     226      if (!strcmp(main_feature->name,chip->computes[i].name)) { 
    215227        expr = chip->computes->to_proc; 
     228        final_expr = 1; 
     229      } else if (alt_feature &&  
     230                 !strcmp(alt_feature->name,chip->computes[i].name)) 
     231        expr = chip->computes[i].to_proc; 
     232 
     233  to_write = value; 
    216234  if (expr) 
    217     if ((res = sensors_eval_expr(name,expr,value,&value))) 
     235    if ((res = sensors_eval_expr(name,expr,value,&to_write))) 
    218236      return res; 
    219   if (sensors_write_proc(name,feature,value)) 
     237  if (sensors_write_proc(name,feature,to_write)) 
    220238    return -SENSORS_ERR_PROC; 
    221239  return 0; 
     
    331349  return 0; 
    332350} 
     351 
     352/* Execute all set statements for this particular chip. The chip may not  
     353   contain wildcards!  This function will return 0 on success, and <0 on  
     354   failure. */ 
     355int sensors_do_this_chip_sets(sensors_chip_name name) 
     356{ 
     357  sensors_chip *chip; 
     358  double value; 
     359  int err,i,j; 
     360  int res = 0; 
     361  const sensors_chip_feature *feature; 
     362  int *feature_list = NULL; 
     363  int feature_count = 0; 
     364  int feature_max = 0; 
     365  int feature_nr; 
     366 
     367  for(chip = NULL; (chip = sensors_for_all_config_chips(name,chip));) 
     368    for(i = 0; i < chip->sets_count; i++) { 
     369      feature = sensors_lookup_feature_name(name.prefix,chip->sets[i].name); 
     370      if (! feature) { 
     371        sensors_parse_error("Unknown feature name",chip->sets[i].lineno); 
     372        err = SENSORS_ERR_NO_ENTRY; 
     373        continue; 
     374      } 
     375      feature_nr = feature->number; 
     376 
     377      /* Check whether we already set this feature */ 
     378      for(j = 0; j < feature_count; j++) 
     379        if(feature_list[j] == feature_nr) 
     380          break; 
     381      if (j != feature_count) 
     382        continue; 
     383      sensors_add_array_el(&feature_nr,(void **)&feature_list,&feature_count, 
     384                        &feature_max, sizeof(int)); 
     385 
     386      res = sensors_eval_expr(name,chip->sets[i].value,0,&value); 
     387      if (res) { 
     388        sensors_parse_error("Parsing expression",chip->sets[i].lineno); 
     389        err = res; 
     390        continue; 
     391      } 
     392      if ((res = sensors_set_feature(name,feature_nr,value))) { 
     393        err = res; 
     394        continue; 
     395      } 
     396    } 
     397  free(feature_list); 
     398  return res; 
     399} 
     400 
     401/* Execute all set statements for this particular chip. The chip may contain 
     402   wildcards!  This function will return 0 on success, and <0 on failure. */ 
     403int sensors_do_chip_sets(sensors_chip_name name) 
     404{ 
     405  int nr,this_res; 
     406  const sensors_chip_name *found_name; 
     407  int res = 0; 
     408 
     409  for (nr = 0; (found_name = sensors_get_detected_chips(&nr));) 
     410    if (sensors_match_chip(name,*found_name)) { 
     411      this_res = sensors_do_this_chip_sets(*found_name); 
     412      if (! res) 
     413        res = this_res; 
     414    } 
     415  return res; 
     416} 
     417 
     418/* Execute all set statements for all detected chips. This is the same as 
     419   calling sensors_do_chip_sets with an all wildcards chip name */ 
     420int sensors_do_all_sets(void) 
     421{ 
     422  sensors_chip_name name = { SENSORS_CHIP_NAME_PREFIX_ANY,  
     423                             SENSORS_CHIP_NAME_BUS_ANY, 
     424                             SENSORS_CHIP_NAME_ADDR_ANY }; 
     425  return sensors_do_chip_sets(name); 
     426} 
     427 
  • lm-sensors/trunk/lib/sensors.h

    r110 r138  
    8282/* Set the value of a feature of a certain chip. Note that chip should not 
    8383   contain wildcard values! This function will return 0 on success, and <0 
    84    on failure.  BUGGY! */ 
     84   on failure. */ 
    8585extern int sensors_set_feature(sensors_chip_name name, int feature, 
    8686                               double value); 
     87 
     88/* Execute all set statements for this particular chip. The chip may contain 
     89   wildcards!  This function will return 0 on success, and <0 on failure. */ 
     90extern int sensors_do_chip_sets(sensors_chip_name name); 
     91 
     92/* Execute all set statements for all detected chips. This is the same as 
     93   calling sensors_do_chip_sets with an all wildcards chip name */ 
     94extern int sensors_do_all_sets(void); 
    8795 
    8896/* This function returns all detected chips, one by one. To start at the 
  • lm-sensors/trunk/prog/sensors/main.c

    r127 r138  
    5555  printf("  -c, --config-file     Specify a config file\n"); 
    5656  printf("  -h, --help            Display this help text\n"); 
     57  printf("  -s, --set             Execute `set' statements too (root only)\n"); 
    5758  printf("  -v, --version         Display the program version\n"); 
    5859  printf("\n"); 
     
    120121{ 
    121122  int c,res; 
     123  int do_sets; 
    122124 
    123125  int chip_nr; 
     
    127129  struct option long_opts[] =  { 
    128130    { "help", no_argument, NULL, 'h' }, 
     131    { "set", no_argument, NULL, 's' }, 
    129132    { "version", no_argument, NULL, 'v'}, 
    130133    { "config-file", required_argument, NULL, 'c' } 
    131134  }; 
    132135 
     136  do_sets = 0; 
    133137  while (1) { 
    134     c = getopt_long(argc,argv,"hvc:",long_opts,NULL); 
     138    c = getopt_long(argc,argv,"hvsc:",long_opts,NULL); 
    135139    if (c == EOF) 
    136140      break; 
     
    149153      config_file_name = strdup(optarg); 
    150154      break; 
     155    case 's': 
     156      do_sets = 1; 
     157      break; 
    151158    default: 
    152159      fprintf(stderr,"Internal error while parsing options!\n"); 
     
    167174  /* Here comes the real code... */ 
    168175 
     176  if (do_sets)  
     177    if ((res = sensors_do_all_sets())) { 
     178      fprintf(stderr,"%s\n",sensors_strerror(res)); 
     179      exit(1); 
     180    } 
     181   
    169182  for (chip_nr = 0; (chip = sensors_get_detected_chips(&chip_nr));) { 
    170183    if (chip->bus == SENSORS_CHIP_NAME_BUS_ISA)