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__) 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