Changeset 138
- Timestamp:
- 12/29/98 20:48:43 (14 years ago)
- Location:
- lm-sensors/trunk
- Files:
-
- 3 modified
-
lib/access.c (modified) (4 diffs)
-
lib/sensors.h (modified) (1 diff)
-
prog/sensors/main.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lm-sensors/trunk/lib/access.c
r120 r138 18 18 */ 19 19 20 #include <std def.h>20 #include <stdlib.h> 21 21 #include <string.h> 22 22 #include "access.h" … … 25 25 #include "error.h" 26 26 #include "proc.h" 27 #include "general.h" 28 29 static int sensors_do_this_chip_sets(sensors_chip_name name); 27 30 28 31 /* Compare two chips name descriptions, to see whether they could match. … … 199 202 int sensors_set_feature(sensors_chip_name name, int feature, double value) 200 203 { 201 const sensors_chip_feature *featureptr; 204 const sensors_chip_feature *main_feature; 205 const sensors_chip_feature *alt_feature; 202 206 const sensors_chip *chip; 203 207 const sensors_expr *expr = NULL; 204 208 int i,res; 209 int final_expr=0; 210 double to_write; 205 211 206 212 if (sensors_chip_name_has_wildcards(name)) 207 213 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))) 209 215 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)) 211 223 return -SENSORS_ERR_ACCESS; 212 224 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)) { 215 227 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; 216 234 if (expr) 217 if ((res = sensors_eval_expr(name,expr,value,& value)))235 if ((res = sensors_eval_expr(name,expr,value,&to_write))) 218 236 return res; 219 if (sensors_write_proc(name,feature, value))237 if (sensors_write_proc(name,feature,to_write)) 220 238 return -SENSORS_ERR_PROC; 221 239 return 0; … … 331 349 return 0; 332 350 } 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. */ 355 int 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. */ 403 int 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 */ 420 int 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 82 82 /* Set the value of a feature of a certain chip. Note that chip should not 83 83 contain wildcard values! This function will return 0 on success, and <0 84 on failure. BUGGY!*/84 on failure. */ 85 85 extern int sensors_set_feature(sensors_chip_name name, int feature, 86 86 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. */ 90 extern 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 */ 94 extern int sensors_do_all_sets(void); 87 95 88 96 /* This function returns all detected chips, one by one. To start at the -
lm-sensors/trunk/prog/sensors/main.c
r127 r138 55 55 printf(" -c, --config-file Specify a config file\n"); 56 56 printf(" -h, --help Display this help text\n"); 57 printf(" -s, --set Execute `set' statements too (root only)\n"); 57 58 printf(" -v, --version Display the program version\n"); 58 59 printf("\n"); … … 120 121 { 121 122 int c,res; 123 int do_sets; 122 124 123 125 int chip_nr; … … 127 129 struct option long_opts[] = { 128 130 { "help", no_argument, NULL, 'h' }, 131 { "set", no_argument, NULL, 's' }, 129 132 { "version", no_argument, NULL, 'v'}, 130 133 { "config-file", required_argument, NULL, 'c' } 131 134 }; 132 135 136 do_sets = 0; 133 137 while (1) { 134 c = getopt_long(argc,argv,"hv c:",long_opts,NULL);138 c = getopt_long(argc,argv,"hvsc:",long_opts,NULL); 135 139 if (c == EOF) 136 140 break; … … 149 153 config_file_name = strdup(optarg); 150 154 break; 155 case 's': 156 do_sets = 1; 157 break; 151 158 default: 152 159 fprintf(stderr,"Internal error while parsing options!\n"); … … 167 174 /* Here comes the real code... */ 168 175 176 if (do_sets) 177 if ((res = sensors_do_all_sets())) { 178 fprintf(stderr,"%s\n",sensors_strerror(res)); 179 exit(1); 180 } 181 169 182 for (chip_nr = 0; (chip = sensors_get_detected_chips(&chip_nr));) { 170 183 if (chip->bus == SENSORS_CHIP_NAME_BUS_ISA)
