- if(_simple_sprintf(b, "%10u [Time ", 0))
- break;
- gettimeofday(&tv, NULL);
- if(_simple_esprintf(b, _asl_escape, "%lu", tv.tv_sec))
- break;
- if(_simple_sappend(b, "] [Host] [Sender "))
- break;
- if(_simple_esappend(b, _asl_escape, getprogname()))
- break;
- if(_simple_sappend(b, "] [PID "))
- break;
- if(_simple_esprintf(b, _asl_escape, "%u", getpid()))
- break;
- if(_simple_sappend(b, "] [UID "))
- break;
- if(_simple_esprintf(b, _asl_escape, "%d", getuid()))
- break;
- if(_simple_sappend(b, "] [GID "))
- break;
- if(_simple_esprintf(b, _asl_escape, "%d", getgid()))
- break;
- if(_simple_sappend(b, "] [Level "))
- break;
- if(_simple_esprintf(b, _asl_escape, "%d", level))
- break;
- if(_simple_sappend(b, "] [Message "))
- break;
- if(_simple_esappend(b, _asl_escape, message))
- break;
- /* remove trailing (escaped) newlines */
- cp = _simple_string(b);
- cp += strlen(cp);
- for(;;) {
- cp -= 2;
- if(strcmp(cp, "\\n") != 0)
- break;
- *cp = 0;
- }
- _simple_sresize(b);
- if(_simple_sappend(b, "] [Facility "))
- break;
- if(_simple_esappend(b, _asl_escape, facility))
- break;
- if(_simple_sappend(b, "]\n"))
- break;
- cp = _simple_string(b);
- u = strlen(cp) - 10; // includes newline and null
- bp = cp + 10;
- if(u == 0)
- *--bp = '0';
- else
- while(bp > cp && u) {
- *--bp = u % 10 + '0';
- u /= 10;
- }
- write(asl_socket, cp, strlen(cp) + 1);
- } while(0);
- _simple_sfree(b);
+ if ((b = _simple_salloc()) == NULL) return;
+
+ do
+ {
+ kern_return_t kstatus;
+ vm_address_t out;
+ int outlen;
+ char *cp;
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+
+ if (_simple_sprintf(b, " 0 [Time ", 0)) break;
+ if (_simple_esprintf(b, _asl_escape, "%lu", tv.tv_sec)) break;
+ if (_simple_sappend(b, "] [Sender ")) break;
+ if (_simple_esappend(b, _asl_escape, prog)) break;
+ if (_simple_sappend(b, "] [Level ")) break;
+ if (_simple_esprintf(b, _asl_escape, "%d", level)) break;
+ if (_simple_sappend(b, "] [Facility ")) break;
+ if (_simple_esappend(b, _asl_escape, facility)) break;
+ if (_simple_sappend(b, "] [Message ")) break;
+ if (_simple_esappend(b, _asl_escape, message)) break;
+
+ /* remove trailing (escaped) newlines */
+ cp = _simple_string(b);
+ cp += strlen(cp);
+ for (;;)
+ {
+ cp -= 2;
+ if (strcmp(cp, "\\n") != 0) break;
+ *cp = 0;
+ }
+
+ _simple_sresize(b);
+
+ if (_simple_sappend(b, "]\n")) break;
+
+ cp = _simple_string(b);
+
+ /*
+ * The MIG defs for _asl_server_message specifies "dealloc",
+ * so we copy the string into a new vm buffer and send that.
+ */
+ outlen = strlen(cp);
+ kstatus = vm_allocate(mach_task_self(), &out, outlen, TRUE);
+ if (kstatus != KERN_SUCCESS) break;
+
+ memcpy((void *)out, cp, outlen);
+ _asl_server_message(asl_port, (caddr_t)out, outlen);
+ } while (0);
+
+ _simple_sfree(b);
+}
+
+void
+_simple_asl_log(int level, const char *facility, const char *message)
+{
+ _simple_asl_log_prog(level, facility, message, getprogname());