On my 4.9/amd64 installation, apm(1) reports different performance adjustment mode for different users, and I am trying to understand it.
hans@mac:hans$ uname -a OpenBSD mac.stare.cz 4.9 GENERIC.MP#819 amd64 hans@mac:hans$ pgrep -fl apm 32160 /usr/sbin/apmd -C hans@mac:hans$ id uid=1000(hans) gid=1000(hans) groups=1000(hans), 0(wheel), 5(operator) hans@mac:hans$ apm Battery state: high, 100% remaining, unknown life estimate A/C adapter state: connected Performance adjustment mode: cool running (800 MHz) ^^^^^^^^^^^^ toposym@mac:toposym$ id uid=1001(toposym) gid=1001(toposym) groups=1001(toposym) toposym@mac:toposym$ apm Battery state: high, 100% remaining, unknown life estimate A/C adapter state: connected Performance adjustment mode: manual (800 MHz) ^^^^^^ The differences between the two users are as follows: (1) hans is in group wheel, toposym is not (2) hans is in group operator, toposym is not (3) hans is staff login class, toposym is default Out of these differences, membership in wheel seems to be the one that matters: once I add toposym to wheel, apm reports correctly: toposym@mac:toposym$ id uid=1001(toposym) gid=1001(toposym) groups=1001(toposym), 0(wheel) toposym@mac:toposym$ apm Battery state: high, 93% remaining, 154 minutes life estimate A/C adapter state: not connected Performance adjustment mode: cool running (800 MHz) ^^^^^^^^^^^^ Adding toposym to the operator group or changing his login class to staff does not have this effect. Looking at the source, it seems that apm sets the reported perfmode to PERF_MANUAL at start, and changes it later according to apmd's reply. bzero(&reply, sizeof reply); reply.batterystate.battery_state = APM_BATT_UNKNOWN; reply.batterystate.ac_state = APM_AC_UNKNOWN; reply.perfmode = PERF_MANUAL; apm either connects to the running apmd's socket (which is /var/run/apmdev) with fd = open_socket(sockname); and sends the appropriate command if (fd != -1 && (rval = send_command(fd, &command, &reply)) != 0) errx(rval, "cannot get reply from APM daemon"); or fails connecting to the socket and tries to open the apm device (which is /dev/apm) directly if (fd == -1) { /* open the device directly and get status */ fd = open(_PATH_APM_NORMAL, O_RDONLY); if (ioctl(fd, APM_IOC_GETPOWER, &reply.batterystate) == 0) goto printval; } Now, for non-wheel users, connecting to the socket must fail: srw-rw---- 1 root wheel 0 Jun 8 09:12 /var/run/apmdev The apmd(8) manpage explains the restriction: -S sockname Specify an alternate socket name, sockname. The socket is protected to mode 0660, UID 0, GID 0; this protects access to suspend requests to authorized users only. So for non-wheel users running apm, it needs to talk to /dev/apm directly, and gets (only) the battery state via an ioctl() call. Looking at the apm(4) ioctl's, the power adjustment mode cannot be read with an ioctl call; after all, the power adjustment mode is just an attribute of the running apmd anyway (not a property known to /dev/apm), whose socket we can't talk to. So, (1) is the above correct? (2) is there a way for a non-wheel user to get the correct `apm -P' answer? apm's -f option seems to be relevant to this: -f sockname Set the name of the socket via which to contact apmd(8) to sockname. The -f flag may be used to specify an alternate socket name. The protection modes on this socket govern which users may access the APM functions. The corresponding thing to do on the apmd side would be the -S option; then apm could connect to it with apm -f; but the socket (whatever its name) would still be root:wheel 660, right? Thank you for your time Jan OpenBSD 4.9 (GENERIC.MP) #819: Wed Mar 2 06:57:49 MST 2011 dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP real mem = 2646556672 (2523MB) avail mem = 2562080768 (2443MB) mainbus0 at root bios0 at mainbus0: SMBIOS rev. 2.4 @ 0xe0000 (44 entries) bios0: vendor Apple Inc. version "MB31.88Z.008E.B02.0803051832" date 03/05/08 bios0: Apple Inc. MacBook3,1 acpi0 at bios0: rev 2 acpi0: sleep states S0 S3 S4 S5 acpi0: tables DSDT FACP HPET APIC MCFG ASF! SBST ECDT SSDT SSDT SSDT SSDT SSDT acpi0: wakeup devices ADP1(S3) LID0(S3) ARPT(S3) GIGE(S3) UHC1(S3) UHC2(S3) UHC3(S3) UHC4(S3) UHC5(S3) EHC1(S3) EHC2(S3) EC__(S3) acpitimer0 at acpi0: 3579545 Hz, 24 bits acpihpet0 at acpi0: 14318179 Hz acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat cpu0 at mainbus0: apid 0 (boot processor) cpu0: Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz, 1995.32 MHz cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,SSE3,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,NXE,LONG cpu0: 4MB 64b/line 16-way L2 cache cpu0: apic clock running at 199MHz cpu1 at mainbus0: apid 1 (application processor) cpu1: Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz, 1995.00 MHz cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,SSE3,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,NXE,LONG cpu1: 4MB 64b/line 16-way L2 cache ioapic0 at mainbus0: apid 1 pa 0xfec00000, version 20, 24 pins ioapic0: misconfigured as apic 0, remapped to apid 1 acpimcfg0 at acpi0 addr 0xf0000000, bus 0-255 acpiec0 at acpi0 acpiprt0 at acpi0: bus 0 (PCI0) acpiprt1 at acpi0: bus 2 (RP05) acpiprt2 at acpi0: bus 3 (RP06) acpiprt3 at acpi0: bus 4 (PCIB) acpicpu0 at acpi0: C3, C2, C1, PSS acpicpu1 at acpi0: C3, C2, C1, PSS acpiac0 at acpi0: AC unit offline acpibtn0 at acpi0: LID0 acpibtn1 at acpi0: PWRB acpibtn2 at acpi0: SLPB acpibat0 at acpi0: BAT0 model "15253732082930497" type 15253732284385612 oem "15253732284452179" acpivideo0 at acpi0: GFX0 acpivout0 at acpivideo0: LCD_ acpivout1 at acpivideo0: VGA_ acpivout2 at acpivideo0: TV__ cpu0: Enhanced SpeedStep 1995 MHz: speeds: 2000, 1800, 1600, 1400, 1200, 800 MHz memory map conflict 0xf00f8000/0x1000 memory map conflict 0xfed1c000/0x4000 memory map conflict 0xfffa0000/0x30000 pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 "Intel GM965 Host" rev 0x03 vga1 at pci0 dev 2 function 0 "Intel GM965 Video" rev 0x03 wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation) wsdisplay0: screen 1-5 added (80x25, vt100 emulation) intagp0 at vga1 agp0 at intagp0: aperture at 0xa0000000, size 0x10000000 inteldrm0 at vga1: apic 1 int 16 (irq 11) drm0 at inteldrm0 "Intel GM965 Video" rev 0x03 at pci0 dev 2 function 1 not configured uhci0 at pci0 dev 26 function 0 "Intel 82801H USB" rev 0x03: apic 1 int 20 (irq 10) uhci1 at pci0 dev 26 function 1 "Intel 82801H USB" rev 0x03: apic 1 int 16 (irq 11) ehci0 at pci0 dev 26 function 7 "Intel 82801H USB" rev 0x03: apic 1 int 21 (irq 9) usb0 at ehci0: USB revision 2.0 uhub0 at usb0 "Intel EHCI root hub" rev 2.00/1.00 addr 1 azalia0 at pci0 dev 27 function 0 "Intel 82801H HD Audio" rev 0x03: apic 1 int 20 (irq 10) azalia0: codecs: Realtek ALC885 audio0 at azalia0 ppb0 at pci0 dev 28 function 0 "Intel 82801H PCIE" rev 0x03: apic 1 int 16 (irq 255) pci1 at ppb0 bus 1 ppb1 at pci0 dev 28 function 4 "Intel 82801H PCIE" rev 0x03: apic 1 int 16 (irq 255) pci2 at ppb1 bus 2 "Broadcom BCM4321" rev 0x03 at pci2 dev 0 function 0 not configured ppb2 at pci0 dev 28 function 5 "Intel 82801H PCIE" rev 0x03: apic 1 int 17 (irq 255) pci3 at ppb2 bus 3 mskc0 at pci3 dev 0 function 0 "Marvell Yukon 88E8058" rev 0x13, Yukon-2 EC Ultra rev. B0 (0x3): apic 1 int 17 (irq 7) msk0 at mskc0 port A: address 00:1b:63:aa:12:67 eephy0 at msk0 phy 0: 88E1149 Gigabit PHY, rev. 1 uhci2 at pci0 dev 29 function 0 "Intel 82801H USB" rev 0x03: apic 1 int 16 (irq 11) uhci3 at pci0 dev 29 function 1 "Intel 82801H USB" rev 0x03: apic 1 int 18 (irq 5) uhci4 at pci0 dev 29 function 2 "Intel 82801H USB" rev 0x03: apic 1 int 21 (irq 9) ehci1 at pci0 dev 29 function 7 "Intel 82801H USB" rev 0x03: apic 1 int 20 (irq 10) usb1 at ehci1: USB revision 2.0 uhub1 at usb1 "Intel EHCI root hub" rev 2.00/1.00 addr 1 ppb3 at pci0 dev 30 function 0 "Intel 82801BAM Hub-to-PCI" rev 0xf3 pci4 at ppb3 bus 4 "AT&T/Lucent FW322 1394" rev 0x61 at pci4 dev 3 function 0 not configured pcib0 at pci0 dev 31 function 0 "Intel 82801HBM LPC" rev 0x03 pciide0 at pci0 dev 31 function 1 "Intel 82801HBM IDE" rev 0x03: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility atapiscsi0 at pciide0 channel 0 drive 0 scsibus0 at atapiscsi0: 2 targets cd0 at scsibus0 targ 0 lun 0: <MATSHITA, CD-RW CW-8221, GA0K> ATAPI 5/cdrom removable cd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2 pciide0: channel 1 disabled (no drives) pciide1 at pci0 dev 31 function 2 "Intel 82801HBM SATA" rev 0x03: DMA, channel 0 configured to native-PCI, channel 1 configured to native-PCI pciide1: using apic 1 int 18 (irq 5) for native-PCI interrupt wd0 at pciide1 channel 0 drive 0: <ST980811AS> wd0: 16-sector PIO, LBA48, 76319MB, 156301488 sectors wd0(pciide1:0:0): using PIO mode 4, Ultra-DMA mode 6 ichiic0 at pci0 dev 31 function 3 "Intel 82801H SMBus" rev 0x03: apic 1 int 20 (irq 10) iic0 at ichiic0 spdmem0 at iic0 addr 0x50: 512MB DDR2 SDRAM non-parity PC2-5300CL5 SO-DIMM spdmem1 at iic0 addr 0x52: 2GB DDR2 SDRAM non-parity PC2-5300CL5 SO-DIMM usb2 at uhci0: USB revision 1.0 uhub2 at usb2 "Intel UHCI root hub" rev 1.00/1.00 addr 1 usb3 at uhci1: USB revision 1.0 uhub3 at usb3 "Intel UHCI root hub" rev 1.00/1.00 addr 1 usb4 at uhci2: USB revision 1.0 uhub4 at usb4 "Intel UHCI root hub" rev 1.00/1.00 addr 1 usb5 at uhci3: USB revision 1.0 uhub5 at usb5 "Intel UHCI root hub" rev 1.00/1.00 addr 1 usb6 at uhci4: USB revision 1.0 uhub6 at usb6 "Intel UHCI root hub" rev 1.00/1.00 addr 1 isa0 at pcib0 isadma0 at isa0 pcppi0 at isa0 port 0x61 spkr0 at pcppi0 mtrr: Pentium Pro MTRR support uvideo0 at uhub1 port 4 configuration 1 interface 0 "Apple Computer Bluetooth" rev 2.00/0.0c addr 2 uhidev0 at uhub2 port 1 configuration 1 interface 0 "Apple Computer ADB device" rev 2.00/19.65 addr 2 uhidev0: iclass 3/1 ukbd0 at uhidev0: 8 modifier keys, 6 key codes wskbd0 at ukbd0: console keyboard, using wsdisplay0 uhidev1 at uhub2 port 1 configuration 1 interface 1 "Apple Computer ADB device" rev 2.00/19.65 addr 2 uhidev1: iclass 3/1 ums0 at uhidev1: 5 buttons wsmouse0 at ums0 mux 0 uhidev2 at uhub6 port 1 configuration 1 interface 0 "Apple Computer, Inc. IR Receiver" rev 2.00/0.16 addr 2 uhidev2: iclass 3/0, 38 report ids uhid0 at uhidev2 reportid 36: input=4, output=0, feature=0 uhid1 at uhidev2 reportid 37: input=4, output=0, feature=0 uhid2 at uhidev2 reportid 38: input=4, output=0, feature=0 uhidev3 at uhub6 port 2 configuration 1 interface 0 "Apple Inc. Apple Internal Keyboard / Trackpad" rev 2.00/0.09 addr 3 uhidev3: iclass 3/1 ukbd1 at uhidev3: 8 modifier keys, 5 key codes, country code 13 wskbd1 at ukbd1 mux 1 wskbd1: connecting to wsdisplay0 uhidev4 at uhub6 port 2 configuration 1 interface 1 "Apple Inc. Apple Internal Keyboard / Trackpad" rev 2.00/0.09 addr 3 uhidev4: iclass 3/1, 5 report ids ums1 at uhidev4 reportid 2: 3 buttons wsmouse1 at ums1 mux 0 ums2 at uhidev4 reportid 5 ums2: mouse has no X report uhidev5 at uhub6 port 2 configuration 1 interface 2 "Apple Inc. Apple Internal Keyboard / Trackpad" rev 2.00/0.09 addr 3 uhidev5: iclass 3/0 uhid3 at uhidev5: input=1, output=0, feature=0 vscsi0 at root scsibus1 at vscsi0: 256 targets softraid0 at root root on wd0a swap on wd0b dump on wd0b uvideo0 detached uvideo0 at uhub1 port 4 configuration 1 interface 0 "Micron Built-in iSight" rev 2.00/1.84 addr 2 video0 at uvideo0