put.c revision 1.2 1 /* $NetBSD: put.c,v 1.2 1997/03/25 03:07:33 thorpej Exp $ */
2
3 /*
4 * Copyright (c) 1993-95 Mats O Jansson. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by Mats O Jansson.
17 * 4. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #ifndef LINT
33 static char rcsid[] = "$NetBSD: put.c,v 1.2 1997/03/25 03:07:33 thorpej Exp $";
34 #endif
35
36 #include <stddef.h>
37 #include <sys/types.h>
38 #include <time.h>
39 #include "common/mopdef.h"
40
41 void
42 mopPutChar(pkt, index, value)
43 register u_char *pkt;
44 register int *index;
45 u_char value;
46 {
47 pkt[*index] = value;
48 *index = *index + 1;
49 }
50
51 void
52 mopPutShort(pkt, index, value)
53 register u_char *pkt;
54 register int *index;
55 u_short value;
56 {
57 int i;
58 for (i = 0; i < 2; i++) {
59 pkt[*index+i] = value % 256;
60 value = value / 256;
61 }
62 *index = *index + 2;
63 }
64
65 void
66 mopPutLong(pkt, index, value)
67 register u_char *pkt;
68 register int *index;
69 u_long value;
70 {
71 int i;
72 for (i = 0; i < 4; i++) {
73 pkt[*index+i] = value % 256;
74 value = value / 256;
75 }
76 *index = *index + 4;
77 }
78
79 void
80 mopPutMulti(pkt, index, value, size)
81 register u_char *pkt,*value;
82 register int *index,size;
83 {
84 int i;
85
86 for (i = 0; i < size; i++) {
87 pkt[*index+i] = value[i];
88 }
89 *index = *index + size;
90 }
91
92 void
93 mopPutTime(pkt, index, value)
94 register u_char *pkt;
95 register int *index;
96 time_t value;
97 {
98 time_t tnow;
99 struct tm *timenow;
100
101 if ((value == 0)) {
102 tnow = time(NULL);
103 } else {
104 tnow = value;
105 }
106
107 timenow = localtime(&tnow);
108
109 mopPutChar (pkt,index,10);
110 mopPutChar (pkt,index,(timenow->tm_year / 100) + 19);
111 mopPutChar (pkt,index,(timenow->tm_year % 100));
112 mopPutChar (pkt,index,(timenow->tm_mon + 1));
113 mopPutChar (pkt,index,(timenow->tm_mday));
114 mopPutChar (pkt,index,(timenow->tm_hour));
115 mopPutChar (pkt,index,(timenow->tm_min));
116 mopPutChar (pkt,index,(timenow->tm_sec));
117 mopPutChar (pkt,index,0x00);
118 mopPutChar (pkt,index,0x00);
119 mopPutChar (pkt,index,0x00);
120 }
121
122 void
123 mopPutHeader(pkt, index, dst, src, proto, trans)
124 register u_char *pkt;
125 register int *index;
126 char dst[], src[];
127 u_short proto;
128 int trans;
129 {
130
131 mopPutMulti(pkt, index, dst, 6);
132 mopPutMulti(pkt, index, src, 6);
133 if (trans == TRANS_8023) {
134 mopPutShort(pkt, index, 0);
135 mopPutChar (pkt, index, MOP_K_PROTO_802_DSAP);
136 mopPutChar (pkt, index, MOP_K_PROTO_802_SSAP);
137 mopPutChar (pkt, index, MOP_K_PROTO_802_CNTL);
138 mopPutChar (pkt, index, 0x08);
139 mopPutChar (pkt, index, 0x00);
140 mopPutChar (pkt, index, 0x2b);
141 }
142 #if !defined(__FreeBSD__)
143 mopPutChar(pkt, index, (proto / 256));
144 mopPutChar(pkt, index, (proto % 256));
145 #else
146 if (trans == TRANS_8023) {
147 mopPutChar(pkt, index, (proto / 256));
148 mopPutChar(pkt, index, (proto % 256));
149 } else {
150 mopPutChar(pkt, index, (proto % 256));
151 mopPutChar(pkt, index, (proto / 256));
152 }
153 #endif
154 if (trans == TRANS_ETHER)
155 mopPutShort(pkt, index, 0);
156
157 }
158
159 void
160 mopPutLength(pkt, trans, len)
161 register u_char *pkt;
162 int trans;
163 u_short len;
164 {
165 int index = 0;
166
167 switch(trans) {
168 case TRANS_ETHER:
169 index = 14;
170 mopPutChar(pkt, &index, ((len - 16) % 256));
171 mopPutChar(pkt, &index, ((len - 16) / 256));
172 break;
173 case TRANS_8023:
174 index = 12;
175 #if !defined(__FreeBSD__)
176 mopPutChar(pkt, &index, ((len - 14) / 256));
177 mopPutChar(pkt, &index, ((len - 14) % 256));
178 #else
179 mopPutChar(pkt, &index, ((len - 14) % 256));
180 mopPutChar(pkt, &index, ((len - 14) / 256));
181 #endif
182 break;
183 }
184
185 }
186
187
188
189