home *** CD-ROM | disk | FTP | other *** search
- // "main.c" - main entry point for ServerPower Extension.
- // Written November, 1996 by Dave Warker <davew@waterw.com>
- // Based on Tech Note 1079 - Power Management & Servers: Auto Restart from Power Failure.
-
- #include "ShowInitIcon.h"
-
-
- /// - constants.
-
- enum // ShowInitIcon() icons.
- {
- rIconServerPower = 128, // unit set to server mode
- rIconNotSupported, // File Server mode not available on this Mac
- rIconFailed // call to set server mode failed
- };
-
-
- /// - prototypes.
-
- void main(void);
-
-
- /// - Cuda Manager definitions.
-
- enum // commands.
- {
- pseudoPkt = 0x01, // standard command type
-
- EnDisFileS = 0x13, // enable/disable File Server power mode
- WakeupMode = 0x23, // enable/disable wakeup mode
- GetPwrFailTime = 0x27 // read time of last power failure
- };
-
- typedef struct // parameter block for Egret trap.
- {
- unsigned char pbCmdType; // command type (always 'pseudoPkt')
- unsigned char pbCmd; // command
- union // parameter
- {
- unsigned char pByte[4];
- unsigned short pWord[2];
- unsigned long pLong;
- }
- pbParam;
- unsigned short pbByteCnt; // number of bytes passed in buffer
- unsigned char* pbBufPtr; // pointer to a buffer
- unsigned char pbFlags; // flags returned by Cuda
- unsigned char pbSpare; // (not used, reserved)
- short pbResult; // result code from Cuda
- ProcPtr pbCompletion; // routine to call on completion or 'nil'
- }
- CudaPB, *CudaPbPtr;
-
- extern long cudaGlobalsPtr : 0xde0L;
- enum { noCudaGlobals = -1L };
- // Used to determine if Cuda code is loaded.
-
- #pragma parameter Cuda(__A0)
- void Cuda(CudaPbPtr) = 0xA092;
- // Cuda trap call.
-
-
- /// - implementation.
-
- static Boolean ServerPowerModeIsAvailable(void)
- {
- long result;
- if (Gestalt(gestaltHardwareAttr,&result) == noErr && (result & (1L << gestaltHasSoftPowerOff)))
- {
- // Gestalt says soft-power off is available, let's check for Cuda!
- if (GetOSTrapAddress(_EgretDispatch) != GetOSTrapAddress(_Unimplemented))
- {
- // Trap is there, but is the software loaded?
- if (cudaGlobalsPtr != noCudaGlobals)
- // We have a winner!
- return true;
- }
- }
- return false;
- }
-
-
- static OSErr SelectServerPowerMode(Boolean turnItOn)
- {
- CudaPB pb;
-
- pb.pbCmdType = pseudoPkt;
- pb.pbCmd = EnDisFileS;
- pb.pbByteCnt = 0;
- pb.pbBufPtr = nil;
- pb.pbResult = noErr;
- pb.pbCompletion = nil;
-
- pb.pbParam.pLong = 0;
- pb.pbParam.pByte[0] = turnItOn ? 1 : 0;
-
- Cuda(&pb);
-
- return pb.pbResult;
- }
-
-
- void main(void)
- {
- int icon;
-
- if (ServerPowerModeIsAvailable())
- {
- if (SelectServerPowerMode(true) == noErr)
- icon = rIconServerPower;
- else
- icon = rIconFailed;
- }
- else
- icon = rIconNotSupported;
-
- ShowInitIcon(icon, true);
- }
-