Expand PMF_FN_* macros.
[netbsd-mini2440.git] / usr.sbin / mopd / common / put.c
blob0dfadb3e807efc3d03ae367c5e88234fc7ce6f88
1 /* $NetBSD: put.c,v 1.5 2009/10/20 00:51:13 snj Exp $ */
3 /*
4 * Copyright (c) 1993-95 Mats O Jansson. All rights reserved.
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.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include <sys/cdefs.h>
28 #ifndef lint
29 __RCSID("$NetBSD: put.c,v 1.5 2009/10/20 00:51:13 snj Exp $");
30 #endif
32 #include "os.h"
33 #include "mopdef.h"
34 #include "put.h"
36 void
37 mopPutChar(u_char *pkt, int *idx, u_char value)
39 pkt[*idx] = value;
40 *idx = *idx + 1;
43 void
44 mopPutShort(u_char *pkt, int *idx, u_short value)
46 int i;
47 for (i = 0; i < 2; i++) {
48 pkt[*idx+i] = value % 256;
49 value = value / 256;
51 *idx = *idx + 2;
54 void
55 mopPutLong(u_char *pkt, int *idx, u_int32_t value)
57 int i;
58 for (i = 0; i < 4; i++) {
59 pkt[*idx+i] = value % 256;
60 value = value / 256;
62 *idx = *idx + 4;
65 void
66 mopPutMulti(u_char *pkt, int *idx, const u_char *value, int size)
68 int i;
70 for (i = 0; i < size; i++) {
71 pkt[*idx+i] = value[i];
73 *idx = *idx + size;
76 void
77 mopPutTime(u_char *pkt, int *idx, time_t value)
79 time_t tnow;
80 struct tm *timenow;
82 if ((value == 0)) {
83 tnow = time(NULL);
84 } else {
85 tnow = value;
88 timenow = localtime(&tnow);
90 mopPutChar (pkt,idx,10);
91 mopPutChar (pkt,idx,(timenow->tm_year / 100) + 19);
92 mopPutChar (pkt,idx,(timenow->tm_year % 100));
93 mopPutChar (pkt,idx,(timenow->tm_mon + 1));
94 mopPutChar (pkt,idx,(timenow->tm_mday));
95 mopPutChar (pkt,idx,(timenow->tm_hour));
96 mopPutChar (pkt,idx,(timenow->tm_min));
97 mopPutChar (pkt,idx,(timenow->tm_sec));
98 mopPutChar (pkt,idx,0x00);
99 mopPutChar (pkt,idx,0x00);
100 mopPutChar (pkt,idx,0x00);
103 void
104 mopPutHeader(u_char *pkt, int *idx, const u_char *dst, const u_char *src,
105 u_short proto, int trans)
108 mopPutMulti(pkt, idx, dst, 6);
109 mopPutMulti(pkt, idx, src, 6);
110 if (trans == TRANS_8023) {
111 mopPutShort(pkt, idx, 0);
112 mopPutChar (pkt, idx, MOP_K_PROTO_802_DSAP);
113 mopPutChar (pkt, idx, MOP_K_PROTO_802_SSAP);
114 mopPutChar (pkt, idx, MOP_K_PROTO_802_CNTL);
115 mopPutChar (pkt, idx, 0x08);
116 mopPutChar (pkt, idx, 0x00);
117 mopPutChar (pkt, idx, 0x2b);
119 #if !defined(__FreeBSD__)
120 mopPutChar(pkt, idx, (proto / 256));
121 mopPutChar(pkt, idx, (proto % 256));
122 #else
123 if (trans == TRANS_8023) {
124 mopPutChar(pkt, idx, (proto / 256));
125 mopPutChar(pkt, idx, (proto % 256));
126 } else {
127 mopPutChar(pkt, idx, (proto % 256));
128 mopPutChar(pkt, idx, (proto / 256));
130 #endif
131 if (trans == TRANS_ETHER)
132 mopPutShort(pkt, idx, 0);
136 void
137 mopPutLength(u_char *pkt, int trans, u_short len)
139 int idx = 0;
141 switch(trans) {
142 case TRANS_ETHER:
143 idx = 14;
144 mopPutChar(pkt, &idx, ((len - 16) % 256));
145 mopPutChar(pkt, &idx, ((len - 16) / 256));
146 break;
147 case TRANS_8023:
148 idx = 12;
149 #if !defined(__FreeBSD__)
150 mopPutChar(pkt, &idx, ((len - 14) / 256));
151 mopPutChar(pkt, &idx, ((len - 14) % 256));
152 #else
153 mopPutChar(pkt, &idx, ((len - 14) % 256));
154 mopPutChar(pkt, &idx, ((len - 14) / 256));
155 #endif
156 break;