apm.c revision 8857
13259Sdg/* 23259Sdg * LP (Laptop Package) 33259Sdg * 43259Sdg * Copyright (C) 1994 by HOSOKAWA Tatasumi <hosokawa@mt.cs.keio.ac.jp> 53259Sdg * 63259Sdg * This software may be used, modified, copied, distributed, and sold, 73259Sdg * in both source and binary form provided that the above copyright and 88857Srgrimes * these terms are retained. Under no circumstances is the author 98857Srgrimes * responsible for the proper functioning of this software, nor does 108857Srgrimes * the author assume any responsibility for damages incurred with its 113259Sdg * use. 123259Sdg * 133259Sdg * Sep., 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) 143259Sdg */ 153259Sdg 163259Sdg#include <stdio.h> 173259Sdg#include <string.h> 183259Sdg#include <sys/file.h> 193259Sdg#include <sys/ioctl.h> 204075Sphk#include <machine/apm_bios.h> 213259Sdg 224062Sphk#define APMDEV "/dev/apm0" 233259Sdg 243259Sdgint main_argc; 253259Sdgchar **main_argv; 263259Sdg 273259Sdgvoid apm_suspend(int fd) 283259Sdg{ 293259Sdg if (ioctl(fd, APMIO_SUSPEND, NULL) == -1) { 303259Sdg fprintf(stderr, "%s: ioctl APMIO_SUSPEND failed.\n", main_argv[0]); 313259Sdg exit(1); 323259Sdg } 333259Sdg} 343259Sdg 353259Sdgvoid apm_getinfo(int fd, apm_info_t aip) 363259Sdg{ 373259Sdg if (ioctl(fd, APMIO_GETINFO, aip) == -1) { 383259Sdg fprintf(stderr, "%s: ioctl APMIO_GETINFO failed.\n", main_argv[0]); 393259Sdg exit(1); 403259Sdg } 413259Sdg} 423259Sdg 433259Sdgvoid print_all_info(apm_info_t aip) 443259Sdg{ 453259Sdg printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor); 463259Sdg printf("AC Line status: "); 473259Sdg if (aip->ai_acline == 255) { 483259Sdg printf("unknown"); 493259Sdg } 503259Sdg else if (aip->ai_acline > 1) { 513259Sdg printf("invalid value (0x%x)", aip->ai_acline); 523259Sdg } 533259Sdg else { 543259Sdg static char messages[][10] = {"off-line", "on-line"}; 553259Sdg printf("%s", messages[aip->ai_acline]); 563259Sdg } 573259Sdg printf("\n"); 583259Sdg printf("Battery status: "); 593259Sdg if (aip->ai_batt_stat == 255) { 603259Sdg printf("unknown"); 613259Sdg } 623259Sdg else if (aip->ai_batt_stat > 3) { 633259Sdg printf("invalid value (0x%x)", aip->ai_batt_stat); 643259Sdg } 653259Sdg else { 663259Sdg static char messages[][10] = {"high", "low", "critical", "charging"}; 673259Sdg printf("%s", messages[aip->ai_batt_stat]); 683259Sdg } 693259Sdg printf("\n"); 703259Sdg printf("Remaining battery life: "); 713259Sdg if (aip->ai_batt_life == 255) { 723259Sdg printf("unknown"); 733259Sdg } 743259Sdg else if (aip->ai_batt_life <= 100) { 753259Sdg printf("%d%%", aip->ai_batt_life); 763259Sdg } 773259Sdg else { 783259Sdg printf("invalid value (0x%x)", aip->ai_batt_life); 793259Sdg } 803259Sdg printf("\n"); 813259Sdg} 823259Sdg 833259Sdgint main(int argc, char *argv[]) 843259Sdg{ 853259Sdg int i, j, fd; 863259Sdg int sleep = 0, all_info = 1, batt_status = 0, batt_life = 0, ac_status = 0; 873259Sdg char *cmdname; 888857Srgrimes 893259Sdg main_argc = argc; 903259Sdg main_argv = argv; 913259Sdg if ((cmdname = strrchr(argv[0], '/')) != NULL) { 923259Sdg cmdname++; 933259Sdg } 943259Sdg else { 953259Sdg cmdname = argv[0]; 963259Sdg } 973259Sdg 983259Sdg if (strcmp(cmdname, "zzz") == 0) { 993259Sdg sleep = 1; 1003259Sdg all_info = 0; 1013259Sdg goto finish_option; 1023259Sdg } 1033259Sdg 1043259Sdg for (i = argc - 1; i >= 1; i--) { 1053259Sdg if (argv[i][0] != '-') { 1064062Sphk fprintf(stderr, "%s: Unknown option '%s'.\n", argv[0], argv[i]); 1074062Sphk exit(1); 1083259Sdg } 1093259Sdg for (j = 1; argv[i][j]; j++) { 1103259Sdg switch (argv[i][j]) { 1113259Sdg case 'z': 1123259Sdg sleep = 1; 1133259Sdg all_info = 0; 1143259Sdg break; 1153259Sdg case 'b': 1163259Sdg batt_status = 1; 1173259Sdg all_info = 0; 1183259Sdg break; 1193259Sdg case 'a': 1203259Sdg ac_status = 1; 1213259Sdg all_info = 0; 1223259Sdg break; 1233259Sdg case 'l': 1243259Sdg batt_life = 1; 1253259Sdg all_info = 0; 1263259Sdg break; 1274062Sphk default: 1284062Sphk fprintf(stderr, "%s Unknown option '%s'.\n", argv[0], argv[i]); 1294062Sphk exit(1); 1303259Sdg } 1313259Sdg } 1323259Sdg } 1333259Sdgfinish_option: 1343259Sdg fd = open(APMDEV, O_RDWR); 1353259Sdg if (fd == -1) { 1363259Sdg fprintf(stderr, "%s: Can't open %s.\n", argv[0], APMDEV); 1373259Sdg return 1; 1383259Sdg } 1393259Sdg if (sleep) { 1403259Sdg apm_suspend(fd); 1413259Sdg } 1423259Sdg else { 1433259Sdg struct apm_info info; 1443259Sdg 1453259Sdg apm_getinfo(fd, &info); 1463259Sdg if (all_info) { 1473259Sdg print_all_info(&info); 1483259Sdg } 1493259Sdg if (batt_status) { 1503259Sdg printf("%d\n", info.ai_batt_stat); 1513259Sdg } 1523259Sdg if (batt_life) { 1533259Sdg printf("%d\n", info.ai_batt_life); 1543259Sdg } 1553259Sdg if (ac_status) { 1563259Sdg printf("%d\n", info.ai_acline); 1573259Sdg } 1583259Sdg } 1593259Sdg close(fd); 1603259Sdg return 0; 1613259Sdg} 162