You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.4 KiB
82 lines
2.4 KiB
// --- T2-COPYRIGHT-NOTE-BEGIN --- |
|
// This copyright note is auto-generated by ./scripts/Create-CopyPatch. |
|
// |
|
// T2 SDE: package/.../iproute2/ipnm2nwbc.c |
|
// Copyright (C) 2004 - 2006 The T2 SDE Project |
|
// Copyright (C) 1998 - 2003 Clifford Wolf |
|
// |
|
// More information can be found in the files COPYING and README. |
|
// |
|
// This program is free software; you can redistribute it and/or modify |
|
// it under the terms of the GNU General Public License as published by |
|
// the Free Software Foundation; version 2 of the License. A copy of the |
|
// GNU General Public License can be found in the file COPYING. |
|
// --- T2-COPYRIGHT-NOTE-END --- |
|
|
|
#include <stdio.h> |
|
|
|
int getbits(int n) { |
|
int rc=0; |
|
while (n) { |
|
if (n&1) rc++; |
|
n = n >> 1; |
|
} |
|
return rc; |
|
} |
|
|
|
int setbits(int n) { |
|
int rc=0; |
|
while (n--) { |
|
rc = (rc>>1)|(1<<7); |
|
} |
|
return rc; |
|
} |
|
|
|
int main(int argc, char ** argv) { |
|
int ip[4],nm[4],nw[4],bc[4],c; |
|
int verbose=0,nmbits=0,n; |
|
|
|
if ( argc > 1 && !strcmp(argv[1],"-v") ) verbose=1; |
|
|
|
if ( argc == 3+verbose && |
|
sscanf(argv[1+verbose],"%d.%d.%d.%d",ip,ip+1,ip+2,ip+3) == 4 && |
|
sscanf(argv[2+verbose],"%d.%d.%d.%d",nm,nm+1,nm+2,nm+3) == 4 ) { |
|
nmbits=getbits(nm[0])+getbits(nm[1])+ |
|
getbits(nm[2])+getbits(nm[3]); |
|
} else if ( argc == 2+verbose && sscanf(argv[1+verbose], |
|
"%d.%d.%d.%d/%d",ip,ip+1,ip+2,ip+3,&nmbits) == 5 ) { |
|
n=nmbits; |
|
if (n>0) { nm[0]=setbits(n>8?8:n); n-=8; } else nm[0]=0; |
|
if (n>0) { nm[1]=setbits(n>8?8:n); n-=8; } else nm[1]=0; |
|
if (n>0) { nm[2]=setbits(n>8?8:n); n-=8; } else nm[2]=0; |
|
if (n>0) { nm[3]=setbits(n>8?8:n); n-=8; } else nm[3]=0; |
|
} else { |
|
fprintf(stderr,"\n" |
|
"IP and Netmask to Network and Broadcast converter.\n" |
|
"(C) under GPL, 1999 Clifford Wolf\n\n" |
|
"Usage: %s [-v] <IP> <Netmask>\n" |
|
" %s [-v] <IP>/<Mask>\n\n" |
|
"Examples: %s -v 195.170.70.72/25\n" |
|
" %s 195.170.70.72 255.255.255.128\n\n", |
|
argv[0],argv[0],argv[0],argv[0]); |
|
return 1; |
|
} |
|
|
|
for (c=0; c<4; c++) { |
|
nw[c]=ip[c]&nm[c]; |
|
bc[c]=nw[c]|(255&~nm[c]); |
|
} |
|
|
|
if ( verbose ) { |
|
printf("Network: %d.%d.%d.%d / %d\n", |
|
nw[0],nw[1],nw[2],nw[3],nmbits); |
|
printf("Netmask: %d.%d.%d.%d\n", |
|
nm[0],nm[1],nm[2],nm[3]); |
|
printf("Broadcast: %d.%d.%d.%d\n", |
|
bc[0],bc[1],bc[2],bc[3]); |
|
} else { |
|
printf("%d.%d.%d.%d %d.%d.%d.%d\n",nw[0],nw[1], |
|
nw[2],nw[3],bc[0],bc[1],bc[2],bc[3]); |
|
} |
|
return 0; |
|
}
|
|
|