[go: up one dir, main page]

Menu

[fc3a13]: / lib / ash.c  Maximize  Restore  History

Download this file

128 lines (103 with data), 2.4 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
* lib/ash.c This file contains an implementation of the Ash
* support functions for the NET-2 base distribution.
*/
#include "config.h"
#if HAVE_HWASH || HAVE_AFASH
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if_arp.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include "net-support.h"
#include "pathnames.h"
#include "intl.h"
#include "util.h"
#define ASH_ALEN 64
static unsigned char hamming[16] =
{
0x15, 0x02, 0x49, 0x5e, 0x64, 0x73, 0x38, 0x2f,
0xd0, 0xc7, 0x8c, 0x9b, 0xa1, 0xb6, 0xfd, 0xea
};
/* Display an Ash address in readable format. */
static const char *
pr_ash(const char *ptr)
{
static char buff[128];
char *p = buff;
unsigned int i = 0;
p[0] = '[';
p++;
while (ptr[i] != 0xc9 && ptr[i] != 0xff && (i < ASH_ALEN))
sprintf(p++, "%1x", ptr[i++]);
*(p++) = ']';
*p = 0;
return buff;
}
#if HAVE_HWASH
#ifndef ARPHRD_ASH
#warning "No definition of ARPHRD_ASH in <net/if_arp.h>, using private value 517"
#define ARPHRD_ASH 517
#endif
struct hwtype ash_hwtype;
static int
in_ash(char *bufp, struct sockaddr_storage *sasp)
{
struct sockaddr *sap = (struct sockaddr *)sasp;
char *ptr;
unsigned int i = 0;
sap->sa_family = ash_hwtype.type;
ptr = sap->sa_data;
while (bufp && i < ASH_ALEN) {
char *next;
int hop = strtol(bufp, &next, 16);
ptr[i++] = hamming[hop];
switch (*next) {
case ':':
bufp = next + 1;
break;
case 0:
bufp = NULL;
break;
default:
fprintf(stderr, _("Malformed Ash address"));
memset(ptr, 0xc9, ASH_ALEN);
return -1;
}
}
while (i < ASH_ALEN)
ptr[i++] = 0xc9;
return 0;
}
struct hwtype ash_hwtype =
{
"ash", NULL, ARPHRD_ASH, ASH_ALEN,
pr_ash, in_ash, NULL,
1
};
#endif /* HAVE_HWASH */
#if HAVE_AFASH
/* Display an Ash socket address. */
static const char *
pr_sash(const struct sockaddr_storage *sasp, int numeric)
{
const struct sockaddr *sap = (const struct sockaddr *)sasp;
static char buf[64];
if (sap->sa_family != AF_ASH)
return safe_strncpy(buf, "[NONE SET]", 64);
return pr_ash(sap->sa_data);
}
struct aftype ash_aftype =
{
"ash", NULL, AF_ASH, 0,
pr_ash, pr_sash, NULL, NULL,
NULL, NULL, NULL,
-1,
"/proc/sys/net/ash"
};
#endif /* HAVE_AFASH */
#endif /* HAVE_AFASH || HAVE_HWASH */