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
35extern char	*_lp_msg_fmts[];
36extern int	errno;
37
38/* VARARGS */
39#if	defined(__STDC__)
40int _putmessage ( char * buf, short type, va_list arg )
41#else
42int _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