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

Reply via email to