/opensource.apple.com/source/netinfo/netinfo-369.2/servers/netinfod/alert.c
# · C · 331 lines · 261 code · 40 blank · 30 comment · 26 complexity · 51f580301eeec55640aea959d6cd12d0 MD5 · raw file
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>alert.c</title>
- <style type="text/css">
- .enscript-comment { font-style: italic; color: rgb(178,34,34); }
- .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
- .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
- .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
- .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
- .enscript-string { font-weight: bold; color: rgb(188,143,143); }
- .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
- .enscript-type { font-weight: bold; color: rgb(34,139,34); }
- .enscript-highlight { text-decoration: underline; color: 0; }
- </style>
- </head>
- <body id="top">
- <h1 style="margin:8px;" id="f1">alert.c <span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
- <hr/>
- <div></div>
- <pre>
- <span class="enscript-comment">/*
- * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * <a href="http://www.opensource.apple.com/apsl/">http://www.opensource.apple.com/apsl/</a> and read it before using this
- * file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */</span>
- <span class="enscript-comment">/*
- * Alert handling (allow user to abort local domain binding)
- * Copyright (C) 1989 by NeXT, Inc.
- *
- */</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><NetInfo/config.h></span>
-
- <span class="enscript-comment">/*
- * Disabled for MacOS X for the momment,
- * There's no support for console alerts yet.
- */</span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">_OS_APPLE_</span>
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> aborted = 0;
- <span class="enscript-type">static</span> <span class="enscript-type">enum</span> {
- ALERT_FRESH,
- ALERT_OPENED,
- ALERT_PRINTED,
- ALERT_CLOSED
- } alert_state = ALERT_CLOSED;
- <span class="enscript-type">void</span>
- <span class="enscript-function-name">alert_enable</span>(<span class="enscript-type">int</span> enable)
- {
- <span class="enscript-keyword">if</span> (enable) alert_state = ALERT_FRESH;
- <span class="enscript-keyword">else</span> alert_state = ALERT_CLOSED;
- }
- <span class="enscript-type">int</span>
- <span class="enscript-function-name">alert_aborted</span>(<span class="enscript-type">void</span>)
- {
- <span class="enscript-keyword">return</span> aborted;
- }
- <span class="enscript-type">void</span>
- <span class="enscript-function-name">alert_close</span>(<span class="enscript-type">void</span>)
- {
- <span class="enscript-keyword">if</span> (alert_state != ALERT_PRINTED) <span class="enscript-keyword">return</span>;
- alert_state = ALERT_CLOSED;
- }
- <span class="enscript-type">void</span> <span class="enscript-function-name">alert_open</span>(<span class="enscript-type">const</span> <span class="enscript-type">char</span> *language)
- {
- <span class="enscript-keyword">if</span> (alert_state != ALERT_FRESH) <span class="enscript-keyword">return</span>;
- alert_state = ALERT_PRINTED;
- }
- #<span class="enscript-reference">else</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><stdio.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><unistd.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><string.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><sys/file.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><sys/param.h></span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><errno.h></span>
- #<span class="enscript-reference">ifdef</span> <span class="enscript-variable-name">_OS_NEXT_</span>
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">BUNDLE_PATH</span> <span class="enscript-string">"/usr/lib/NextStep/Resources"</span>
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">_PATH_CONSOLE</span> <span class="enscript-string">"/dev/console"</span>
- #<span class="enscript-reference">else</span>
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">BUNDLE_PATH</span> <span class="enscript-string">"/System/Library/CoreServices/Resources"</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><sys/ioctl_compat.h></span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">ifndef</span> <span class="enscript-variable-name">_PATH_CONSOLE</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><paths.h></span>
- #<span class="enscript-reference">endif</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string">"ni_globals.h"</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string">"system.h"</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><NetInfo/system_log.h></span>
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">KERNEL_PRIVATE</span>
- #<span class="enscript-reference">include</span> <span class="enscript-string"><dev/kmreg_com.h></span>
- #<span class="enscript-reference">undef</span> <span class="enscript-variable-name">KERNEL_PRIVATE</span>
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">MAXLINE</span> 4096
- #<span class="enscript-reference">define</span> <span class="enscript-variable-name">STRING_TABLE</span> <span class="enscript-string">"NetInfo"</span>
- <span class="enscript-type">static</span> <span class="enscript-type">const</span> <span class="enscript-type">char</span> SEARCH_MESSAGE[] =
- <span class="enscript-string">"\\nStill searching for parent network administration (NetInfo) "</span>
- <span class="enscript-string">"server.\\nPlease wait, or press 'c' to continue without network "</span>
- <span class="enscript-string">"user accounts.\\n\\nSee your system administrator if you need help.\\n"</span>;
- <span class="enscript-type">static</span> <span class="enscript-type">const</span> <span class="enscript-type">char</span> MESSAGE[] =
- <span class="enscript-string">"\nStill searching for parent network administration (NetInfo) "</span>
- <span class="enscript-string">"server.\nPlease wait, or press 'c' to continue without network "</span>
- <span class="enscript-string">"user accounts.\n\nSee your system administrator if you need help.\n"</span>;
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> aborted = 0;
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> console;
- <span class="enscript-type">static</span> <span class="enscript-type">int</span> console_flags;
- <span class="enscript-type">static</span> <span class="enscript-type">struct</span> sgttyb console_sg;
- <span class="enscript-type">static</span> <span class="enscript-type">enum</span> {
- ALERT_FRESH,
- ALERT_OPENED,
- ALERT_PRINTED,
- ALERT_CLOSED
- } alert_state = ALERT_CLOSED;
- <span class="enscript-comment">/*
- * Enable (or disable) alerts
- */</span>
- <span class="enscript-type">void</span>
- <span class="enscript-function-name">alert_enable</span>(<span class="enscript-type">int</span> enable)
- {
- <span class="enscript-keyword">if</span> (enable) alert_state = ALERT_FRESH;
- <span class="enscript-keyword">else</span> alert_state = ALERT_CLOSED;
- }
- <span class="enscript-comment">/*
- * Did the user abort the alert?
- */</span>
- <span class="enscript-type">int</span>
- <span class="enscript-function-name">alert_aborted</span>(<span class="enscript-type">void</span>)
- {
- <span class="enscript-keyword">return</span> (aborted);
- }
- <span class="enscript-comment">/*
- * Close an alert
- */</span>
- <span class="enscript-type">void</span>
- <span class="enscript-function-name">alert_close</span>(<span class="enscript-type">void</span>)
- {
- <span class="enscript-keyword">if</span> (alert_state != ALERT_PRINTED) <span class="enscript-keyword">return</span>;
- alert_state = ALERT_CLOSED;
- <span class="enscript-comment">/* Restore fd flags */</span>
- fcntl(console, F_SETFL, console_flags);
- <span class="enscript-comment">/* Restore terminal parameters */</span>
- ioctl(console, TIOCSETP, &console_sg);
- <span class="enscript-comment">/* Remove the window */</span>
- ioctl(console, KMIOCRESTORE, 0);
- close(console);
- }
- <span class="enscript-comment">/*
- * We got a SIGIO. Handle it.
- */</span>
- <span class="enscript-type">static</span> <span class="enscript-type">void</span>
- <span class="enscript-function-name">handle_io</span>(<span class="enscript-type">int</span> ignored)
- {
- <span class="enscript-type">char</span> buf[512];
- <span class="enscript-type">char</span> *cp;
- <span class="enscript-type">int</span> nchars;
- <span class="enscript-keyword">while</span> ((nchars = read(console, (<span class="enscript-type">char</span> *)&buf, <span class="enscript-keyword">sizeof</span>(buf))) > 0)
- {
- cp = buf;
- <span class="enscript-keyword">while</span> (nchars--)
- {
- <span class="enscript-keyword">if</span> ((*cp == <span class="enscript-string">'c'</span>) || (*cp == <span class="enscript-string">'C'</span>))
- {
- system_log(LOG_DEBUG, <span class="enscript-string">"Binding aborted"</span>);
- aborted = 1;
- alert_close();
- <span class="enscript-keyword">return</span>;
- }
- cp++;
- }
- }
- <span class="enscript-keyword">if</span> (errno != EWOULDBLOCK) alert_close();
- }
- <span class="enscript-comment">/*
- * Open an alert
- */</span>
- <span class="enscript-type">void</span>
- <span class="enscript-function-name">alert_open</span>(<span class="enscript-type">const</span> <span class="enscript-type">char</span> *language)
- {
- <span class="enscript-type">struct</span> sgttyb sg;
- FILE *fp;
- <span class="enscript-type">char</span> filename[MAXPATHLEN + 1];
- <span class="enscript-type">char</span> buf[MAXLINE];
- <span class="enscript-type">char</span> outmsg[MAXLINE];
- <span class="enscript-type">int</span> i, j, len;
- <span class="enscript-keyword">if</span> (alert_state != ALERT_FRESH) <span class="enscript-keyword">return</span>;
- alert_state = ALERT_OPENED;
- <span class="enscript-comment">/* Open up the console */</span>
- <span class="enscript-keyword">if</span> ((console = open(_PATH_CONSOLE, (O_RDWR|O_ALERT), 0)) < 0)
- {
- system_log(LOG_ERR, <span class="enscript-string">"console open failed: %s"</span>, strerror(errno));
- aborted = 1;
- <span class="enscript-keyword">return</span>;
- }
- <span class="enscript-comment">/* Flush any existing input */</span>
- ioctl(console, TIOCFLUSH, FREAD);
- <span class="enscript-comment">/* Set it up to interrupt on input */</span>
- <span class="enscript-keyword">if</span> ((console_flags = fcntl(console, F_GETFL, 0)) == -1)
- {
- system_log(LOG_ERR, <span class="enscript-string">"console F_GETFL fcntl failed: %s"</span>,
- strerror(errno));
- aborted = 1;
- close(console);
- <span class="enscript-keyword">return</span>;
- }
- <span class="enscript-keyword">if</span> (fcntl(console, F_SETFL, (console_flags|FASYNC|FNDELAY)) == -1)
- {
- system_log(LOG_ERR, <span class="enscript-string">"console F_SETFL fcntl failed: %s"</span>,
- strerror(errno));
- aborted = 1;
- close(console);
- <span class="enscript-keyword">return</span>;
- }
- signal(SIGIO, handle_io);
- <span class="enscript-comment">/* Put it in CBREAK mode */</span>
- <span class="enscript-keyword">if</span> (ioctl(console, TIOCGETP, &sg) == -1)
- {
- system_log(LOG_ERR, <span class="enscript-string">"console TIOCGETP ioctl failed: %s"</span>,
- strerror(errno));
- aborted = 1;
- close(console);
- <span class="enscript-keyword">return</span>;
- }
- console_sg = sg;
- sg.sg_flags |= CBREAK;
- sg.sg_flags &= ~ECHO;
- <span class="enscript-keyword">if</span> (ioctl(console, TIOCSETP, &sg) == -1)
- {
- system_log(LOG_ERR, <span class="enscript-string">"console TIOCSETP ioctl failed: %s"</span>,
- strerror(errno));
- aborted = 1;
- close(console);
- <span class="enscript-keyword">return</span>;
- }
- alert_state = ALERT_PRINTED;
- sprintf(filename, <span class="enscript-string">"%s/%s.lproj/%s.strings"</span>,
- BUNDLE_PATH, language, STRING_TABLE);
- len = strlen(MESSAGE);
- fp = fopen(filename, <span class="enscript-string">"r"</span>);
- <span class="enscript-keyword">if</span> (fp == NULL)
- {
- write(console, MESSAGE, len);
- <span class="enscript-keyword">return</span>;
- }
- <span class="enscript-keyword">while</span> (fgets(buf, MAXLINE, fp) != NULL)
- {
- <span class="enscript-keyword">if</span> (!strncmp(buf+1, SEARCH_MESSAGE, len))
- {
- <span class="enscript-keyword">for</span> (i = strlen(buf); ((buf[i] != <span class="enscript-string">'\"'</span>) && (i > 0)); i--);
- <span class="enscript-keyword">if</span> (i <= 0) <span class="enscript-keyword">break</span>;
- buf[i] = <span class="enscript-string">'\0'</span>;
- <span class="enscript-keyword">for</span> (i = strlen(SEARCH_MESSAGE) + 2; ((buf[i] != <span class="enscript-string">'\0'</span>) && (buf[i] != <span class="enscript-string">'\"'</span>)); i++);
- <span class="enscript-keyword">if</span> (buf[i] == <span class="enscript-string">'\0'</span>) <span class="enscript-keyword">break</span>;
- i++;
- j = 0;
- <span class="enscript-keyword">for</span> (; buf[i] != <span class="enscript-string">'\0'</span>; i++)
- {
- <span class="enscript-keyword">if</span> ((buf[i] == <span class="enscript-string">'\\'</span>) && (buf[i+1] == <span class="enscript-string">'n'</span>))
- {
- i++;
- outmsg[j++] = <span class="enscript-string">'\n'</span>;
- }
- <span class="enscript-keyword">else</span> outmsg[j++] = buf[i];
- }
- <span class="enscript-keyword">if</span> (j == 0) <span class="enscript-keyword">break</span>;
- fclose(fp);
- outmsg[j] = <span class="enscript-string">'\0'</span>;
- write(console, outmsg, j);
- <span class="enscript-keyword">return</span>;
- }
- }
- fclose(fp);
- write(console, MESSAGE, len);
- }
- #<span class="enscript-reference">endif</span> <span class="enscript-variable-name">NO_CONSOLE_SUPPORT</span>
- </pre>
- <hr />
- </body></html>