147
156
int flag_opt = 0;
148
157
int flag_raw = 0;
149
158
int flag_tcp = 0;
150
160
int flag_udp = 0;
161
int flag_udplite = 0;
151
162
int flag_igmp= 0;
152
163
int flag_rom = 0;
153
164
int flag_exp = 1;
154
165
int flag_wide= 0;
155
166
int flag_prg = 0;
156
167
int flag_arg = 0;
157
169
int flag_ver = 0;
172
int flag_selinux = 0;
161
#define INFO_GUTS1(file,name,proc) \
176
#define INFO_GUTS1(file,name,proc,prot) \
162
177
procinfo = proc_fopen((file)); \
163
178
if (procinfo == NULL) { \
164
if (errno != ENOENT) { \
179
if (errno != ENOENT && errno != EACCES) { \
165
180
perror((file)); \
168
if (flag_arg || flag_ver) \
183
if (!flag_noprot && (flag_arg || flag_ver)) \
169
184
ESYSNOT("netstat", (name)); \
185
if (!flag_noprot && flag_arg) \
174
189
if (fgets(buffer, sizeof(buffer), procinfo)) \
175
(proc)(lnr++, buffer); \
190
(proc)(lnr++, buffer,prot); \
176
191
} while (!feof(procinfo)); \
177
192
fclose(procinfo); \
181
#define INFO_GUTS2(file,proc) \
196
#define INFO_GUTS2(file,proc,prot) \
183
198
procinfo = proc_fopen((file)); \
184
199
if (procinfo != NULL) { \
186
201
if (fgets(buffer, sizeof(buffer), procinfo)) \
187
(proc)(lnr++, buffer); \
202
(proc)(lnr++, buffer,prot); \
188
203
} while (!feof(procinfo)); \
189
204
fclose(procinfo); \
192
#define INFO_GUTS2(file,proc)
207
#define INFO_GUTS2(file,proc,prot)
195
210
#define INFO_GUTS3 \
198
#define INFO_GUTS6(file,file6,name,proc) \
213
#define INFO_GUTS6(file,file6,name,proc,prot4,prot6) \
199
214
char buffer[8192]; \
202
217
if (!flag_arg || flag_inet) { \
203
INFO_GUTS1(file,name,proc) \
218
INFO_GUTS1(file,name,proc,prot4) \
205
220
if (!flag_arg || flag_inet6) { \
206
INFO_GUTS2(file6,proc) \
221
INFO_GUTS2(file6,proc,prot6) \
210
#define INFO_GUTS(file,name,proc) \
225
#define INFO_GUTS(file,name,proc,prot) \
211
226
char buffer[8192]; \
214
INFO_GUTS1(file,name,proc) \
229
INFO_GUTS1(file,name,proc,prot) \
217
232
#define PROGNAME_WIDTHs PROGNAME_WIDTH1(PROGNAME_WIDTH)
218
233
#define PROGNAME_WIDTH1(s) PROGNAME_WIDTH2(s)
219
234
#define PROGNAME_WIDTH2(s) #s
236
#define SELINUX_WIDTHs SELINUX_WIDTH1(SELINUX_WIDTH)
237
#define SELINUX_WIDTH1(s) SELINUX_WIDTH2(s)
238
#define SELINUX_WIDTH2(s) #s
221
240
#define PRG_HASH_SIZE 211
223
242
static struct prg_node {
224
243
struct prg_node *next;
225
244
unsigned long inode;
226
245
char name[PROGNAME_WIDTH];
246
char scon[SELINUX_WIDTH];
227
247
} *prg_hash[PRG_HASH_SIZE];
229
249
static char prg_cache_loaded = 0;
353
399
static void prg_cache_load(void)
355
char line[LINE_MAX],eacces=0;
356
int procfdlen,fd,cmdllen,lnamelen;
357
char lname[30],cmdlbuf[512],finbuf[PROGNAME_WIDTH];
401
char line[LINE_MAX], eacces=0;
402
int procfdlen, fd, cmdllen, lnamelen;
403
char lname[30], cmdlbuf[512], finbuf[PROGNAME_WIDTH];
358
404
unsigned long inode;
359
const char *cs,*cmdlp;
360
DIR *dirproc=NULL,*dirfd=NULL;
361
struct dirent *direproc,*direfd;
405
const char *cs, *cmdlp;
406
DIR *dirproc = NULL, *dirfd = NULL;
407
struct dirent *direproc, *direfd;
409
security_context_t scon = NULL;
363
412
if (prg_cache_loaded || !flag_prg) return;
365
cmdlbuf[sizeof(cmdlbuf)-1]='\0';
413
prg_cache_loaded = 1;
414
cmdlbuf[sizeof(cmdlbuf) - 1] = '\0';
366
415
if (!(dirproc=opendir(PATH_PROC))) goto fail;
367
while (errno=0,direproc=readdir(dirproc)) {
368
#ifdef DIRENT_HAVE_D_TYPE_WORKS
369
if (direproc->d_type!=DT_DIR) continue;
371
for (cs=direproc->d_name;*cs;cs++)
416
while (errno = 0, direproc = readdir(dirproc)) {
417
for (cs = direproc->d_name; *cs; cs++)
376
procfdlen=snprintf(line,sizeof(line),PATH_PROC_X_FD,direproc->d_name);
377
if (procfdlen<=0 || procfdlen>=sizeof(line)-5)
422
procfdlen = snprintf(line,sizeof(line),PATH_PROC_X_FD,direproc->d_name);
423
if (procfdlen <= 0 || procfdlen >= sizeof(line) - 5)
426
dirfd = opendir(line);
386
432
line[procfdlen] = '/';
388
434
while ((direfd = readdir(dirfd))) {
389
#ifdef DIRENT_HAVE_D_TYPE_WORKS
390
if (direfd->d_type!=DT_LNK)
394
if (!isdigit(direfd->d_name[0]))
397
if (procfdlen+1+strlen(direfd->d_name)+1>sizeof(line))
436
if (!isdigit(direfd->d_name[0]))
438
if (procfdlen + 1 + strlen(direfd->d_name) + 1 > sizeof(line))
399
440
memcpy(line + procfdlen - PATH_FD_SUFFl, PATH_FD_SUFF "/",
401
strcpy(line + procfdlen + 1, direfd->d_name);
402
lnamelen=readlink(line,lname,sizeof(lname)-1);
442
safe_strncpy(line + procfdlen + 1, direfd->d_name,
443
sizeof(line) - procfdlen - 1);
444
lnamelen = readlink(line, lname, sizeof(lname) - 1);
403
447
lname[lnamelen] = '\0'; /*make it a null-terminated string*/
405
449
if (extract_type_1_socket_inode(lname, &inode) < 0)
704
762
vr,vs,sendq,recvq);
711
769
static int igmp_info(void)
713
771
INFO_GUTS6(_PATH_PROCNET_IGMP, _PATH_PROCNET_IGMP6, "AF INET (igmp)",
717
static void tcp_do_one(int lnr, const char *line)
772
igmp_do_one, "igmp", "igmp6");
775
static const char *sctp_socket_state_str(int state)
777
if (state >= 0 && state < ARRAY_SIZE(tcp_state))
778
return tcp_state[state];
780
static char state_str_buf[64];
781
sprintf(state_str_buf, "UNKNOWN(%d)", state);
782
return state_str_buf;
786
static const struct aftype *process_sctp_addr_str(const char *addr_str, struct sockaddr *sa)
788
if (strchr(addr_str,':')) {
790
extern struct aftype inet6_aftype;
791
/* Demangle what the kernel gives us */
793
char addr6_str[INET6_ADDRSTRLEN];
794
unsigned u0, u1, u2, u3, u4, u5, u6, u7;
795
sscanf(addr_str, "%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X",
796
&u0, &u1, &u2, &u3, &u4, &u5, &u6, &u7);
797
in6.s6_addr16[0] = htons(u0);
798
in6.s6_addr16[1] = htons(u1);
799
in6.s6_addr16[2] = htons(u2);
800
in6.s6_addr16[3] = htons(u3);
801
in6.s6_addr16[4] = htons(u4);
802
in6.s6_addr16[5] = htons(u5);
803
in6.s6_addr16[6] = htons(u6);
804
in6.s6_addr16[7] = htons(u7);
806
inet_ntop(AF_INET6, &in6, addr6_str, sizeof(addr6_str));
807
inet6_aftype.input(1, addr6_str, sa);
808
sa->sa_family = AF_INET6;
811
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
812
sin->sin_addr.s_addr = inet_addr(addr_str);
813
sa->sa_family = AF_INET;
815
return get_afntype(sa->sa_family);
818
static void sctp_eps_do_one(int lnr, char *line, const char *proto)
824
const struct aftype *ap;
825
struct sockaddr_storage localsas;
826
struct sockaddr *localsa = (struct sockaddr *)&localsas;
828
const char *lport_str;
830
const char *inode_str;
834
/* ENDPT SOCK STY SST HBKT LPORT UID INODE LADDRS */
837
strtok(line, " \t\n"); /* skip endpt */
838
strtok(0, " \t\n"); /* skip sock */
839
strtok(0, " \t\n"); /* skip sty */
840
sst_str = strtok(0, " \t\n");
841
strtok(0, " \t\n"); /* skip hash bucket */
842
lport_str = strtok(0, " \t\n");
843
uid_str = strtok(0, " \t\n");
844
inode_str = strtok(0, " \t\n");
845
laddrs_str = strtok(0, "\t\n");
847
if (!sst_str || !lport_str || !uid_str || !inode_str) {
848
fprintf(stderr, _("warning, got bogus sctp eps line.\n"));
851
state = atoi(sst_str);
852
port = atoi(lport_str);
854
inode = strtoul(inode_str,0,0);
856
const char *this_local_addr;
859
snprintf(local_port, sizeof(local_port), "%s",
860
get_sname(htons(port), proto, flag_not & FLAG_NUM_PORT));
861
for (this_local_addr = strtok(laddrs_str, " \t\n");
863
this_local_addr = strtok(0, " \t\n")) {
865
ap = process_sctp_addr_str(this_local_addr, localsa);
867
safe_strncpy(local_addr, ap->sprint(localsa, flag_not), sizeof(local_addr));
869
sprintf(local_addr, _("unsupported address family %d"), localsa->sa_family);
875
sprintf(buffer, "%s:%s", local_addr, local_port);
876
printf("%-47s", buffer);
877
printf(" %-11s", first ? sctp_socket_state_str(state) : "");
880
finish_this_one(uid, inode, "");
883
static void sctp_assoc_do_one(int lnr, char *line, const char *proto)
886
int state, lport,rport;
888
unsigned rxqueue,txqueue;
891
const struct aftype *ap;
892
struct sockaddr_storage localsas, remotesas;
893
struct sockaddr *localsa = (struct sockaddr *)&localsas;
894
struct sockaddr *remotesa = (struct sockaddr *)&remotesas;
896
const char *txqueue_str;
897
const char *rxqueue_str;
898
const char *lport_str, *rport_str;
900
const char *inode_str;
905
/* ASSOC SOCK STY SST ST HBKT ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT RPORT LADDRS <-> RADDRS */
909
strtok(line, " \t\n"); /* skip assoc */
910
strtok(0, " \t\n"); /* skip sock */
911
strtok(0, " \t\n"); /* skip sty */
912
sst_str = strtok(0, " \t\n");
914
strtok(0, " \t\n"); /* skip hash bucket */
915
strtok(0, " \t\n"); /* skip hash assoc-id */
916
txqueue_str = strtok(0, " \t\n");
917
rxqueue_str = strtok(0, " \t\n");
918
uid_str = strtok(0, " \t\n");
919
inode_str = strtok(0, " \t\n");
920
lport_str = strtok(0, " \t\n");
921
rport_str = strtok(0, " \t\n");
922
laddrs_str = strtok(0, "<->\t\n");
923
raddrs_str = strtok(0, "<->\t\n");
925
if (!sst_str || !txqueue_str || !rxqueue_str || !uid_str ||
926
!inode_str || !lport_str || !rport_str) {
927
fprintf(stderr, _("warning, got bogus sctp assoc line.\n"));
931
state = atoi(sst_str);
932
txqueue = atoi(txqueue_str);
933
rxqueue = atoi(rxqueue_str);
935
inode = strtoul(inode_str, 0, 0);
936
lport = atoi(lport_str);
937
rport = atoi(rport_str);
939
/*print all addresses*/
940
const char *this_local_addr;
941
const char *this_remote_addr;
945
char remote_port[16];
946
snprintf(local_port, sizeof(local_port), "%s",
947
get_sname(htons(lport), proto,
948
flag_not & FLAG_NUM_PORT));
949
snprintf(remote_port, sizeof(remote_port), "%s",
950
get_sname(htons(rport), proto,
951
flag_not & FLAG_NUM_PORT));
953
this_local_addr = strtok_r(laddrs_str, " \t\n", &ss1);
954
this_remote_addr = strtok_r(raddrs_str, " \t\n", &ss2);
955
while (this_local_addr || this_remote_addr) {
957
char remote_addr[64];
959
if (this_local_addr) {
960
if (this_local_addr[0] == '*') {
964
ap = process_sctp_addr_str(this_local_addr, localsa);
966
safe_strncpy(local_addr,
967
ap->sprint(localsa, flag_not), sizeof(local_addr));
969
sprintf(local_addr, _("unsupported address family %d"), localsa->sa_family);
971
if (this_remote_addr) {
972
if (this_remote_addr[0] == '*') {
976
ap = process_sctp_addr_str(this_remote_addr, remotesa);
978
safe_strncpy(remote_addr,
979
ap->sprint(remotesa, flag_not), sizeof(remote_addr));
981
sprintf(remote_addr, _("unsupported address family %d"), remotesa->sa_family);
985
printf("sctp %6u %6u ", rxqueue, txqueue);
988
if (this_local_addr) {
990
sprintf(buffer, "%s:%s", local_addr, local_port);
992
sprintf(buffer, "%s", local_addr);
993
printf("%-23s", buffer);
997
if (this_remote_addr) {
999
sprintf(buffer, "%s:%s", remote_addr, remote_port);
1001
sprintf(buffer, "%s", remote_addr);
1002
printf("%-23s", buffer);
1004
printf("%-23s", "");
1006
printf(" %-11s", first ? sctp_socket_state_str(state) : "");
1009
this_local_addr = strtok_r(0, " \t\n", &ss1);
1010
this_remote_addr = strtok_r(0, " \t\n", &ss2);
1012
finish_this_one(uid, inode, "");
1015
static int sctp_info_eps(void)
1017
INFO_GUTS6(_PATH_PROCNET_SCTPEPTS, _PATH_PROCNET_SCTP6EPTS, "AF INET (sctp)",
1018
sctp_eps_do_one, "sctp", "sctp6");
1021
static int sctp_info_assocs(void)
1023
INFO_GUTS6(_PATH_PROCNET_SCTPASSOCS, _PATH_PROCNET_SCTP6ASSOCS, "AF INET (sctp)",
1024
sctp_assoc_do_one, "sctp", "sctp6");
1027
static int sctp_info(void)
1029
int res = sctp_info_eps();
1030
return res ? res : sctp_info_assocs();
1033
static void addr_do_one(char *buf, size_t buf_len, size_t short_len, const struct aftype *ap,
1035
struct sockaddr_in6 *addr,
1037
struct sockaddr_in *addr,
1039
int port, const char *proto
1042
const char *sport, *saddr;
1043
size_t port_len, addr_len;
1045
saddr = ap->sprint((struct sockaddr *)addr, flag_not & FLAG_NUM_HOST);
1046
sport = get_sname(htons(port), proto, flag_not & FLAG_NUM_PORT);
1047
addr_len = strlen(saddr);
1048
port_len = strlen(sport);
1049
if (!flag_wide && (addr_len + port_len > short_len)) {
1050
/* Assume port name is short */
1051
port_len = netmin(port_len, short_len - 4);
1052
addr_len = short_len - port_len;
1053
strncpy(buf, saddr, addr_len);
1054
buf[addr_len] = '\0';
1056
strncat(buf, sport, port_len);
1058
snprintf(buf, buf_len, "%s:%s", saddr, sport);
1061
static void tcp_do_one(int lnr, const char *line, const char *prot)
719
1063
unsigned long rxq, txq, time_len, retr, inode;
720
1064
int num, local_port, rem_port, d, state, uid, timer_run, timeout;
721
char rem_addr[128], local_addr[128], timers[64], buffer[1024], more[512];
1065
char rem_addr[128], local_addr[128], timers[64];
1066
const struct aftype *ap;
724
1067
#if HAVE_AFINET6
725
1068
struct sockaddr_in6 localaddr, remaddr;
726
1069
char addr6[INET6_ADDRSTRLEN];
730
1073
struct sockaddr_in localaddr, remaddr;
1075
long clk_tck = ticks_per_second();
736
1080
num = sscanf(line,
737
"%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %512s\n",
1081
"%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %*s\n",
738
1082
&d, local_addr, &local_port, rem_addr, &rem_port, &state,
739
&txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
741
if (strlen(local_addr) > 8) {
744
/* Demangle what the kernel gives us */
745
sscanf(local_addr, "%08X%08X%08X%08X",
746
&in6.s6_addr32[0], &in6.s6_addr32[1],
747
&in6.s6_addr32[2], &in6.s6_addr32[3]);
748
inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
749
inet6_aftype.input(1, addr6, (struct sockaddr *) &localaddr);
750
sscanf(rem_addr, "%08X%08X%08X%08X",
751
&in6.s6_addr32[0], &in6.s6_addr32[1],
752
&in6.s6_addr32[2], &in6.s6_addr32[3]);
753
inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
754
inet6_aftype.input(1, addr6, (struct sockaddr *) &remaddr);
755
localaddr.sin6_family = AF_INET6;
756
remaddr.sin6_family = AF_INET6;
760
sscanf(local_addr, "%X",
761
&((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
762
sscanf(rem_addr, "%X",
763
&((struct sockaddr_in *) &remaddr)->sin_addr.s_addr);
764
((struct sockaddr *) &localaddr)->sa_family = AF_INET;
765
((struct sockaddr *) &remaddr)->sa_family = AF_INET;
1083
&txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode);
769
1086
fprintf(stderr, _("warning, got bogus tcp line.\n"));
1090
if (!flag_all && ((flag_lst && rem_port) || (!flag_lst && !rem_port)))
1093
if (strlen(local_addr) > 8) {
1095
/* Demangle what the kernel gives us */
1096
sscanf(local_addr, "%08X%08X%08X%08X",
1097
&in6.s6_addr32[0], &in6.s6_addr32[1],
1098
&in6.s6_addr32[2], &in6.s6_addr32[3]);
1099
inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
1100
inet6_aftype.input(1, addr6, (struct sockaddr *) &localaddr);
1101
sscanf(rem_addr, "%08X%08X%08X%08X",
1102
&in6.s6_addr32[0], &in6.s6_addr32[1],
1103
&in6.s6_addr32[2], &in6.s6_addr32[3]);
1104
inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
1105
inet6_aftype.input(1, addr6, (struct sockaddr *) &remaddr);
1106
localaddr.sin6_family = AF_INET6;
1107
remaddr.sin6_family = AF_INET6;
1110
sscanf(local_addr, "%X",
1111
&((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
1112
sscanf(rem_addr, "%X",
1113
&((struct sockaddr_in *) &remaddr)->sin_addr.s_addr);
1114
((struct sockaddr *) &localaddr)->sa_family = AF_INET;
1115
((struct sockaddr *) &remaddr)->sa_family = AF_INET;
772
1118
if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) {
773
1119
fprintf(stderr, _("netstat: unsupported address family %d !\n"),
774
1120
((struct sockaddr *) &localaddr)->sa_family);
777
if (state == TCP_LISTEN) {
783
safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr,
784
flag_not), sizeof(local_addr));
785
safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not),
787
if (flag_all || (flag_lst && !rem_port) || (!flag_lst && rem_port)) {
788
snprintf(buffer, sizeof(buffer), "%s",
789
get_sname(htons(local_port), "tcp",
790
flag_not & FLAG_NUM_PORT));
793
if ((strlen(local_addr) + strlen(buffer)) > 22)
794
local_addr[22 - strlen(buffer)] = '\0';
797
strcat(local_addr, ":");
798
strcat(local_addr, buffer);
799
snprintf(buffer, sizeof(buffer), "%s",
800
get_sname(htons(rem_port), "tcp", flag_not & FLAG_NUM_PORT));
803
if ((strlen(rem_addr) + strlen(buffer)) > 22)
804
rem_addr[22 - strlen(buffer)] = '\0';
807
strcat(rem_addr, ":");
808
strcat(rem_addr, buffer);
1124
addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localaddr, local_port, "tcp");
1125
addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remaddr, rem_port, "tcp");
809
1127
timers[0] = '\0';
812
1129
switch (timer_run) {
818
1135
snprintf(timers, sizeof(timers), _("on (%2.2f/%ld/%d)"),
819
(double) time_len / HZ, retr, timeout);
1136
(double) time_len / clk_tck, retr, timeout);
823
1140
snprintf(timers, sizeof(timers), _("keepalive (%2.2f/%ld/%d)"),
824
(double) time_len / HZ, retr, timeout);
1141
(double) time_len / clk_tck, retr, timeout);
828
1145
snprintf(timers, sizeof(timers), _("timewait (%2.2f/%ld/%d)"),
829
(double) time_len / HZ, retr, timeout);
1146
(double) time_len / clk_tck, retr, timeout);
1150
snprintf(timers, sizeof(timers), _("probe (%2.2f/%ld/%d)"),
1151
(double) time_len / clk_tck, retr, timeout);
833
1155
snprintf(timers, sizeof(timers), _("unkn-%d (%2.2f/%ld/%d)"),
834
timer_run, (double) time_len / HZ, retr, timeout);
1156
timer_run, (double) time_len / clk_tck, retr, timeout);
837
1160
printf("%-4s %6ld %6ld %-*s %-*s %-11s",
838
protname, rxq, txq, netmax(23,strlen(local_addr)), local_addr, netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state]));
1161
prot, rxq, txq, (int)netmax(23,strlen(local_addr)), local_addr, (int)netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state]));
840
1163
finish_this_one(uid,inode,timers);
844
1166
static int tcp_info(void)
846
1168
INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)",
1169
tcp_do_one, "tcp", "tcp6");
850
static void udp_do_one(int lnr, const char *line)
1172
static void udp_do_one(int lnr, const char *line,const char *prot)
852
char buffer[8192], local_addr[64], rem_addr[64];
853
char *udp_state, timers[64], more[512];
1174
char local_addr[64], rem_addr[64];
1175
char *udp_state, timers[64];
854
1176
int num, local_port, rem_port, d, state, timer_run, uid, timeout;
856
1177
#if HAVE_AFINET6
857
1178
struct sockaddr_in6 localaddr, remaddr;
858
1179
char addr6[INET6_ADDRSTRLEN];
1779
#if HAVE_AFBLUETOOTH
1780
const char *bluetooth_state(int state)
1784
return _("CONNECTED");
1792
return _("CONNECT");
1794
return _("CONNECT2");
1798
return _("DISCONN");
1802
return _("UNKNOWN");
1806
static void l2cap_do_one(int nr, const char *line, const char *prot)
1808
char daddr[18], saddr[18];
1809
unsigned dtype, stype, state, psm, dcid, scid, imtu, omtu, sec_level;
1811
const char *bt_state, *bt_sec_level;
1813
num = sscanf(line, "%17s (%u) %17s (%u) %d %d 0x%04x 0x%04x %d %d %d",
1814
daddr, &dtype, saddr, &stype, &state, &psm, &dcid, &scid, &imtu, &omtu, &sec_level);
1817
num = sscanf(line, "%17s %17s %d %d 0x%04x 0x%04x %d %d %d",
1818
daddr, saddr, &state, &psm, &dcid, &scid, &imtu, &omtu, &sec_level);
1821
fprintf(stderr, _("warning, got bogus l2cap line.\n"));
1826
if (flag_lst && !(state == BT_LISTEN || state == BT_BOUND))
1828
if (!(flag_all || flag_lst) && (state == BT_LISTEN || state == BT_BOUND))
1831
bt_state = bluetooth_state(state);
1832
switch (sec_level) {
1833
case BT_SECURITY_SDP:
1834
bt_sec_level = _("SDP");
1836
case BT_SECURITY_LOW:
1837
bt_sec_level = _("LOW");
1839
case BT_SECURITY_MEDIUM:
1840
bt_sec_level = _("MEDIUM");
1842
case BT_SECURITY_HIGH:
1843
bt_sec_level = _("HIGH");
1846
bt_sec_level = _("UNKNOWN");
1849
printf("l2cap %-17s %-17s %-9s %7d 0x%04x 0x%04x %7d %7d %-7s\n",
1850
(strcmp (daddr, "00:00:00:00:00:00") == 0 ? "*" : daddr),
1851
(strcmp (saddr, "00:00:00:00:00:00") == 0 ? "*" : saddr),
1852
bt_state, psm, dcid, scid, imtu, omtu, bt_sec_level);
1855
static int l2cap_info(void)
1857
printf("%-6s %-17s %-17s %-9s %7s %-6s %-6s %7s %7s %-7s\n",
1858
"Proto", "Destination", "Source", "State", "PSM", "DCID", "SCID", "IMTU", "OMTU", "Security");
1859
INFO_GUTS(_PATH_SYS_BLUETOOTH_L2CAP, "BTPROTO L2CAP", l2cap_do_one, "l2cap");
1862
static void rfcomm_do_one(int nr, const char *line, const char *prot)
1864
char daddr[18], saddr[18];
1865
unsigned state, channel;
1867
const char *bt_state;
1869
num = sscanf(line, "%17s %17s %d %d", daddr, saddr, &state, &channel);
1871
fprintf(stderr, _("warning, got bogus rfcomm line.\n"));
1875
if (flag_lst && !(state == BT_LISTEN || state == BT_BOUND))
1877
if (!(flag_all || flag_lst) && (state == BT_LISTEN || state == BT_BOUND))
1880
bt_state = bluetooth_state(state);
1881
printf("rfcomm %-17s %-17s %-9s %7d\n",
1882
(strcmp (daddr, "00:00:00:00:00:00") == 0 ? "*" : daddr),
1883
(strcmp (saddr, "00:00:00:00:00:00") == 0 ? "*" : saddr),
1887
static int rfcomm_info(void)
1889
printf("%-6s %-17s %-17s %-9s %7s\n", "Proto", "Destination", "Source", "State", "Channel");
1890
INFO_GUTS(_PATH_SYS_BLUETOOTH_RFCOMM, "BTPROTO RFCOMM", rfcomm_do_one, "rfcomm");
1495
1894
static int iface_info(void)
1497
1896
if (skfd < 0) {
1725
2158
if (flag_int + flag_rou + flag_mas + flag_sta > 1)
1728
if ((flag_inet || flag_inet6 || flag_sta) && !(flag_tcp || flag_udp || flag_raw))
1729
flag_tcp = flag_udp = flag_raw = 1;
2161
if ((flag_inet || flag_inet6 || flag_sta) &&
2162
!(flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw))
2163
flag_noprot = flag_tcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1;
1731
if ((flag_tcp || flag_udp || flag_raw || flag_igmp) && !(flag_inet || flag_inet6))
2165
if ((flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw || flag_igmp) &&
2166
!(flag_inet || flag_inet6))
1732
2167
flag_inet = flag_inet6 = 1;
1734
flag_arg = flag_tcp + flag_udp + flag_raw + flag_unx + flag_ipx
1735
+ flag_ax25 + flag_netrom + flag_igmp + flag_x25;
2169
if (flag_bluetooth && !(flag_l2cap || flag_rfcomm))
2170
flag_l2cap = flag_rfcomm = 1;
2172
flag_arg = flag_tcp + flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx
2173
+ flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose
2174
+ flag_l2cap + flag_rfcomm;
1737
2176
if (flag_mas) {
1738
2177
#if HAVE_FW_MASQUERADE && HAVE_AFINET
1739
2178
#if MORE_THAN_ONE_MASQ_AF
1740
2179
if (!afname[0])
1741
strcpy(afname, DFLT_AF);
2180
safe_strncpy(afname, DFLT_AF, sizeof(afname));
1744
2183
i = ip_masq_info(flag_not & FLAG_NUM_HOST,
1745
2184
flag_not & FLAG_NUM_PORT, flag_exp);
1746
2185
if (i || !flag_cnt)
1751
ENOSUPP("netstat.c", "FW_MASQUERADE");
2190
ENOSUPP("netstat", "FW_MASQUERADE");
1757
2196
if (flag_sta) {
1762
parsesnmp(flag_raw, flag_tcp, flag_udp);
2198
safe_strncpy(afname, DFLT_AF, sizeof(afname));
2200
if (!strcmp(afname, "inet")) {
2202
parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp);
2204
ENOSUPP("netstat", "AF INET");
2207
} else if(!strcmp(afname, "inet6")) {
2209
parsesnmp6(flag_raw, flag_tcp, flag_udp);
2211
ENOSUPP("netstat", "AF INET6");
1764
safe_strncpy(buf, afname, sizeof(buf));
1766
if ((tmp2 = index(tmp1, ',')))
1767
printf("Multiple interface\n");
1768
else if(!strncmp(buf,"inet6",5)) {
1771
parsesnmp6(flag_raw, flag_tcp, flag_udp);
1773
printf("Address type not supported for stats\n");
1777
printf("Address type not supported for stats\n");
2215
printf(_("netstat: No statistics support for specified address family: %s\n"), afname);
1784
2221
if (flag_rou) {
1785
2222
int options = 0;
1787
2224
if (!afname[0])
1788
strcpy(afname, DFLT_AF);
2225
safe_strncpy(afname, DFLT_AF, sizeof(afname));
1790
2227
if (flag_exp == 2)