3 Copyright 1993, 1998 The Open Group
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 Except as contained in this notice, the name of The Open Group shall not be
22 used in advertising or otherwise to promote the sale, use or other dealings
23 in this Software without prior written authorization from The Open Group.
28 * Author: Ralph Mor, X Consortium
34 #include <X11/SM/SMlib.h>
36 #include <X11/Xtrans/Xtrans.h>
45 _SmsProtocolSetupProc (IceConn iceConn,
50 IcePointer *clientDataRet,
51 char **failureReasonRet)
58 * vendor/release are undefined for ProtocolSetup in XSMP.
68 * Allocate new SmsConn.
71 if ((smsConn = malloc (sizeof (struct _SmsConn))) == NULL)
73 const char *str = "Memory allocation failed";
75 *failureReasonRet = strdup (str);
80 smsConn->iceConn = iceConn;
81 smsConn->proto_major_version = majorVersion;
82 smsConn->proto_minor_version = minorVersion;
83 smsConn->client_id = NULL;
85 smsConn->save_yourself_in_progress = False;
86 smsConn->interaction_allowed = SmInteractStyleNone;
87 smsConn->can_cancel_shutdown = False;
88 smsConn->interact_in_progress = False;
90 *clientDataRet = (IcePointer) smsConn;
94 * Now give the session manager the new smsConn and get back the
95 * callbacks to invoke when messages arrive from the client.
97 * In the future, we can use the mask return value to check
98 * if the SM is expecting an older rev of SMlib.
101 bzero ((char *) &smsConn->callbacks, sizeof (SmsCallbacks));
103 status = (*_SmsNewClientProc) (smsConn, _SmsNewClientData,
104 &mask, &smsConn->callbacks, failureReasonRet);
113 SmsInitialize(const char *vendor, const char *release,
114 SmsNewClientProc newClientProc,
115 SmPointer managerData, IceHostBasedAuthProc hostBasedAuthProc,
116 int errorLength, char *errorStringRet)
118 const char *auth_names[] = {"MIT-MAGIC-COOKIE-1"};
119 IcePaAuthProc auth_procs[] = {_IcePaMagicCookie1Proc};
122 IcePaVersionRec versions[] = {
123 {SmProtoMajor, SmProtoMinor, _SmsProcessMessage}
125 int version_count = 1;
127 if (errorStringRet && errorLength > 0)
128 *errorStringRet = '\0';
132 if (errorStringRet && errorLength > 0) {
133 strncpy (errorStringRet,
134 "The SmsNewClientProc callback can't be NULL",
136 errorStringRet[errorLength - 1] = '\0';
145 if ((_SmsOpcode = IceRegisterForProtocolReply ("XSMP",
146 vendor, release, version_count, versions,
147 auth_count, auth_names, auth_procs, hostBasedAuthProc,
148 _SmsProtocolSetupProc,
149 NULL, /* IceProtocolActivateProc - we don't care about
150 when the Protocol Reply is sent, because the
151 session manager can not immediately send a
152 message - it must wait for RegisterClient. */
153 NULL /* IceIOErrorProc */
156 if (errorStringRet && errorLength > 0) {
157 strncpy (errorStringRet,
158 "Could not register XSMP protocol with ICE",
160 errorStringRet[errorLength - 1] = '\0';
166 _SmsNewClientProc = newClientProc;
167 _SmsNewClientData = managerData;
175 SmsClientHostName(SmsConn smsConn)
177 return (IceGetPeerName (smsConn->iceConn));
183 SmsRegisterClientReply(SmsConn smsConn, char *clientId)
185 IceConn iceConn = smsConn->iceConn;
187 smRegisterClientReplyMsg *pMsg;
190 if ((smsConn->client_id = strdup (clientId)) == NULL)
195 extra = ARRAY8_BYTES (strlen (clientId));
197 IceGetHeaderExtra (iceConn, _SmsOpcode, SM_RegisterClientReply,
198 SIZEOF (smRegisterClientReplyMsg), WORD64COUNT (extra),
199 smRegisterClientReplyMsg, pMsg, pData);
201 STORE_ARRAY8 (pData, strlen (clientId), clientId);
211 SmsSaveYourself(SmsConn smsConn, int saveType, Bool shutdown,
212 int interactStyle, Bool fast)
214 IceConn iceConn = smsConn->iceConn;
215 smSaveYourselfMsg *pMsg;
217 IceGetHeader (iceConn, _SmsOpcode, SM_SaveYourself,
218 SIZEOF (smSaveYourselfMsg), smSaveYourselfMsg, pMsg);
220 pMsg->saveType = saveType;
221 pMsg->shutdown = shutdown;
222 pMsg->interactStyle = interactStyle;
227 smsConn->save_yourself_in_progress = True;
229 if (interactStyle == SmInteractStyleNone ||
230 interactStyle == SmInteractStyleErrors ||
231 interactStyle == SmInteractStyleAny)
233 smsConn->interaction_allowed = interactStyle;
237 smsConn->interaction_allowed = SmInteractStyleNone;
240 smsConn->can_cancel_shutdown = shutdown &&
241 (interactStyle == SmInteractStyleAny ||
242 interactStyle == SmInteractStyleErrors);
248 SmsSaveYourselfPhase2(SmsConn smsConn)
250 IceConn iceConn = smsConn->iceConn;
252 IceSimpleMessage (iceConn, _SmsOpcode, SM_SaveYourselfPhase2);
259 SmsInteract(SmsConn smsConn)
261 IceConn iceConn = smsConn->iceConn;
263 IceSimpleMessage (iceConn, _SmsOpcode, SM_Interact);
266 smsConn->interact_in_progress = True;
272 SmsDie(SmsConn smsConn)
274 IceConn iceConn = smsConn->iceConn;
276 IceSimpleMessage (iceConn, _SmsOpcode, SM_Die);
283 SmsSaveComplete(SmsConn smsConn)
285 IceConn iceConn = smsConn->iceConn;
287 IceSimpleMessage (iceConn, _SmsOpcode, SM_SaveComplete);
294 SmsShutdownCancelled(SmsConn smsConn)
296 IceConn iceConn = smsConn->iceConn;
298 IceSimpleMessage (iceConn, _SmsOpcode, SM_ShutdownCancelled);
301 smsConn->can_cancel_shutdown = False;
307 SmsReturnProperties(SmsConn smsConn, int numProps, SmProp **props)
309 IceConn iceConn = smsConn->iceConn;
311 smPropertiesReplyMsg *pMsg;
315 IceGetHeader (iceConn, _SmsOpcode, SM_PropertiesReply,
316 SIZEOF (smPropertiesReplyMsg), smPropertiesReplyMsg, pMsg);
318 LISTOF_PROP_BYTES (numProps, props, bytes);
319 pMsg->length += WORD64COUNT (bytes);
321 pBuf = pStart = IceAllocScratch (iceConn, bytes);
323 STORE_LISTOF_PROPERTY (pBuf, numProps, props);
325 IceWriteData (iceConn, bytes, pStart);
332 SmsCleanUp(SmsConn smsConn)
334 IceProtocolShutdown (smsConn->iceConn, _SmsOpcode);
336 if (smsConn->client_id)
337 free (smsConn->client_id);