GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/mopd/mopd/../common/put.c Lines: 0 52 0.0 %
Date: 2017-11-07 Branches: 0 13 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: put.c,v 1.9 2017/07/29 07:18:03 florian Exp $ */
2
3
/*
4
 * Copyright (c) 1993-2006 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
 *
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.
25
 */
26
27
#include <stddef.h>
28
#include <sys/types.h>
29
#include <time.h>
30
#include "common/mopdef.h"
31
32
void
33
mopPutChar(u_char *pkt, int *idx, u_char value)
34
{
35
	pkt[*idx] = value;
36
	(*idx)++;
37
}
38
39
void
40
mopPutShort(u_char *pkt, int *idx, u_short value)
41
{
42
	pkt[*idx] = value % 256;
43
	pkt[*idx+1] = value / 256;
44
	*idx += 2;
45
}
46
47
void
48
mopPutNShort(u_char *pkt, int *idx, u_short value)
49
{
50
	pkt[*idx] = value / 256;
51
	pkt[*idx+1] = value % 256;
52
	*idx += 2;
53
}
54
55
void
56
mopPutLong(u_char *pkt, int *idx, u_long value)
57
{
58
	int i;
59
60
	for (i = 0; i < 4; i++) {
61
		pkt[*idx+i] = (u_char)(value % 256);
62
		value /= 256;
63
	}
64
	*idx += 4;
65
}
66
67
void
68
mopPutMulti(u_char *pkt, int *idx, u_char *value, int size)
69
{
70
	int i;
71
72
	for (i = 0; i < size; i++)
73
		pkt[*idx+i] = value[i];
74
	*idx += size;
75
}
76
77
void
78
mopPutTime(u_char *pkt, int *idx, time_t value)
79
{
80
	time_t		 tnow;
81
	struct tm	*timenow;
82
83
	if (value == 0)
84
		tnow = time(NULL);
85
	else
86
		tnow = value;
87
88
	timenow = localtime(&tnow);
89
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);
101
}
102
103
void
104
mopPutHeader(u_char *pkt, int *idx, u_char *dst, u_char *src, u_short proto,
105
    int trans)
106
{
107
	mopPutMulti(pkt, idx, dst, 6);
108
	mopPutMulti(pkt, idx, src, 6);
109
	if (trans == TRANS_8023) {
110
		mopPutShort(pkt, idx, 0);
111
		mopPutChar(pkt, idx, MOP_K_PROTO_802_DSAP);
112
		mopPutChar(pkt, idx, MOP_K_PROTO_802_SSAP);
113
		mopPutChar(pkt, idx, MOP_K_PROTO_802_CNTL);
114
		mopPutChar(pkt, idx, 0x08);
115
		mopPutChar(pkt, idx, 0x00);
116
		mopPutChar(pkt, idx, 0x2b);
117
	}
118
#if !defined(__FreeBSD__)
119
	mopPutNShort(pkt, idx, proto);
120
#else
121
	if (trans == TRANS_8023) {
122
		mopPutNShort(pkt, idx, proto);
123
	} else {
124
		mopPutShort(pkt, idx, proto);
125
	}
126
#endif
127
	if (trans == TRANS_ETHER)
128
		mopPutShort(pkt, idx, 0);
129
130
}
131
132
void
133
mopPutLength(u_char *pkt, int trans, u_short len)
134
{
135
	int	 idx;
136
137
	switch (trans) {
138
	case TRANS_ETHER:
139
		idx = 14;
140
		mopPutShort(pkt, &idx, len-16);
141
		break;
142
	case TRANS_8023:
143
		idx = 12;
144
#if !defined(__FreeBSD__)
145
		mopPutNShort(pkt, &idx, len-14);
146
#else
147
		mopPutShort(pkt, &idx, len-14);
148
#endif
149
		break;
150
	}
151
}