1
0
This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Files
2024-07-22 01:58:46 -03:00

111 lines
2.6 KiB
C

/* atmaddr.c - Get/set local ATM adresses */
/* Written 1995-2000 by Werner Almesberger, EPFL-LRC/ICA */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <atm.h>
#include <linux/atmdev.h>
#define MAX_ADDR 1024 /* that should do it for now ... */
static void usage(const char *name)
{
fprintf(stderr,"usage: %s [-n] [itf]\n",name);
fprintf(stderr,"%6s %s -r [itf]\n","",name);
fprintf(stderr,"%6s %s -a [itf] atm_addr\n","",name);
fprintf(stderr,"%6s %s -d [itf] atm_addr\n","",name);
fprintf(stderr,"%6s %s -V\n","",name);
exit(1);
}
int main(int argc,char **argv)
{
struct atmif_sioc req;
struct sockaddr_atmsvc addr[MAX_ADDR];
char buffer[MAX_ATM_ADDR_LEN+1];
const char *itf,*name;
char *end;
int pretty;
int cmd,s,i;
req.number = 0;
cmd = 0; /* for gcc */
itf = NULL;
pretty = A2T_PRETTY | A2T_NAME;
name = *argv;
if (argc == 2 && !strcmp(argv[1],"-V")) {
printf("%s\n",VERSION);
return 0;
}
if (argc > 1 && !strcmp(argv[1],"-n")) {
pretty = A2T_PRETTY;
argc--;
argv++;
}
if (argc < 2) cmd = ATM_GETADDR;
else if (*argv[1] != '-') {
if (argc != 2) usage(name);
cmd = ATM_GETADDR;
itf = argv[1];
}
else {
if (!argv[1][1] || argv[1][2]) usage(name);
switch (argv[1][1]) {
case 'r':
if (argc < 2 || argc > 3) usage(name);
if (argc == 3) itf = argv[2];
cmd = ATM_RSTADDR;
break;
case 'a':
case 'd':
if (argc < 3 || argc > 4) usage(name);
if (argc == 4) itf = argv[2];
cmd = argv[1][1] == 'a' ? ATM_ADDADDR : ATM_DELADDR;
memset(&addr,0,sizeof(addr));
if (text2atm(argv[argc-1],(struct sockaddr *) addr,
sizeof(*addr),T2A_SVC | T2A_NAME) < 0) usage(name);
break;
default:
usage(name);
}
}
if (itf) {
req.number = strtoul(itf,&end,10);
if (*end) usage(name);
}
if ((s = socket(PF_ATMSVC,SOCK_DGRAM,0)) < 0) {
perror("socket");
return 1;
}
req.arg = addr;
req.length = cmd == ATM_GETADDR ? sizeof(addr) : sizeof(*addr);
if (ioctl(s,cmd,&req) < 0) {
perror("ioctl ATM_xxxADDR");
return 1;
}
if (cmd != ATM_GETADDR) return 0;
if (req.length % sizeof(*addr)) {
fprintf(stderr,"internal error: len %d %% %d\n",req.length,
sizeof(*addr));
return 1;
}
for (i = 0; i < req.length/sizeof(*addr); i++) {
if (atm2text(buffer,MAX_ATM_ADDR_LEN+1,(struct sockaddr *) &addr[i],
pretty) < 0) {
fprintf(stderr,"bad address (internal error)\n");
return 1;
}
printf("%s\n",buffer);
}
return 0;
}