1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
23 /* All Rights Reserved */
24
25
26 #ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.10 */
27 /* LINTLIBRARY */
28
29 # include <stdarg.h>
30 # include <string.h>
31 # include <errno.h>
32
33 # include "msgs.h"
34
35 extern char *_lp_msg_fmts[];
36 extern int errno;
37
38 /* VARARGS */
39 #if defined(__STDC__)
_putmessage(char * buf,short type,va_list arg)40 int _putmessage ( char * buf, short type, va_list arg )
41 #else
42 int _putmessage (buf, type, arg)
43 char *buf;
44 short type;
45 va_list arg;
46 #endif
47 {
48 char *fmt;
49 char *t_string;
50 int size = 0;
51 long t_long;
52 short t_short;
53
54 if (type < 0 || type > LAST_MESSAGE)
55 {
56 errno = EBADMSG;
57 return(-1);
58 }
59
60 if (buf)
61 (void) htos(buf + MESG_TYPE, type);
62
63 size = MESG_LEN;
64
65 fmt = _lp_msg_fmts[type];
66
67 while (*fmt != '\0')
68 switch(*fmt++)
69 {
70 case 'H':
71 t_short = (short) va_arg(arg, int);
72 if (buf)
73 (void) htos(buf + size, t_short);
74
75 size += 4;
76 break;
77
78 case 'L':
79 t_long = (long) va_arg(arg, int);
80 if (buf)
81 (void) ltos(buf + size, t_long);
82
83 size += 8;
84 break;
85
86 case 'S':
87 t_string = (char *) va_arg(arg, char *);
88 t_short = (t_string? strlen(t_string) : 0) + 1;
89
90 if (buf)
91 (void) htos(buf + size, t_short);
92
93 size += 4;
94
95 if (buf)
96 if (t_string)
97 (void) memcpy(buf + size, t_string, t_short);
98 else
99 (buf + size)[0] = 0;
100
101 size += t_short;
102 break;
103
104 case 'D':
105 t_short = (short) va_arg(arg, int) + 1;
106 t_string = (char *) va_arg(arg, char *);
107
108 if (buf)
109 (void) htos(buf + size, t_short);
110
111 size += 4;
112
113 if (buf)
114 if (t_string)
115 {
116 (void) memcpy(buf + size, t_string, t_short);
117 buf[size + t_short - 1] = '\0';
118 }
119 else
120 *(buf + size) = '\0';
121
122 size += t_short;
123 break;
124 }
125
126
127 if (buf)
128 *(buf + size) = '\0';
129
130 size++; /* Add a null, just on general principle */
131
132 if (buf)
133 (void) htos(buf + MESG_SIZE, size);
134
135 return(size);
136 }
137