From 17c495b9d4f80ebc79f12a8a379e816de0838c1f Mon Sep 17 00:00:00 2001 From: sushen339 Date: Tue, 18 Nov 2025 14:43:00 +0800 Subject: [PATCH] --- blockip/bip | Bin 58344 -> 58392 bytes blockip/include/install.h | 1 + blockip/src/install.c | 28 +++++++++++++------- blockip/src/stats.c | 53 +++++++++++++++++--------------------- 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/blockip/bip b/blockip/bip index c4d100031aad2459457353b984145ff7487bf5f2..8444be532b1111703c4b99d8774a718510782ee4 100644 GIT binary patch delta 17902 zcmZvE3tUvi+y9;w6x7&71r`-qWDyh*P!UkkU0rk0Me%N?hS$7hSWy1VTnsQb+(M_! z*SCwe%)BIN^_nIwir2i5r9Vvzw2Nm&)5?mxbpGFG&Ma=*|9n24ndkdl=9!sio|$vb zqI|T;nqy7M6SRiQE4yqC&NXQGmAmp{a`29^DzSrwO3BUZl2xiMnGKPm_4`z+MwGYN zf24%q{Q}(2wo0p8xp%7M!;+2EP7Y0YM}-?pR;8U4+-Q$=Z!)ZnY2~h$PnLCE^i-@R zDB#2E1^siTyvbf~VvOtqT?zl1avSS4MJNgD%T6_kl@i!5O(LWmHX_@yll55N&PvOrFj*a2>8T?+TT12bs&}v_w4_7aS~Au{pty2F`qD#+2#1cLpbG+2s~y#|Aj6hZtS0XU~3whJU-jcCTEG zxd_yJD(DE#571Nz`eV*-qWMD5g>7dCYcyKTdC+uu11Lx(HMxmu<$?$Z;0})H1*7gE zgX5iwRR!4(?=0}!et3$&8~pGd0@r-5+VeWpyI5^s6XeIp5(;`he6YX`e)tf98~yNc z0#ES6CkQ;n;m4RF7#V)}bb*`w@VNrF`Qh^gp6iDf3Vgi49p0f>C>VKu3J!tK^21*e zc)lO*6!=0ve1*V^{)sy@OfZ)Jlc8BH@Nz$Voxs=l;Tr|M&JW)z@GXA$4vu5~EBqKA z3xz#?`2Pvq?T1$i{FonJCGZ+Q{FuNm5Ki&uoq{g}qs~v^oWNy2{DQ!5`{6$dyulBb z1+EdPoZ98_|EpjG`7mgq{4Q|4AFc@8;D>8VNDJxL4-Xc2f*;xU-^eEfdz`d1y-qzFcypMqK7v;6RZ0?+ruhX{P3AD$!dA}=o5 z*Nhg7>y{qQLQU*m^Q7x+3qe7?Z9_~DKPf>GheSSav4e)tOlcl+VX1%AvA zFZ0@|QhVeL_B|@?&{P~y8MNyMh+b2%#|QT+5$^WEV+jz~F(15_7era(gZJ^l-P{2O z?Qb|@_%JkXm1u@SY-Ah=^1-#L2*2xn@FqUE!3U={yqD3f*2sQSwBL9oxYa5#=%4pW zajP}Lu)j858E&;oc=JY7qcQv7EqrjB58hJXy!~7s1`Ys?*LWX1q!HC<@_cZe4?fEW z_ns+;o$rH(5+JUHZn6HU2d%s)$|AQ)5Z+p?^80ePN)X;gt@3-hTO|k&Q>*;G#;p>B zhpSb7U*}edX4HO!4`WLsL!%MLWzMbe!6SX-_xRv#eQ>uA-p&U<=7YB<+&lj@K8z@0 zi0gt|txyj-2#kt4w@MHmtycM6cB=&8MzzZCx7{j1c#K-*cSnO;rHIi{t*UpvJk&rm z`QSl5c$^Qe_rW{);07N&-Um0TxPwP}f)69XN1?M1p5lXd@xe2EaB+;}T(b|})kogu zgC{kPKLm1p7~Omn#{1ynIf--geDD+>`B^@Ast=y;gLn7hH2({I7(KiUltn&xPak}_ z51!_Om;2!9KKL3RJi`ZH2Rw#on)^&2#ugui-n&B$`p2PTj}2+q38DB0OE!aO)1b*$LRq?Q|j~7 zaJo0ql<_=nPIo7oGM%S_(_M(B4Ch(L>5lIrQfE*p$H?ic?>GQZX7cDc@C^xc zAX>xevqVP|eft58zzL#_MAvcpAkh?Uo*GW?C7KeB$Ia;PdL{nn%LZgtHP}Wyo>cQMLxPlFk@BbuaB!bO9lLg3fBpEj(|NX z96w2w9>vz0k|N^-^B~qYnm;Yt33eMC#&={>k!{j+RiNTeYLu~%n{#P zyKe^D7vDkq+YELozJuYnzf|r1s#PZ zvN;I_(h^n+(I?p-37x{t4T^$+$Q=(kSJosHsct!ub?=-n&0!lmr*-*!x@vzhI$!UE z=(K5EbpBY4Mt%~YX91?4aHj2&Dm}(}c9}5j4UOi`%x=2q5`=@Ac40j7O;QYOMMY*q zL71&9@bA}AN7fEj>U7aXBzs7dkoT-6`LwI6+2t(u%dsy9*VH>m#S9d0h+3DoP=`gE$-s`cem|4OZIr}|N~UPJYLchb3X z`#cakRYoq=H>&j#s=uk$w@|%ItykxY+2W&s1JbcL9dni zFK3pIu{nPqWpmz3RUl!I-)1#kW2Mj7ovvM^?^twFmQ=(hCA}8KG@8B98XCV^dHS#L z$a(8X;9o#Ba^P<)xLZ3(W^vt~mS(Xxx<%_Rkc2C(d<4a*B4@JdZZ@fgJ(3(F&1cED zZ)YQtTT5HmjO3WO=OAo%-jbL6q9~O`h*46Je&ZIt6c(nkZOQSSn*%I$7Y?+QjWz|r ze(^{WzJ&?X!$#^Kn6f2Mkgu|P$&qtp*z-JvZrYumy|h(S!ZyY1AgIY?ix?Q1M#ghA zS-)_1JbNuZjQ5B^ogxiN>RwY{6XO6|lG09kmaR=mk-D=lQc|Tl_8=v>r5+AooNP!B z=U7InNvdFzQs+uN+40oq&`q~^2PY0w`y2QR`zv*zcHJ!&l5E7qQVbVl}mp z>No15(a~%2LiR>?W2eEuX~2g6>@#3zReKwRy&kvOso@4k5q#C~fq4!L`5Opf@vQY9 zk@3U9jJo~r5pg0#$^nAm+i?x@pj^+}46BD}%tlifNp+KB432raW8~R0Jz7gIvt>QH zcd(Ky+K$0+RDMdC2!dxIND-CJ&i6=_;#g46KIZJ3eAMKa8&v*G>`zI|mG(1FQnm7% zTxBAJ!4}a{7RXSFny8+?OLZ=NY*~rsVV1E37Vkj#leo_KXhFSvEH# zUb|OjQ}S9%@3Acz(b602ScXw5V4jSb(gT*8*-!eLy_T7-U3QHNEnt^3qa?=eW}2|R zqI>s{db3fzdqmB=hTZAl9t!)?v$~QGP*&20PGh>2ZS0+d7w%v7j+X4~m)`N=J%94^ zn#7`6w?1RikN>E$I@??erOIwFA%7~M@Q2Vw0g3UGr?I_#Okwj?wD61ilU$RmPGGE8Nx+r%u}yXCEjFTWr^p$qmac>+ZCzzoley$(L85$`K&bk((ic-nFG`ouCjLhQl)a1 z(=SSz%I5a#5O?S*?_Z&bPb7Kxkw98C4%oZw!+r)^FPP%{SGnE!6A2zBLFaX`)z`|u z3&lE$ZvzMl3q65li%kaf^Zr1Lp29-YdV1|&U<-b_K8#!F?JfQq`0xMUs>AKa}~QYz$C{C@h|=*{%U_NKJp*p zcOXWQkKPUpk9-k4Zkb5PdrjHtrPqIwJX_H1yHnXfp=jmIh4PE|*q-*68_SvIdP0aw>mfp})u(&3g^u%E# zfwiASuGGpuu;9T-(xWVW@RYC{b_C(Ai@ZIEjDZNO?-<-ey3ei*4wE{uKL;<>23%x| zZ23|vR&R?5t+@bc_&d<9?vE8LD!Zd}ikY(~Nl&nMvSZATKtfGWM*;#gatDx*pW~aT z?*5k>DLh5}j3NRjXKZ=&VDUFovfBk;B@o_TXR$+Kq+@K*kRj4jtb9l}{ps^ud>J0z zNFbS=9@2TpIe?2vJciy7JR16>F zCG6JFq)<26#|R9yJ0VpouVYE}w%WjREZaV$Z6Bj>zv9+q7qEH*Kb7%a;9GXv9vSi#Nuq1#$=^R%L{5Sf#mqTzkNgR> z`c*t%$^Xlq$r&P<+5Vj5(A#7VZY7F|tYHswk`wFBDvA}miz}?ZBu`_!&7_0LN z7I2)(=*7kjo7d+!u8?u7xsKt2%!>~LNoJtxX=TW&I?@L;J3Jz)P-PTWP$$=X2`N|FBpNu_`wuG_-lfAZ zlE5I31+x47s-?rpYDmpzujOV* zdUh%|a`xsL3KBkVmr(U}wF#`tj{5t3P0baUShHOn4VB(-KIMkQ#kTiBgZ$xS;$5j$Jw(OGzwcyhE| z%4Q#r?yU_u&2EqG8(MKv^=qyOyKgdIVagY* zn>`Ze+dX54wmpv2$JgO1yvD*h{0T3c_&PMRsBs-S#hieyE9(R$$kO9#J5j)V*Wptq z*e`ZN$TSl5F2rT*<#7r4DN4n-n9eVdo|qB!IJFsXz_1ZL1BPc2AALL#%B|Vmal`S$ znjz!I>#rZ9wrUXvxp;jh4`sW?CrL@HZv0Ffwg*4fNs4CkADhwsv!h&0UimjlSK4g6 z%EMW~HA|9p$JwpNB7^S;f%`0U!VGC9dwzmF_(^(eRPd<0lAWB;S$dQGF`-Aq_eZej zoV7WBIuJ_Hz3H%`91ZOKBr`ug2otdE@xjqgB0*s@&x+@+e*^(E*cR^sY1L_uvKxG2p434~+ijcFTMBD_h@$ORq+ks5 zDb@H9_U7a@(j=DhM52_+CO+|)c zbOz4qk#Wsv-cB8$^W+C;j>~c(SBb+^4z`dsa9L_NY!mFrFG85)IBav3m}<~DGHWCS zSJ+DsLUfLWSm`C*tKrRvJI|CbDD@BLw{~ZJy^+39%zXIf%u;+rvK1e)Su=mvm0S$e zXo?*#SPg|9TUmj65}8M)+=Umir=54!+sa_e<_b7lTvDxvutdi7jmA59-^ckj;2O&t z$ULVjIS&NKOnzF$#h>gKmGA(i8O$4rZE{uvUTshfHN#Cf}^ zK~8`SR0~(pn=ic$k!YZ`gfhWad{DAw9@LeZ5UpkCSL#hW-zlaYLNE2^<@4yNGr&D4 z^*H7gD-X+8qseh~J(}aZk8yHnEEIsne@RQm4uYc91|vaMXG@dwRDCE7B!yEpO$Qw$ zteG!Zm)z_#*IX#m)}x1G>gmAdJSb27oX^c^D^{3qNLFD+s}YiRlYU84OYz^$3(K(H zJ~q;LJF-6MfET`>!cBQ2ri(_9^2G#<7#y~_-cl#TmGlzwNxg}mx%gH(2yN5ihag}4 zRO(89gOhgWRqt_0PKFdEy%Xf_NH~Z=%fJTL`AF#>y4M1=co~B?3x&ahK$a%J2Kas9 zKxrWA{I!vsvkxYgR#S?jM*zzt%Vf(F^dLZUHO4wqx1`3BiR7Sjc^+UFk+1=%&!#jE zd^nw+L8ZraB^%(O({4(z;%2lu`w8IlEV#62B0}bmU~-DSR`> z>9~XGPoOksw9*Q;;%Fq<5%{ja_l&gsl%Rre-1Pun1%T(b)hOus&CZXa>Fp>*QNVZ? z4^L)15n-R13U_#fA-3^|=nDL%Eg1=G&x@?N4j7X|AcQxa28l+De^8^@+5_Lw6Rdjb zNps#4UFiVCd5-hWKRxyg1L{40$vYv6Ip=5B#y2`^2`p}qEXC(Fp6@VG#fz~PbPlHu z^F^!pPkOuZI}UcAP$DDRv4SyZ z3K~mwXIIrV8R}Xbh&V?Akeg7)$^sYDnVvGj5GT&?NNk=4eD~oQa_L>w@=$L1ELm>c zh#ao=XJL6WEZeHSZ<6g=9Ho&zLVsYgJ4{+!W3|~%Yn0g&LfVvYy^gkP0N@InORB2B z#)tm)bd#e$k)vsNBcmGh;Iur{X-zYGYX2l%>~{{NV@jDpo}7D>xUG%G)Xt-U7HEJ5 z0NWOzbEzIHBc(Zx2<{D+u}pof17a#JMKNa%NE$d z!uy9IU1>C;i|-Gf7Br@6F2MAz#VkKe37*gYPf_+^4)F;WLo>77G7gdOCq2=)vVM-h zSUx;2+3;K>x5wcq5+a`5Q52I9p=Uk+xH3NoKN2u59ojFrDr;M22hK0au7dRz$izl zF?lFB*_l5V?zG{=WstCCnX-$Iw&Z(e=`i-%+^Au#!l*Y%AEDz&l_ju;JXZEBUUAl1 zijUF(qosTjPlU)9??BX!t)4!l9I-lo!RkCq4rN|jd`ivF8`<5t?WHj+VqSvuA~Vlx z--DJk2DBbIMy~!Cj|i_77JE8l5;1i&^57i+&u8l1VXw^#?{zX91EC&hgOL8^=fB~0 z4j2IA-NGzRrmX}C3#&+2IxN4$F3pQ^6rmY$%PRoZ?oQ$n+oj4NqW z8`4i(f~N_Z%4G*g^G1-xdC`h~x*q8UK0023BGo+tlHa!G4HnYl$9UL~pZyuPcYeh! zSbb4tbGXu8BX(~XQ%5DA9$S`H8@$_?+F8$EyYO^z$@3frV`jOTW`7&T-ZB;)+K2d~ z6rJ`NDs-~PIea6U9s{3EaAuUv6*YmJF213czuZl;gZ)U|x7gjMT84cJELD*Yz(srp z;;UL-#oEnJ30nXTer02nZJ3z@a7iN%`-J7q4{P5VZHf1Xma%qc71p~RklmFP6UkQ2 z@8HNHReJn-%S1oyk-tR;xI&H-N07fD|0~T0z50+tRayBn$Y9)_!3@#&s5vz5w1_UC zVSM|7&Sx~FPP`MZuB6pKC7y|g6A%J7ud=eltnDaVSxF3XRo=8fm9-@JBV+u^@ikyb$ zG*C;cgIf5;=phQB|AEpTjGEWLr(!MrCw@FuUx zD^T)wE`l$gX3_a!j_38Hk@Xp#x#jjWe$?AAo-6R)t!gjEyzz7AhoqLy2l?V&9LE|N z|4Z5(1Otz5jf}0t2o#LwK8(3!>c%dG?amK%Od{ed8aA5fux~MMQSDTPCD$tZGYcOFGD-;6}ysca?_yFn1?^W#a z1#KNv1^*?ClQ%cSfSH0_eXoKR@T3lQd$RTUPS`DOP;{leX#go?d70DzJC|{5$ai9XXzKG6Zd%2D8+Gvv4@IycEyH z@_oFC;;WA@IK*ESe)WYZ>xs7ySiQ2H`-&IwA3~Vku*r+?K}#NV3AYMt@bX+bHX%8< z(kxJsZ_sv!NROczS5p*D)@GPYyF`10^O^$#wGV^BUt~`vcU@`Kd{01zIV{_O@WT~O z!~8*;!uM^O7BTwuVf;{m!>anx9#5#_p|e+GB=ep|@V6c0*g;yjU(o)5_Ldxmj(JW%FsJkfUCHn0H5uCpTOOH) zp!8esD9T0w=fVCANxgx`cC@?H)15Q~ejb!Bm$*0?BVCS;b(6@Y4HnjN~ryj1u;SD%VfQ{X{J{enca=>#E#) zs$95`tMrp|xB}Oxg8Nm$pSeJ-yjm5+*?m1vCmxRt;fV416(Q3UK_C|J;TS<0B}%rU4DY;n1i57{~{hM0mXq z1;*1L+;KyV&&ne(CTkCL=T4(@M&Lwz9AQJ9MJitA*_x z3tRHpdY@e4-vwwhKnU#tF0Up<%C&e!AZLQ0*q*YL);14xd|?DL>}|-xwOOjPY=!`O zG+Fo(L%u+-Ghp}z&LVQTIbgeUFwrj)eUFYnIEWxreU>=&d@a1jo)ynqL32m2-$83R zhqKy{a^>!)pPLfAt7uM8;4@P-&rfBaFJHMk*V!}7(Xdoe%s5HRDpeHv@$DLvYf#!& zD2g6shD%Y3sC-pXGVq;XJW4ytH7M!Fxff8Dqf97Ql&?`PU!^D}4AFR|DAQ3cd;>cz z%3~;hKsjr*qO`}nE__o_as%=6)jg=>12C*nl-E&apxlmf`Trozp_EYuHPvVu)}mpQ z8E?TL$_sA;$F6F4S5ZczT#j-R%7*od(m>@#Md=!ZKNxvWQSzwV3_i+?_Z6iEWx^Ik zX%pjiIh=ZK;(8s{%Jr;+k(=zS5ZznP?1q-KsgJkF9mBa2(MT2 zQI6k_22n1@j$uM>Y&fAPD^MCvE6Qz@3D_4huzX~cMJUIA2}e+FL3x|-v*;mK#rSg= zA(V6>Vev~^G*Tli)Jv>ronD*r3R|_VTVRC)?Xtt`Vj~+~!q^H)DoAT0{#7t(eT3A& zBGgqc6xnVZ9*BlzP?kSxeU)2?5S-=mbM{UYhS^}ZWxBI z((i5PkH5YBalE7?06yLU7qd@{(SB}8AWog7jgG%iGM2?;U+ zqOdcsV!v+e7`Yf?INsuECqzFwBuGOl%fT*TNt^meYuM~f(b5Ix+%ynB={U7%uC$P4 zzBe4-UY+j^l|EsU6!R_EO31N2zzyLxL=aGhzx07@Z)Jy2GY(^PVV(194f9m?moixA1JM|>>;vnh z{rLOl@LldLQmbXLLP!*Qs@Sfo$y)bL*6QGEkyR>+;N=%Zxr9F!y0DM!J(vuCuH#6|R&XR9*TglH;p>E|b>BP1)YkK^|_T#F7uq?I>F6~864UgzA+ zf~%je!t=$%e9A1xBOH+Qhgoh!KCum#5>q!Zk?pV|835v=C80l)J25;~nQPQ>WPTdxn6EpmD^9~J_nq}y+X{EfHlQrQ(Dbdo`{eh z=l!oBgxx-YKgB=ZM*4>R0*;4E{l(jFiJdG|+g7v3&r&2C@kK;rB5~1@rbul8-RD~kXe_e%JAHcsunAg{4r*#cpsq~23(IgUw%-T>d4lgiHJ-U+@hydRJg1ez`i^a5jYxL z{+~vysxd@9Ekx_Yw2x9XG|!VLb|Sj}FPl;m5xGN1rc6*p9u-YilT74g!OauX;yqB* z?XIdB-$eYU6fM7Q8?-y&vQeVc{%vw-Ih5$~mhsF9bPtYTba~4~?D)6I!5J-8G=oXs zr3bGO)EZ{_F1?j^6Y-YVTVDBY34WLoT$>zR9;+&rGfVAY=?CTn=1qy4SQW4Y7F?Gc z{P4dtvDBpp8`r5?Mz*vry}8f-f^x7f9b3oUy8gKLzC!m!xbJ6saX-NBUg@tF8=Wl5 zV=Vh>ajY+C+25xJH`J&Szcc6e>C#PB^?m&R E19%-&`2YX_ delta 17842 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 diff --git a/blockip/include/install.h b/blockip/include/install.h index 1b01171..f3c86d2 100644 --- a/blockip/include/install.h +++ b/blockip/include/install.h @@ -2,6 +2,7 @@ #define INSTALL_H #include "common.h" +#include /* 安装服务 */ int install_service(void); diff --git a/blockip/src/install.c b/blockip/src/install.c index b1583a7..e09d14c 100644 --- a/blockip/src/install.c +++ b/blockip/src/install.c @@ -116,19 +116,29 @@ int install_service(void) { if (len != -1) { exe_path[len] = '\0'; - char copy_cmd[MAX_COMMAND_LEN]; - snprintf(copy_cmd, sizeof(copy_cmd), "cp -f %s %s && chmod +x %s", - exe_path, INSTALL_PATH, INSTALL_PATH); - system(copy_cmd); + FILE *src = fopen(exe_path, "rb"); + FILE *dst = fopen(INSTALL_PATH, "wb"); + if (src && dst) { + char buf[8192]; + size_t n; + while ((n = fread(buf, 1, sizeof(buf), src)) > 0) { + fwrite(buf, 1, n, dst); + } + fclose(src); + fclose(dst); + chmod(INSTALL_PATH, 0755); + } else { + if (src) fclose(src); + if (dst) fclose(dst); + } } /* 创建必要的目录和文件 */ - char mkdir_cmd[MAX_COMMAND_LEN]; - snprintf(mkdir_cmd, sizeof(mkdir_cmd), "mkdir -p %s && chmod 700 %s", CONFIG_DIR, CONFIG_DIR); - system(mkdir_cmd); + mkdir(CONFIG_DIR, 0700); + chmod(CONFIG_DIR, 0700); - snprintf(mkdir_cmd, sizeof(mkdir_cmd), "mkdir -p %s && chmod 770 %s", RECORD_DIR, RECORD_DIR); - system(mkdir_cmd); + mkdir(RECORD_DIR, 0770); + chmod(RECORD_DIR, 0770); FILE *fp = fopen(PERSIST_FILE, "a"); if (fp) { diff --git a/blockip/src/stats.c b/blockip/src/stats.c index a59349b..49308b5 100644 --- a/blockip/src/stats.c +++ b/blockip/src/stats.c @@ -81,6 +81,20 @@ void show_active_bans(void) { printf("\n"); } +/* 检查段idx是否会被更精确的段取代(相同count但更小mask) */ +static inline bool is_agg_replaced(void *agg_array, int agg_count, int idx) { + struct agg_entry { char subnet[64]; int count; int mask; }; + struct agg_entry *agg = (struct agg_entry *)agg_array; + + for (int j = 0; j < agg_count; ++j) { + if (agg[j].mask > agg[idx].mask && agg[j].count == agg[idx].count && + strncmp(agg[j].subnet, agg[idx].subnet, strlen(agg[idx].subnet)) == 0) { + return true; + } + } + return false; +} + void show_subnet_aggregation(void) { msg(C_CYAN, "=== 📊 攻击源聚合统计 (自动识别 IP 段) ==="); @@ -192,38 +206,20 @@ void show_subnet_aggregation(void) { int aggregated_count = 0; for (int i = 0; i < agg_count && show_count < 10; ++i) { - if (agg[i].count < 2) continue; - - /* 检查是否被更精确的段取代(相同count但更小mask) */ - bool replaced = false; - for (int j = 0; j < agg_count; ++j) { - if (agg[j].mask > agg[i].mask && agg[j].count == agg[i].count && - strncmp(agg[j].subnet, agg[i].subnet, strlen(agg[i].subnet)) == 0) { - replaced = true; - break; - } + if (agg[i].count < 2 || is_agg_replaced(agg, agg_count, i)) { + continue; } - if (replaced) continue; has_output = true; /* 检查是否被已显示的更大段覆盖,避免重复计数 */ bool covered = false; for (int k = 0; k < i; ++k) { - if (agg[k].count >= 2 && agg[k].mask < agg[i].mask) { - /* 检查k是否也被取代 */ - bool k_replaced = false; - for (int m = 0; m < agg_count; ++m) { - if (agg[m].mask > agg[k].mask && agg[m].count == agg[k].count && - strncmp(agg[m].subnet, agg[k].subnet, strlen(agg[k].subnet)) == 0) { - k_replaced = true; - break; - } - } - if (!k_replaced && strncmp(agg[i].subnet, agg[k].subnet, strlen(agg[k].subnet)) == 0) { - covered = true; - break; - } + if (agg[k].count >= 2 && agg[k].mask < agg[i].mask && + !is_agg_replaced(agg, agg_count, k) && + strncmp(agg[i].subnet, agg[k].subnet, strlen(agg[k].subnet)) == 0) { + covered = true; + break; } } @@ -256,14 +252,13 @@ void show_subnet_aggregation(void) { } int scattered_count = total_ipv4 - aggregated_count; - if (!has_output) { + /* 显示散乱IP */ + if (scattered_count > 0 || (!has_output && total_ipv4 > 0)) { if (scattered_count > 0) { printf(" - (散乱 IPv4) (%d 个)\n", scattered_count); - } else if (total_ipv4 > 0) { + } else { printf(" - (散乱 IPv4)\n"); } - } else if (scattered_count > 0) { - printf(" - (散乱 IPv4) (%d 个)\n", scattered_count); } if (v6_count > 0) {