Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libcs/csfrom.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1990-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
/*
22
* Glenn Fowler
23
* AT&T Research
24
*
25
* read datagram
26
*/
27
28
#include "cslib.h"
29
30
ssize_t
31
csfrom(register Cs_t* state, int fd, void* buf, size_t siz, Csaddr_t* addr)
32
{
33
34
#if CS_LIB_V10
35
36
ssize_t n;
37
struct udpaddr udp;
38
39
if (read(fd, &udp, sizeof(udp)) != sizeof(udp))
40
{
41
messagef((state->id, NiL, -1, "from: %d: udp header read error", fd));
42
return -1;
43
}
44
if (addr)
45
{
46
addr->addr[0] = udp.host;
47
addr->addr[1] = udp.port;
48
addr->addr[2] = 0;
49
}
50
if ((n = read(fd, buf, siz)) < 0) messagef((state->id, NiL, -1, "from: %d: udp data read error", fd));
51
else messagef((state->id, NiL, -8, "from(%d,*,%d) = %d, data = `%-.*s', addr = %s, port = %u", fd, siz, n, n, buf, csntoa(state, udp.host), udp.port));
52
return n;
53
54
#else
55
56
#if CS_LIB_SOCKET
57
58
ssize_t n;
59
Sock_size_t len;
60
struct sockaddr_in nam;
61
62
len = sizeof(nam);
63
if ((n = recvfrom(fd, buf, siz, 0, (struct sockaddr*)&nam, &len)) < 0)
64
{
65
messagef((state->id, NiL, -1, "from: %d: recvfrom error", fd));
66
return -1;
67
}
68
if (addr)
69
{
70
addr->addr[0] = (unsigned long)nam.sin_addr.s_addr;
71
addr->addr[1] = (unsigned long)nam.sin_port;
72
}
73
messagef((state->id, NiL, -8, "from(%d,*,%d) = %d, data = `%-.*s', addr = %s, port = %u", fd, siz, n, n, buf, csntoa(state, (unsigned long)nam.sin_addr.s_addr), (unsigned long)nam.sin_port));
74
return n;
75
76
#else
77
78
errno = EINVAL;
79
messagef((state->id, NiL, -1, "from: %d: udp read not supported", fd));
80
return -1;
81
82
#endif
83
84
#endif
85
86
}
87
88
ssize_t
89
_cs_from(int fd, void* buf, size_t siz, Csaddr_t* addr)
90
{
91
return csfrom(&cs, fd, buf, siz, addr);
92
}
93
94