LIB.T
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:969k
源码类别:

操作系统开发

开发平台:

C/C++

  1. 21015 SINGLE  s1,s2;
  2. 21016 {
  3. 21017         EXTEND  e1,e2;
  4. 21018
  5. 21019         extend(&s1,&e1,sizeof(SINGLE));
  6. 21020         extend(&s2,&e2,sizeof(SINGLE));
  7. 21021                 /* do a multiply */
  8. 21022         mul_ext(&e1,&e2);
  9. 21023         compact(&e1,&s1,sizeof(SINGLE));
  10. 21024 }
  11. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12. src/lib/float/mlf8.c    
  13. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  14. 21100 /*
  15. 21101   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  16. 21102   See the copyright notice in the ACK home directory, in the file "Copyright".
  17. 21103 */
  18. 21104
  19. 21105 /* $Header: mlf8.c,v 1.4 93/01/05 12:05:44 ceriel Exp $ */
  20. 21106
  21. 21107 /*
  22. 21108  * Multiply Double Precision Float (MLF 8)
  23. 21109  */
  24. 21110
  25. 21111 #include        "FP_types.h"
  26. 21112
  27. 21113 void
  28. 21114 mlf8(s2,s1)
  29. 21115 DOUBLE  s1,s2;
  30. 21116 {
  31. 21117         EXTEND  e1,e2;
  32. 21118
  33. 21119         extend(&s1.d[0],&e1,sizeof(DOUBLE));
  34. .Op 189 src/lib/float/mlf8.c
  35. 21120         extend(&s2.d[0],&e2,sizeof(DOUBLE));
  36. 21121                 /* do a multiply */
  37. 21122         mul_ext(&e1,&e2);
  38. 21123         compact(&e1,&s1.d[0],sizeof(DOUBLE));
  39. 21124 }
  40. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  41. src/lib/float/mul_ext.c    
  42. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  43. 21200 /*
  44. 21201   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  45. 21202   See the copyright notice in the ACK home directory, in the file "Copyright".
  46. 21203 */
  47. 21204
  48. 21205 /* $Header: mul_ext.c,v 1.6 93/01/05 12:05:51 ceriel Exp $ */
  49. 21206
  50. 21207 /*
  51. 21208         ROUTINE TO MULTIPLY TWO EXTENDED FORMAT NUMBERS
  52. 21209 */
  53. 21210
  54. 21211 # include "FP_bias.h"
  55. 21212 # include "FP_trap.h"
  56. 21213 # include "FP_types.h"
  57. 21214 # include "FP_shift.h"
  58. 21215
  59. 21216 void
  60. 21217 mul_ext(e1,e2)
  61. 21218 EXTEND  *e1,*e2;
  62. 21219 {
  63. 21220         register int    i,j;            /* loop control */
  64. 21221         unsigned short  mp[4];          /* multiplier */
  65. 21222         unsigned short  mc[4];          /* multipcand */
  66. 21223         unsigned short  result[8];      /* result */
  67. 21224         register unsigned short *pres;
  68. 21225
  69. 21226         /* first save the sign (XOR)                    */
  70. 21227         e1->sign ^= e2->sign;
  71. 21228
  72. 21229         /* compute new exponent */
  73. 21230         e1->exp += e2->exp + 1;
  74. 21231         /* 128 bit multiply of mantissas                        */
  75. 21232
  76. 21233                 /* assign unknown long formats          */
  77. 21234                 /* to known unsigned word formats       */
  78. 21235         mp[0] = e1->m1 >> 16;
  79. 21236         mp[1] = (unsigned short) e1->m1;
  80. 21237         mp[2] = e1->m2 >> 16;
  81. 21238         mp[3] = (unsigned short) e1->m2;
  82. 21239         mc[0] = e2->m1 >> 16;
  83. 21240         mc[1] = (unsigned short) e2->m1;
  84. 21241         mc[2] = e2->m2 >> 16;
  85. 21242         mc[3] = (unsigned short) e2->m2;
  86. 21243         for (i = 8; i--;) {
  87. 21244                 result[i] = 0;
  88. .Ep 190 src/lib/float/mul_ext.c
  89. 21245         }
  90. 21246         /*
  91. 21247          *      fill registers with their components
  92. 21248          */
  93. 21249         for(i=4, pres = &result[4];i--;pres--) if (mp[i]) {
  94. 21250                 unsigned short k = 0;
  95. 21251                 unsigned long mpi = mp[i];
  96. 21252                 for(j=4;j--;) {
  97. 21253                         unsigned long tmp = (unsigned long)pres[j] + k;
  98. 21254                         if (mc[j]) tmp += mpi * mc[j];
  99. 21255                         pres[j] = tmp;
  100. 21256                         k = tmp >> 16;
  101. 21257                 }
  102. 21258                 pres[-1] = k;
  103. 21259         }
  104. 21260         if (! (result[0] & 0x8000)) {
  105. 21261                 e1->exp--;
  106. 21262                 for (i = 0; i <= 3; i++) {
  107. 21263                         result[i] <<= 1;
  108. 21264                         if (result[i+1]&0x8000) result[i] |= 1;
  109. 21265                 }
  110. 21266                 result[4] <<= 1;
  111. 21267         }
  112. 21268
  113. 21269         /*
  114. 21270          *      combine the registers to a total
  115. 21271          */
  116. 21272         e1->m1 = ((unsigned long)(result[0]) << 16) + result[1];
  117. 21273         e1->m2 = ((unsigned long)(result[2]) << 16) + result[3];
  118. 21274         if (result[4] & 0x8000) {
  119. 21275                 if (++e1->m2 == 0)
  120. 21276                         if (++e1->m1 == 0) {
  121. 21277                                 e1->m1 = NORMBIT;
  122. 21278                                 e1->exp++;
  123. 21279                         }
  124. 21280         }
  125. 21281
  126. 21282                                         /* check for overflow   */
  127. 21283         if (e1->exp >= EXT_MAX) {
  128. 21284                 trap(EFOVFL);
  129. 21285                         /* if caught                    */
  130. 21286                         /* return signed infinity       */
  131. 21287                 e1->exp = EXT_MAX;
  132. 21288 infinity:       e1->m1 = e1->m2 =0L;
  133. 21289                 return;
  134. 21290         }
  135. 21291                                 /* check for underflow  */
  136. 21292         if (e1->exp < EXT_MIN)  {
  137. 21293                 trap(EFUNFL);
  138. 21294                 e1->exp = EXT_MIN;
  139. 21295                 goto infinity;
  140. 21296         }
  141. 21297 }
  142. .Op 191 src/lib/float/ngf4.c
  143. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  144. src/lib/float/ngf4.c    
  145. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  146. 21300 /*
  147. 21301   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  148. 21302   See the copyright notice in the ACK home directory, in the file "Copyright".
  149. 21303 */
  150. 21304
  151. 21305 /* $Header: ngf4.c,v 1.7 93/01/05 12:05:57 ceriel Exp $ */
  152. 21306
  153. 21307 /*
  154. 21308                 NEGATE A FLOATING POINT (NGF 4)
  155. 21309 */
  156. 21310 /********************************************************/
  157. 21311
  158. 21312 #include "FP_types.h"
  159. 21313 #include "get_put.h"
  160. 21314
  161. 21315 #define OFF ((FL_MSW_AT_LOW_ADDRESS ? 0 : 2) + (FL_MSB_AT_LOW_ADDRESS ? 0 : 1))
  162. 21316 void
  163. 21317 ngf4(f)
  164. 21318 SINGLE  f;
  165. 21319 {
  166. 21320         unsigned char *p;
  167. 21321
  168. 21322         if (f != (SINGLE) 0) {
  169. 21323                 p = (unsigned char *) &f + OFF;
  170. 21324                 *p ^= 0x80;
  171. 21325         }
  172. 21326 }
  173. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  174. src/lib/float/ngf8.c    
  175. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  176. 21400 /*
  177. 21401   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  178. 21402   See the copyright notice in the ACK home directory, in the file "Copyright".
  179. 21403 */
  180. 21404
  181. 21405 /* $Header: ngf8.c,v 1.8 93/01/05 12:06:05 ceriel Exp $ */
  182. 21406
  183. 21407 /*
  184. 21408                 NEGATE A FLOATING POINT (NGF 8)
  185. 21409 */
  186. 21410 /********************************************************/
  187. 21411
  188. 21412 #include "FP_types.h"
  189. 21413 #include "get_put.h"
  190. 21414
  191. 21415 #define OFF ((FL_MSL_AT_LOW_ADDRESS ? 0 : 4) + (FL_MSW_AT_LOW_ADDRESS ? 0 : 2) + (FL_MSB_AT_LOW_ADDRESS ? 0 : 1))
  192. 21416
  193. 21417 void
  194. 21418 ngf8(f)
  195. 21419 DOUBLE  f;
  196. .Ep 192 src/lib/float/ngf8.c
  197. 21420 {
  198. 21421         unsigned char   *p;
  199. 21422
  200. 21423         if (f.d[0] != 0 || f.d[1] != 0) {
  201. 21424                 p = (unsigned char *) &f + OFF;
  202. 21425                 *p ^= 0x80;
  203. 21426         }
  204. 21427 }
  205. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  206. src/lib/float/nrm_ext.c    
  207. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  208. 21500 /*
  209. 21501   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  210. 21502   See the copyright notice in the ACK home directory, in the file "Copyright".
  211. 21503 */
  212. 21504
  213. 21505 /* $Header: nrm_ext.c,v 1.5 93/01/05 12:06:11 ceriel Exp $ */
  214. 21506
  215. 21507 /********************************************************/
  216. 21508 /*
  217. 21509         NORMALIZE an EXTENDED FORMAT NUMBER
  218. 21510 */
  219. 21511 /********************************************************/
  220. 21512
  221. 21513 #include "FP_shift.h"
  222. 21514 #include "FP_types.h"
  223. 21515
  224. 21516 void
  225. 21517 nrm_ext(e1)
  226. 21518 EXTEND  *e1;
  227. 21519 {
  228. 21520                 /* we assume that the mantissa != 0     */
  229. 21521                 /* if it is then just return            */
  230. 21522                 /* to let it be a problem elsewhere     */
  231. 21523                 /* THAT IS, The exponent is not set to  */
  232. 21524                 /* zero. If we don't test here an       */
  233. 21525                 /* infinite loop is generated when      */
  234. 21526                 /* mantissa is zero                     */
  235. 21527
  236. 21528         if ((e1->m1 | e1->m2) == 0L)
  237. 21529                 return;
  238. 21530
  239. 21531                 /* if top word is zero mov low word     */
  240. 21532                 /* to top word, adjust exponent value   */
  241. 21533         if (e1->m1 == 0L)       {
  242. 21534                 e1->m1 = e1->m2;
  243. 21535                 e1->m2 = 0L;
  244. 21536                 e1->exp -= 32;
  245. 21537         }
  246. 21538         if ((e1->m1 & NORMBIT) == 0) {
  247. 21539                 unsigned long l = ((unsigned long)NORMBIT >> 1);
  248. 21540                 int cnt = -1;
  249. 21541
  250. 21542                 while (! (l & e1->m1)) {
  251. 21543                         l >>= 1;
  252. 21544                         cnt--;
  253. .Op 193 src/lib/float/nrm_ext.c
  254. 21545                 }
  255. 21546                 e1->exp += cnt;
  256. 21547                 b64_sft(&(e1->mantissa), cnt);
  257. 21548         }
  258. 21549 }
  259. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  260. src/lib/float/sbf4.c    
  261. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  262. 21600 /*
  263. 21601  (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  264. 21602   See the copyright notice in the ACK home directory, in the file "Copyright".
  265. 21603 */
  266. 21604
  267. 21605 /* $Header: sbf4.c,v 1.8 93/01/05 12:06:16 ceriel Exp $ */
  268. 21606
  269. 21607 /*
  270. 21608         SUBTRACT TWO FLOATS - SINGLE Precision (SBF 4)
  271. 21609 */
  272. 21610
  273. 21611 #include        "FP_types.h"
  274. 21612
  275. 21613 void
  276. 21614 sbf4(s2,s1)
  277. 21615 SINGLE  s1,s2;
  278. 21616 {
  279. 21617         EXTEND e1,e2;
  280. 21618
  281. 21619         if (s2 == (SINGLE) 0) {
  282. 21620                 return;
  283. 21621         }
  284. 21622         extend(&s1,&e1,sizeof(SINGLE));
  285. 21623         extend(&s2,&e2,sizeof(SINGLE));
  286. 21624         sub_ext(&e1,&e2);
  287. 21625         compact(&e1,&s1,sizeof(SINGLE));
  288. 21626 }
  289. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  290. src/lib/float/sbf8.c    
  291. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  292. 21700 /*
  293. 21701   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  294. 21702   See the copyright notice in the ACK home directory, in the file "Copyright".
  295. 21703 */
  296. 21704
  297. 21705 /* $Header: sbf8.c,v 1.8 93/01/05 12:06:22 ceriel Exp $ */
  298. 21706
  299. 21707 /*
  300. 21708         SUBTRACT TWO FLOATS - DOUBLE Precision (SBF 8)
  301. 21709 */
  302. .Ep 194 src/lib/float/sbf8.c
  303. 21710
  304. 21711 #include        "FP_types.h"
  305. 21712
  306. 21713 void
  307. 21714 sbf8(s2,s1)
  308. 21715 DOUBLE  s1,s2;
  309. 21716 {
  310. 21717         EXTEND e1, e2;
  311. 21718
  312. 21719         if (s2.d[0] == 0 && s2.d[1] == 0) {
  313. 21720                 return;
  314. 21721         }
  315. 21722         extend(&s1.d[0],&e1,sizeof(DOUBLE));
  316. 21723         extend(&s2.d[0],&e2,sizeof(DOUBLE));
  317. 21724         sub_ext(&e1,&e2);
  318. 21725         compact(&e1,&s1.d[0],sizeof(DOUBLE));
  319. 21726 }
  320. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  321. src/lib/float/sft_ext.c    
  322. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  323. 21800 /*
  324. 21801   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  325. 21802   See the copyright notice in the ACK home directory, in the file "Copyright".
  326. 21803 */
  327. 21804
  328. 21805 /* $Header: sft_ext.c,v 1.5 93/01/05 12:06:28 ceriel Exp $ */
  329. 21806
  330. 21807 /*
  331. 21808         SHIFT TWO EXTENDED NUMBERS INTO PROPER
  332. 21809         ALIGNMENT FOR ADDITION (exponents are equal)
  333. 21810         Numbers should not be zero on entry.
  334. 21811 */
  335. 21812
  336. 21813 #include "FP_types.h"
  337. 21814
  338. 21815 void
  339. 21816 sft_ext(e1,e2)
  340. 21817 EXTEND  *e1,*e2;
  341. 21818 {
  342. 21819         register        EXTEND  *s;
  343. 21820         register        int     diff;
  344. 21821
  345. 21822         diff = e1->exp - e2->exp;
  346. 21823
  347. 21824         if (!diff)
  348. 21825                 return; /* exponents are equal  */
  349. 21826
  350. 21827         if (diff < 0)   { /* e2 is larger       */
  351. 21828                         /* shift e1             */
  352. 21829                 diff = -diff;
  353. 21830                 s = e1;
  354. 21831         }
  355. 21832         else            /* e1 is larger         */
  356. 21833                         /* shift e2             */
  357. 21834                 s = e2;
  358. .Op 195 src/lib/float/sft_ext.c
  359. 21835
  360. 21836         s->exp += diff;
  361. 21837         b64_sft(&(s->mantissa), diff);
  362. 21838 }
  363. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  364. src/lib/float/shifter.c    
  365. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  366. 21900 /*
  367. 21901   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  368. 21902   See the copyright notice in the ACK home directory, in the file "Copyright".
  369. 21903 */
  370. 21904
  371. 21905 /* $Header: shifter.c,v 1.6 93/01/05 12:06:34 ceriel Exp $ */
  372. 21906
  373. 21907 # include "FP_types.h"
  374. 21908
  375. 21909 void
  376. 21910 b64_sft(e1,n)
  377. 21911 B64     *e1;
  378. 21912 int     n;
  379. 21913 {
  380. 21914         if (n > 0) {
  381. 21915                 if (n > 63) {
  382. 21916                         e1->l_32 = 0;
  383. 21917                         e1->h_32 = 0;
  384. 21918                         return;
  385. 21919                 }
  386. 21920                 if (n >= 32) {
  387. 21921                         e1->l_32 = e1->h_32;
  388. 21922                         e1->h_32 = 0;
  389. 21923                         n -= 32;
  390. 21924                 }
  391. 21925                 if (n > 0) {
  392. 21926                         e1->l_32 >>= n;
  393. 21927                         if (e1->h_32 != 0) {
  394. 21928                                 e1->l_32 |= (e1->h_32 << (32 - n));
  395. 21929                                 e1->h_32 >>= n;
  396. 21930                         }
  397. 21931                 }
  398. 21932                 return;
  399. 21933         }
  400. 21934         n = -n;
  401. 21935         if (n > 0) {
  402. 21936                 if (n > 63) {
  403. 21937                         e1->l_32 = 0;
  404. 21938                         e1->h_32 = 0;
  405. 21939                         return;
  406. 21940                 }
  407. 21941                 if (n >= 32) {
  408. 21942                         e1->h_32 = e1->l_32;
  409. 21943                         e1->l_32 = 0;
  410. 21944                         n -= 32;
  411. 21945                 }
  412. 21946                 if (n > 0) {
  413. 21947                         e1->h_32 <<= n;
  414. 21948                         if (e1->l_32 != 0) {
  415. 21949                                 e1->h_32 |= (e1->l_32 >> (32 - n));
  416. .Ep 196 src/lib/float/shifter.c
  417. 21950                                 e1->l_32 <<= n;
  418. 21951                         }
  419. 21952                 }
  420. 21953         }
  421. 21954 }
  422. 21956 void
  423. 21957 b64_lsft(e1)
  424. 21958 B64     *e1;
  425. 21959 {
  426. 21960         /*      shift left 1 bit */
  427. 21961         e1->h_32 <<= 1;
  428. 21962         if (e1->l_32 & 0x80000000L) e1->h_32 |= 1;
  429. 21963         e1->l_32 <<= 1;
  430. 21964 }
  431. 21966 void
  432. 21967 b64_rsft(e1)
  433. 21968 B64     *e1;
  434. 21969 {
  435. 21970         /*      shift right 1 bit */
  436. 21971         e1->l_32 >>= 1;
  437. 21972         if (e1->h_32 & 1) e1->l_32 |= 0x80000000L;
  438. 21973         e1->h_32 >>= 1;
  439. 21974 }
  440. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  441. src/lib/float/sub_ext.c    
  442. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  443. 22000 /*
  444. 22001   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  445. 22002   See the copyright notice in the ACK home directory, in the file "Copyright".
  446. 22003 */
  447. 22004
  448. 22005 /* $Header: sub_ext.c,v 1.6 93/01/05 12:06:40 ceriel Exp $ */
  449. 22006
  450. 22007 /*
  451. 22008         SUBTRACT 2 EXTENDED FORMAT NUMBERS
  452. 22009 */
  453. 22010
  454. 22011 #include "FP_types.h"
  455. 22012
  456. 22013 void
  457. 22014 sub_ext(e1,e2)
  458. 22015 EXTEND  *e1,*e2;
  459. 22016 {
  460. 22017         if ((e2->m1 | e2->m2) == 0L) {
  461. 22018                 return;
  462. 22019         }
  463. 22020         if ((e1->m1 | e1->m2) == 0L) {
  464. 22021                 *e1 = *e2;
  465. 22022                 e1->sign = e2->sign ? 0 : 1;
  466. 22023                 return;
  467. 22024         }
  468. .Op 197 src/lib/float/sub_ext.c
  469. 22025         sft_ext(e1, e2);
  470. 22026         if (e1->sign != e2->sign) {
  471. 22027                 /* e1 - e2 = e1 + (-e2) */
  472. 22028                 if (b64_add(&e1->mantissa,&e2->mantissa)) { /* addition carry */
  473. 22029                         b64_rsft(&e1->mantissa);      /* shift mantissa one bit RIGHT */
  474. 22030                         e1->m1 |= 0x80000000L;  /* set max bit  */
  475. 22031                         e1->exp++;              /* increase the exponent */
  476. 22032                 }
  477. 22033         }
  478. 22034         else if (e2->m1 > e1->m1 ||
  479. 22035                  (e2->m1 == e1->m1 && e2->m2 > e1->m2)) {
  480. 22036                 /*      abs(e2) > abs(e1) */
  481. 22037                 if (e1->m2 > e2->m2) {
  482. 22038                         e2->m1 -= 1;    /* carry in */
  483. 22039                 }
  484. 22040                 e2->m1 -= e1->m1;
  485. 22041                 e2->m2 -= e1->m2;
  486. 22042                 *e1 = *e2;
  487. 22043                 e1->sign = e2->sign ? 0 : 1;
  488. 22044         }
  489. 22045         else {
  490. 22046                 if (e2->m2 > e1->m2)
  491. 22047                         e1->m1 -= 1;    /* carry in */
  492. 22048                 e1->m1 -= e2->m1;
  493. 22049                 e1->m2 -= e2->m2;
  494. 22050         }
  495. 22051         nrm_ext(e1);
  496. 22052 }
  497. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  498. src/lib/float/zrf4.c    
  499. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  500. 22100 /*
  501. 22101   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  502. 22102   See the copyright notice in the ACK home directory, in the file "Copyright".
  503. 22103 */
  504. 22104
  505. 22105 /* $Header: zrf4.c,v 1.5 93/01/05 12:06:46 ceriel Exp $ */
  506. 22106
  507. 22107 /*
  508. 22108         return a zero float (ZRF 4)
  509. 22109 */
  510. 22110
  511. 22111 #include "FP_types.h"
  512. 22112
  513. 22113 void
  514. 22114 zrf4(l)
  515. 22115 SINGLE  *l;
  516. 22116 {
  517. 22117         *l = 0L;
  518. 22118 }
  519. .Ep 198 src/lib/float/zrf8.c
  520. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  521. src/lib/float/zrf8.c    
  522. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  523. 22200 /*
  524. 22201   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  525. 22202   See the copyright notice in the ACK home directory, in the file "Copyright".
  526. 22203 */
  527. 22204
  528. 22205 /* $Header: zrf8.c,v 1.4 93/01/05 12:06:52 ceriel Exp $ */
  529. 22206
  530. 22207 /*
  531. 22208         return a zero double (ZRF 8)
  532. 22209 */
  533. 22210
  534. 22211 #include "FP_types.h"
  535. 22212
  536. 22213 void
  537. 22214 zrf8(z)
  538. 22215 DOUBLE  *z;
  539. 22216 {
  540. 22217
  541. 22218         z->d[0] = 0L;
  542. 22219         z->d[1] = 0L;
  543. 22220 }
  544. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  545. src/lib/float/zrf_ext.c    
  546. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  547. 22300 /*
  548. 22301   (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  549. 22302   See the copyright notice in the ACK home directory, in the file "Copyright".
  550. 22303 */
  551. 22304
  552. 22305 /* $Header: zrf_ext.c,v 1.5 93/01/05 12:06:58 ceriel Exp $ */
  553. 22306
  554. 22307 /*
  555. 22308         ZERO and return EXTEND FORMAT FLOAT
  556. 22309 */
  557. 22310
  558. 22311 #include "FP_types.h"
  559. 22312
  560. 22313 void
  561. 22314 zrf_ext(e)
  562. 22315 EXTEND  *e;
  563. 22316 {
  564. 22317         e->m1 = 0;
  565. 22318         e->m2 = 0;
  566. 22319         e->exp = 0;
  567. 22320         e->sign = 0;
  568. 22321 }
  569. .Op 199 src/lib/float/fptrp.s
  570. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  571. src/lib/float/fptrp.s    
  572. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  573. 22400 #
  574. 22401 .sect .text; .sect .rom; .sect .data; .sect .bss
  575. 22402 .define __fptrp
  576. 22403 .sect .text
  577. 22404 __fptrp:
  578. 22405 #if __i386
  579. 22406         push    ebp
  580. 22407         mov     ebp, esp
  581. 22408         mov     eax, 8(bp)
  582. 22409         call    .Xtrp
  583. 22410         leave
  584. 22411         ret
  585. 22412 #else /* i86 */
  586. 22413         push    bp
  587. 22414         mov     bp, sp
  588. 22415         mov     ax, 4(bp)
  589. 22416         call    .Xtrp
  590. 22417         jmp     .cret
  591. 22418 #endif
  592. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  593. src/lib/fphook/fltpr.c    
  594. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  595. 22500 #include        <stdio.h>
  596. 22501 #include        <stdlib.h>
  597. 22502 #include        "../stdio/loc_incl.h"
  598. 22503
  599. 22504 int _fp_hook = 1;
  600. 22505
  601. 22506 char *
  602. 22507 _f_print(va_list *ap, int flags, char *s, char c, int precision)
  603. 22508 {
  604. 22509         fprintf(stderr,"cannot print floating pointn");
  605. 22510         exit(EXIT_FAILURE);
  606. 22511 }
  607. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  608. src/lib/fphook/fphook.c    
  609. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  610. 22600 /*
  611. 22601  * fltpr.c - print floating point numbers
  612. 22602  */
  613. 22603 /* $Header: fltpr.c,v 1.4 90/02/27 16:47:40 eck Exp $ */
  614. 22604
  615. 22605 #ifndef NOFLOAT
  616. 22606 #include        <string.h>
  617. 22607 #include        <stdarg.h>
  618. 22608 #include        "../stdio/loc_incl.h"
  619. 22609 int _fp_hook = 1;
  620. .Ep 200 src/lib/fphook/fphook.c
  621. 22610
  622. 22611 static char *
  623. 22612 _pfloat(long double r, register char *s, int n, int flags)
  624. 22613 {
  625. 22614         register char *s1;
  626. 22615         int sign, dp;
  627. 22616         register int i;
  628. 22617
  629. 22618         s1 = _fcvt(r, n, &dp, &sign);
  630. 22619         if (sign)
  631. 22620                 *s++ = '-';
  632. 22621         else if (flags & FL_SIGN)
  633. 22622                 *s++ = '+';
  634. 22623         else if (flags & FL_SPACE)
  635. 22624                 *s++ = ' ';
  636. 22625
  637. 22626         if (dp<=0)
  638. 22627                 *s++ = '0';
  639. 22628         for (i=dp; i>0; i--)
  640. 22629                 if (*s1) *s++ = *s1++;
  641. 22630                 else *s++ = '0';
  642. 22631         if (((i=n) > 0) || (flags & FL_ALT))
  643. 22632                 *s++ = '.';
  644. 22633         while (++dp <= 0) {
  645. 22634                 if (--i<0)
  646. 22635                         break;
  647. 22636                 *s++ = '0';
  648. 22637         }
  649. 22638         while (--i >= 0)
  650. 22639                 if (*s1) *s++ = *s1++;
  651. 22640                 else *s++ = '0';
  652. 22641         return s;
  653. 22642 }
  654. 22644 static char *
  655. 22645 _pscien(long double r, register char *s, int n, int flags)
  656. 22646 {
  657. 22647         int sign, dp; 
  658. 22648         register char *s1;
  659. 22649
  660. 22650         s1 = _ecvt(r, n + 1, &dp, &sign);
  661. 22651         if (sign)
  662. 22652                 *s++ = '-';
  663. 22653         else if (flags & FL_SIGN)
  664. 22654                 *s++ = '+';
  665. 22655         else if (flags & FL_SPACE)
  666. 22656                 *s++ = ' ';
  667. 22657
  668. 22658         *s++ = *s1++;
  669. 22659         if ((n > 0) || (flags & FL_ALT))
  670. 22660                 *s++ = '.';
  671. 22661         while (--n >= 0)
  672. 22662                 if (*s1) *s++ = *s1++;
  673. 22663                 else *s++ = '0';
  674. 22664         *s++ = 'e';
  675. 22665         if ( r != 0 ) --dp ;
  676. 22666         if ( dp<0 ) {
  677. 22667                 *s++ = '-' ; dp= -dp ;
  678. 22668         } else {
  679. 22669                 *s++ = '+' ;
  680. .Op 201 src/lib/fphook/fphook.c
  681. 22670         }
  682. 22671         if (dp >= 100) {
  683. 22672                 *s++ = '0' + (dp / 100);
  684. 22673                 dp %= 100;
  685. 22674         }
  686. 22675         *s++ = '0' + (dp/10);
  687. 22676         *s++ = '0' + (dp%10);
  688. 22677         return s;
  689. 22678 }
  690. 22680 #define NDIGINEXP(exp)          (((exp) >= 100 || (exp) <= -100) ? 3 : 2)
  691. 22681 #define LOW_EXP                 -4
  692. 22682 #define USE_EXP(exp, ndigits)   (((exp) < LOW_EXP + 1) || (exp >= ndigits + 1))
  693. 22683
  694. 22684 static char *
  695. 22685 _gcvt(long double value, int ndigit, char *s, int flags)
  696. 22686 {
  697. 22687         int sign, dp;
  698. 22688         register char *s1, *s2;
  699. 22689         register int i;
  700. 22690         register int nndigit = ndigit;
  701. 22691
  702. 22692         s1 = _ecvt(value, ndigit, &dp, &sign);
  703. 22693         s2 = s;
  704. 22694         if (sign) *s2++ = '-';
  705. 22695         else if (flags & FL_SIGN)
  706. 22696                 *s2++ = '+';
  707. 22697         else if (flags & FL_SPACE)
  708. 22698                 *s2++ = ' ';
  709. 22699
  710. 22700         if (!(flags & FL_ALT))
  711. 22701                 for (i = nndigit - 1; i > 0 && s1[i] == '0'; i--)
  712. 22702                         nndigit--;
  713. 22703
  714. 22704         if (USE_EXP(dp,ndigit)) {
  715. 22705                 /* Use E format */
  716. 22706                 dp--;
  717. 22707                 *s2++ = *s1++;
  718. 22708                 if ((nndigit > 1) || (flags & FL_ALT)) *s2++ = '.';
  719. 22709                 while (--nndigit > 0) *s2++ = *s1++;
  720. 22710                 *s2++ = 'e';
  721. 22711                 if (dp < 0) {
  722. 22712                         *s2++ = '-';
  723. 22713                         dp = -dp;
  724. 22714                 }
  725. 22715                 else     *s2++ = '+';
  726. 22716                 s2 += NDIGINEXP(dp);
  727. 22717                 *s2 = 0;
  728. 22718                 for (i = NDIGINEXP(dp); i > 0; i--) {
  729. 22719                         *--s2 = dp % 10 + '0';
  730. 22720                         dp /= 10;
  731. 22721                 }
  732. 22722                 return s;
  733. 22723         }
  734. 22724         /* Use f format */
  735. 22725         if (dp <= 0) {
  736. 22726                 if (*s1 != '0') {
  737. 22727                         /* otherwise the whole number is 0 */
  738. 22728                         *s2++ = '0';
  739. 22729                         *s2++ = '.';
  740. .Ep 202 src/lib/fphook/fphook.c
  741. 22730                 }
  742. 22731                 while (dp < 0) {
  743. 22732                         dp++;
  744. 22733                         *s2++ = '0';
  745. 22734                 }
  746. 22735         }
  747. 22736         for (i = 1; i <= nndigit; i++) {
  748. 22737                 *s2++ = *s1++;
  749. 22738                 if (i == dp) *s2++ = '.';
  750. 22739         }
  751. 22740         if (i <= dp) {
  752. 22741                 while (i++ <= dp) *s2++ = '0';
  753. 22742                 *s2++ = '.';
  754. 22743         }
  755. 22744         if ((s2[-1]=='.') && !(flags & FL_ALT)) s2--;
  756. 22745         *s2 = '';
  757. 22746         return s;
  758. 22747 }
  759. 22749 char *
  760. 22750 _f_print(va_list *ap, int flags, char *s, char c, int precision)
  761. 22751 {
  762. 22752         register char *old_s = s;
  763. 22753         long double ld_val;
  764. 22754
  765. 22755         if (flags & FL_LONGDOUBLE) ld_val = va_arg(*ap, long double);
  766. 22756         else ld_val = (long double) va_arg(*ap, double);
  767. 22757
  768. 22758         switch(c) {
  769. 22759         case 'f':
  770. 22760                 s = _pfloat(ld_val, s, precision, flags);
  771. 22761                 break;
  772. 22762         case 'e':
  773. 22763         case 'E':
  774. 22764                 s = _pscien(ld_val, s, precision , flags);
  775. 22765                 break;
  776. 22766         case 'g':
  777. 22767         case 'G':
  778. 22768                 s = _gcvt(ld_val, precision, s, flags);
  779. 22769                 s += strlen(s);
  780. 22770                 break;
  781. 22771         }
  782. 22772         if ( c == 'E' || c == 'G') {
  783. 22773                 while (*old_s && *old_s != 'e') old_s++;
  784. 22774                 if (*old_s == 'e') *old_s = 'E';
  785. 22775         }
  786. 22776         return s;
  787. 22777 }
  788. 22778 #endif  /* NOFLOAT */
  789. 22779 /* $Header: strtod.c,v 1.3 90/09/07 11:00:24 eck Exp $ */
  790. 22780
  791. 22781 #include <stdlib.h>
  792. 22782 #include "../ansi/ext_fmt.h"
  793. 22783
  794. 22784 void _str_ext_cvt(const char *s, char **ss, struct EXTEND *e);
  795. 22785 double _ext_dbl_cvt(struct EXTEND *e);
  796. 22786
  797. 22787 double
  798. 22788 strtod(const char *p, char **pp)
  799. 22789 {
  800. .Op 203 src/lib/fphook/fphook.c
  801. 22790         struct EXTEND e;
  802. 22791
  803. 22792         _str_ext_cvt(p, pp, &e);
  804. 22793         return _ext_dbl_cvt(&e);
  805. 22794 }
  806. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  807. src/lib/fphook/strtod.c    
  808. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  809. 22800 #include        <stdio.h>
  810. 22801 #include        <stdlib.h>
  811. 22802
  812. 22803 double
  813. 22804 strtod(const char *p, char **pp)
  814. 22805 {
  815. 22806         fprintf(stderr,"cannot print floating pointn");
  816. 22807         exit(EXIT_FAILURE);
  817. 22808 }
  818. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  819. src/lib/ip/ether.h    
  820. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  821. 22900 /* $Id: ether.h,v 2.2 89/10/23 15:42:19 dupuy Exp $ */
  822. 22901
  823. 22902 /* Interface definitions for ethernet access library */
  824. 22903
  825. 22904 typedef union etheraddr
  826. 22905 {
  827. 22906     unsigned char bytes[6];             /* byteorder safe initialization */
  828. 22907     unsigned short shorts[3];           /* force 2-byte alignment */
  829. 22908 }
  830. 22909           ether_addr;
  831. 22910
  832. 22911 typedef struct etherpacket
  833. 22912 {
  834. 22913     ether_addr dest;
  835. 22914     ether_addr src;
  836. 22915     unsigned char type[2];              /* in network byte order! */
  837. 22916     unsigned short pktlen;              /* length of pktbuf ONLY */
  838. 22917     char *pktbuf;
  839. 22918 }
  840. 22919             ether_packet;
  841. 22920
  842. 22921 typedef struct ethervec
  843. 22922 {
  844. 22923     ether_addr dest;
  845. 22924     ether_addr src;
  846. 22925     unsigned char type[2];              /* in network byte order! */
  847. 22926     unsigned short iovcnt;              /* number of iovec to use */
  848. 22927     struct iovec *iov;                  /* ptr to array of iovec */
  849. 22928 }
  850. 22929          ether_vec;
  851. .Ep 204 src/lib/ip/ether.h
  852. 22930
  853. 22931 #ifndef __ETHER_BCAST_ADDR__
  854. 22932 extern ether_addr ether_bcast_addr;
  855. 22933 #endif
  856. 22934
  857. 22935 #ifdef __STDC__
  858. 22936
  859. 22937 int ether_open (char *name, unsigned type, ether_addr * address);
  860. 22938
  861. 22939 ether_addr *ether_address (int fd, ether_addr * address);
  862. 22940
  863. 22941 ether_addr *ether_intfaddr (char *intf, ether_addr * address);
  864. 22942
  865. 22943 char **ether_interfaces (void);
  866. 22944
  867. 22945 int ether_write (int fd, ether_packet * packet);
  868. 22946
  869. 22947 int ether_writev (int fd, ether_vec * packet);
  870. 22948
  871. 22949 int ether_read (int fd, ether_packet * packet);
  872. 22950
  873. 22951 int ether_readv (int fd, ether_vec * packet);
  874. 22952
  875. 22953 int ether_blocking (int fd, int state);
  876. 22954
  877. 22955 int ether_send_self (int fd);
  878. 22956
  879. 22957 int ether_mcast_self (int fd);
  880. 22958
  881. 22959 int ether_bcast_self (int fd);
  882. 22960
  883. 22961 char *ether_ntoa (ether_addr *);
  884. 22962
  885. 22963 ether_addr *ether_aton (char *);
  886. 22964
  887. 22965 #ifdef __GNUC__
  888. 22966
  889. 22967 /*
  890. 22968  * Avoid stupid warnings if structs aren't defined
  891. 22969  */
  892. 22970
  893. 22971 typedef struct in_addr *_ether_NoNsEnSe;
  894. 22972 typedef struct hostent *_ether_nOnSeNsE;
  895. 22973
  896. 22974 #endif
  897. 22975
  898. 22976 char *ether_e2a (ether_addr *, char *);
  899. 22977
  900. 22978 ether_addr *ether_a2e (char *, ether_addr *);
  901. 22979
  902. 22980 struct in_addr *ether_e2ip (ether_addr *, struct in_addr *);
  903. 22981
  904. 22982 ether_addr *ether_ip2e (struct in_addr *, ether_addr *);
  905. 22983
  906. 22984 char *ether_e2host (ether_addr *, char *);
  907. 22985
  908. 22986 ether_addr *ether_host2e (char *, ether_addr *);
  909. 22987
  910. 22988 ether_addr *ether_hostent2e (struct hostent *, ether_addr *);
  911. 22989
  912. .Op 205 src/lib/ip/ether.h
  913. 22990 #else
  914. 22991
  915. 22992 int ether_open ();
  916. 22993 ether_addr *ether_address ();
  917. 22994 ether_addr *ether_intfaddr ();
  918. 22995 char **ether_interfaces ();
  919. 22996 int ether_write ();
  920. 22997 int ether_writev ();
  921. 22998 int ether_read ();
  922. 22999 int ether_readv ();
  923. 23000 int ether_blocking ();
  924. 23001 int ether_send_self ();
  925. 23002 int ether_mcast_self ();
  926. 23003 int ether_bcast_self ();
  927. 23004
  928. 23005 char *ether_ntoa ();
  929. 23006 ether_addr *ether_aton ();
  930. 23007 char *ether_e2a ();
  931. 23008 ether_addr *ether_a2e ();
  932. 23009 struct in_addr *ether_e2ip ();
  933. 23010 ether_addr *ether_ip2e ();
  934. 23011 char *ether_e2host ();
  935. 23012 ether_addr *ether_host2e ();
  936. 23013 ether_addr *ether_hostent2e ();
  937. 23014
  938. 23015 #endif
  939. 23016
  940. 23017 #undef ether_cmp                        /* lose def from netinet/if_ether.h */
  941. 23018
  942. 23019 #define ether_cmp(addr1,addr2) 
  943. 23020  ((addr1)->shorts[0] != (addr2)->shorts[0] 
  944. 23021   || (addr1)->shorts[1] != (addr2)->shorts[1] 
  945. 23022   || (addr1)->shorts[2] != (addr2)->shorts[2])
  946. 23023
  947. 23024 #define ETHERSTRLEN 18                  /* max length of "xx:xx:xx:xx:xx:xx" */
  948. 23025
  949. 23026 #ifdef NOFILE                           /* i.e. we have included sys/param.h */
  950. 23027 #ifndef MAXHOSTNAMELEN                  /* but MAXHOSTNAMELEN still isnt set */
  951. 23028 #define MAXHOSTNAMELEN 64
  952. 23029 #endif
  953. 23030 #endif
  954. 23031
  955. 23032 /* should be defined in terms of ether_packet struct; need offsetof() macro */
  956. 23033
  957. 23034 #define ETHER_DST       0
  958. 23035 #define ETHER_SRC       6
  959. 23036 #define ETHER_TYPE      12
  960. 23037 #define ETHER_PKT       14
  961. 23038 #define ETHER_MIN       46
  962. 23039 #define ETHER_MAX       1500
  963. 23040
  964. 23041 #define ETHER_MINTYPE   0x5DD           /* lowest protocol not valid IEEE802 */
  965. 23042 #define ETHER_MAXTYPE   0xFFFF          /* largest possible protocol */
  966. 23043
  967. 23044 #define ETHER_MCAST(addr) (((unsigned char *) (addr))[0] & 0x01)
  968. 23045
  969. 23046 #ifdef NT_ALLTYPES
  970. 23047 #define ETHER_ALLTYPES NT_ALLTYPES
  971. 23048 #else
  972. 23049 #define ETHER_ALLTYPES ((unsigned) -1)
  973. .Ep 206 src/lib/ip/ether.h
  974. 23050 #endif
  975. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  976. src/lib/ip/domainname.c    
  977. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  978. 23100 /*
  979. 23101 domainname.c
  980. 23102 */
  981. 23103
  982. 23104 #include <stdio.h>
  983. 23105 #include <string.h>
  984. 23106 #include <net/netlib.h>
  985. 23107
  986. 23108 int getdomainname(domain, size)
  987. 23109 char *domain;
  988. 23110 size_t size;
  989. 23111 {
  990. 23112         FILE *domainfile;
  991. 23113         char *line;
  992. 23114
  993. 23115         domainfile= fopen("/etc/domainname", "r");
  994. 23116         if (!domainfile)
  995. 23117         {
  996. 23118                 return -1;
  997. 23119         }
  998. 23120
  999. 23121         line= fgets(domain, size, domainfile);
  1000. 23122         fclose(domainfile);
  1001. 23123         if (!line)
  1002. 23124                 return -1;
  1003. 23125         line= strchr(domain, 'n');
  1004. 23126         if (line)
  1005. 23127                 *line= '';
  1006. 23128         return 0;
  1007. 23129 }
  1008. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1009. src/lib/ip/ether_line.c    
  1010. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1011. 23200 /*
  1012. 23201 **  ETHER_LINE
  1013. 23202 **
  1014. 23203 **      This routine parses the array pointed to by "line" (which should be
  1015. 23204 **      from a file in the format of /etc/ethers) and returns in "eaddr" the
  1016. 23205 **      ethernet address at the start of the line and the corresponding host
  1017. 23206 **      name in "hostname".  It assumes either tabs or spaces separate the
  1018. 23207 **      two.  The buffer pointed to by "hostname" must be big enough to hold
  1019. 23208 **      the host name plus a NULL byte.
  1020. 23209 **      The function returns 0 on success and 1 on failure.
  1021. .Op 207 src/lib/ip/ether_line.c
  1022. 23210 **      Arguments are assumed sensible.  Null pointers will probably cause
  1023. 23211 **      exceptions.
  1024. 23212 **      Author: Gregory J. Sharp, July 1990
  1025. 23213 **      Adapted to MINIX: Philip Homburg, May 1992
  1026. 23214 */
  1027. 23215
  1028. 23216 #include <sys/types.h>
  1029. 23217 #include <ctype.h>
  1030. 23218 #include <stdlib.h>
  1031. 23219 #include <net/gen/ether.h>
  1032. 23220 #include <net/gen/if_ether.h>
  1033. 23221
  1034. 23222 int
  1035. 23223 ether_line(line, eaddr, hostname)
  1036. 23224 char *                  line;
  1037. 23225 struct ether_addr *     eaddr;
  1038. 23226 char *                  hostname;
  1039. 23227 {
  1040. 23228     register int i;
  1041. 23229     register unsigned long val;
  1042. 23230
  1043. 23231 /* skip leading white space */
  1044. 23232     while (*line != 'n' && (*line == ' ' || *line == 't'))
  1045. 23233         line++;
  1046. 23234
  1047. 23235 /* read the ethernet address */
  1048. 23236     for (i = 0; i < 5; i++)
  1049. 23237     {
  1050. 23238         val = (unsigned long) strtol(line, &line, 16);
  1051. 23239         if (val > 255 || *line++ != ':')
  1052. 23240             return 1;
  1053. 23241         eaddr->ea_addr[i] = val & 0xff;
  1054. 23242     }
  1055. 23243     val = (unsigned long) strtol(line, &line, 16);
  1056. 23244     if (val > 255 || (*line != ' ' && *line != 't'))
  1057. 23245         return 1;
  1058. 23246     eaddr->ea_addr[i] = val & 0xff;
  1059. 23247
  1060. 23248 /* skip leading white space */
  1061. 23249     while (*line != 'n' && (*line == ' ' || *line == 't'))
  1062. 23250         line++;
  1063. 23251
  1064. 23252 /* read in the hostname */
  1065. 23253     while (!isspace(*line))
  1066. 23254         *hostname++ = *line++;
  1067. 23255     *hostname = '';
  1068. 23256     return 0;
  1069. 23257 }
  1070. .Ep 208 src/lib/ip/ethera2n.c
  1071. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1072. src/lib/ip/ethera2n.c    
  1073. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1074. 23300 /*
  1075. 23301 ethera2n.c
  1076. 23302
  1077. 23303 Convert an ASCII string with an ethernet address into a struct ether_addr.
  1078. 23304
  1079. 23305 Created:        Nov 17, 1992 by Philip Homburg
  1080. 23306 */
  1081. 23307
  1082. 23308 #include <sys/types.h>
  1083. 23309 #include <stdlib.h>
  1084. 23310 #include <net/netlib.h>
  1085. 23311 #include <net/gen/ether.h>
  1086. 23312 #include <net/gen/if_ether.h>
  1087. 23313
  1088. 23314 struct ether_addr *ether_aton(s)
  1089. 23315 char *s;
  1090. 23316 {
  1091. 23317         static struct ether_addr ea;
  1092. 23318
  1093. 23319         int i;
  1094. 23320         long v;
  1095. 23321         char *check;
  1096. 23322
  1097. 23323         if (s == NULL)
  1098. 23324                 return NULL;
  1099. 23325
  1100. 23326         for (i=0; i<6; i++)
  1101. 23327         {
  1102. 23328                 v= strtol(s, &check, 16);
  1103. 23329                 if (v<0 || v>255)
  1104. 23330                         return NULL;
  1105. 23331                 if ((i<5 && check[0] != ':') || (i == 5 && check[0] != ''))
  1106. 23332                         return NULL;
  1107. 23333                 ea.ea_addr[i]= v;
  1108. 23334                 s= check+1;
  1109. 23335         }
  1110. 23336         return &ea;
  1111. 23337 }
  1112. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1113. src/lib/ip/ethere2a.c    
  1114. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1115. 23400 /* $Id: ethere2a.c,v 2.1 89/10/23 15:42:28 dupuy Exp $ */
  1116. 23401 /* This file was part of the etherlib package. */
  1117. 23402
  1118. 23403 #include <stdio.h>
  1119. 23404
  1120. 23405 #ifdef _MINIX
  1121. 23406 #include <sys/types.h>
  1122. 23407 #include <stdlib.h>
  1123. 23408
  1124. 23409 #include <net/gen/ether.h>
  1125. .Op 209 src/lib/ip/ethere2a.c
  1126. 23410 #include <net/gen/if_ether.h>
  1127. 23411
  1128. 23412 #define ETHERSTRLEN 18                  /* max length of "xx:xx:xx:xx:xx:xx" */
  1129. 23413 #define ether_addr      ether_addr_t
  1130. 23414 #define bytes           ea_addr
  1131. 23415 char *ether_e2a _ARGS(( ether_addr_t *a, char *e ));
  1132. 23416 #else
  1133. 23417 #include "libether.h"
  1134. 23418 #endif
  1135. 23419
  1136. 23420 char *
  1137. 23421 ether_e2a (addr, estring)
  1138. 23422 ether_addr *addr;
  1139. 23423 char *estring;
  1140. 23424 {
  1141. 23425 #ifdef lint
  1142. 23426     char *sprintf ();
  1143. 23427 #endif
  1144. 23428     if (estring == NULL)
  1145. 23429         estring = (char *) malloc (ETHERSTRLEN);
  1146. 23430
  1147. 23431     if (estring != NULL)
  1148. 23432         (void) sprintf (estring, "%x:%x:%x:%x:%x:%x",
  1149. 23433                         addr->bytes[0], addr->bytes[1], addr->bytes[2],
  1150. 23434                         addr->bytes[3], addr->bytes[4], addr->bytes[5]);
  1151. 23435     return (estring);
  1152. 23436 }
  1153. 23438 #ifndef ETHERDB
  1154. 23439
  1155. 23440 char *
  1156. 23441 ether_ntoa (addr)
  1157. 23442 ether_addr *addr;
  1158. 23443 {
  1159. 23444     static char estring[ETHERSTRLEN];
  1160. 23445
  1161. 23446     return (ether_e2a (addr, estring));
  1162. 23447 }
  1163. 23449 #endif
  1164. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1165. src/lib/ip/etherh2n.c    
  1166. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1167. 23500 /*
  1168. 23501 etherh2n.c
  1169. 23502
  1170. 23503 Created:        May 20, 1992 by Philip Homburg
  1171. 23504 */
  1172. 23505
  1173. 23506 #include <stdio.h>
  1174. 23507 #include <string.h>
  1175. 23508 #include <net/gen/if_ether.h>
  1176. 23509
  1177. .Ep 210 src/lib/ip/etherh2n.c
  1178. 23510 int
  1179. 23511 ether_hostton(hostname, e)
  1180. 23512 char *hostname;
  1181. 23513 struct ether_addr *e;
  1182. 23514 {
  1183. 23515         FILE *etherf;
  1184. 23516         char b[256], hn[256];
  1185. 23517
  1186. 23518         etherf= fopen(_PATH_ETHERS, "r");
  1187. 23519         if (etherf == NULL)
  1188. 23520                 return 1;
  1189. 23521
  1190. 23522         while(fgets(b, sizeof(b), etherf) != NULL)
  1191. 23523         {
  1192. 23524                 if (ether_line(b, e, hn) == 0 && strcmp(hn, hostname) == 0)
  1193. 23525                 {
  1194. 23526                         fclose(etherf);
  1195. 23527                         return 0;
  1196. 23528                 }
  1197. 23529         }
  1198. 23530         fclose(etherf);
  1199. 23531         return 1;
  1200. 23532 }
  1201. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1202. src/lib/ip/ethern2h.c    
  1203. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1204. 23600 /*
  1205. 23601 ethern2h.c
  1206. 23602
  1207. 23603 Created:        Nov 12, 1992 by Philip Homburg
  1208. 23604 */
  1209. 23605
  1210. 23606 #include <sys/types.h>
  1211. 23607 #include <stdio.h>
  1212. 23608 #include <string.h>
  1213. 23609 #include <net/gen/ether.h>
  1214. 23610 #include <net/gen/if_ether.h>
  1215. 23611
  1216. 23612 int
  1217. 23613 ether_ntohost(hostname, e)
  1218. 23614 char *hostname;
  1219. 23615 struct ether_addr *e;
  1220. 23616 {
  1221. 23617         FILE *etherf;
  1222. 23618         char b[256];
  1223. 23619         struct ether_addr e_tmp;
  1224. 23620
  1225. 23621         etherf= fopen(_PATH_ETHERS, "r");
  1226. 23622         if (etherf == NULL)
  1227. 23623                 return 1;
  1228. 23624
  1229. 23625         while(fgets(b, sizeof(b), etherf) != NULL)
  1230. 23626         {
  1231. 23627                 if (ether_line(b, &e_tmp, hostname) == 0 && 
  1232. 23628                 memcmp(&e_tmp, e, sizeof(e_tmp)) == 0)
  1233. 23629                 {
  1234. .Op 211 src/lib/ip/ethern2h.c
  1235. 23630                         fclose(etherf);
  1236. 23631                         return 0;
  1237. 23632                 }
  1238. 23633         }
  1239. 23634         fclose(etherf);
  1240. 23635         return 1;
  1241. 23636 }
  1242. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1243. src/lib/ip/getdomain.c    
  1244. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1245. 23700 /*      getdomainname()                                 Author: Kees J. Bot
  1246. 23701  *                                                              2 Dec 1994
  1247. 23702  */
  1248. 23703 #define nil 0
  1249. 23704 #include <sys/types.h>
  1250. 23705 #include <sys/utsname.h>
  1251. 23706 #include <unistd.h>
  1252. 23707 #include <string.h>
  1253. 23708
  1254. 23709 int getdomainname(char *domain, size_t size)
  1255. 23710 {
  1256. 23711         char nodename[256];
  1257. 23712         char *dot;
  1258. 23713
  1259. 23714         if (gethostname(nodename, sizeof(nodename)) < 0)
  1260. 23715                 return -1;
  1261. 23716         nodename[sizeof(nodename)-1]= 0;
  1262. 23717         if ((dot= strchr(nodename, '.')) == nil) dot= ".";
  1263. 23718
  1264. 23719         strncpy(domain, dot+1, size);
  1265. 23720         if (size > 0) domain[size-1]= 0;
  1266. 23721         return 0;
  1267. 23722 }
  1268. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1269. src/lib/ip/gethnmadr.c    
  1270. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1271. 23800 /*
  1272. 23801  * Copyright (c) 1985, 1988 Regents of the University of California.
  1273. 23802  * All rights reserved.
  1274. 23803  *
  1275. 23804  * Redistribution and use in source and binary forms are permitted
  1276. 23805  * provided that: (1) source distributions retain this entire copyright
  1277. 23806  * notice and comment, and (2) distributions including binaries display
  1278. 23807  * the following acknowledgement:  ``This product includes software
  1279. 23808  * developed by the University of California, Berkeley and its contributors''
  1280. 23809  * in the documentation or other materials provided with the distribution
  1281. 23810  * and in all advertising materials mentioning features or use of this
  1282. 23811  * software. Neither the name of the University nor the names of its
  1283. 23812  * contributors may be used to endorse or promote products derived
  1284. 23813  * from this software without specific prior written permission.
  1285. 23814  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1286. .Ep 212 src/lib/ip/gethnmadr.c
  1287. 23815  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1288. 23816  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1289. 23817  */
  1290. 23818
  1291. 23819 #if defined(LIBC_SCCS) && !defined(lint)
  1292. 23820 static char sccsid[] = "@(#)gethostnamadr.c     6.41 (Berkeley) 6/1/90";
  1293. 23821 #endif /* LIBC_SCCS and not lint */
  1294. 23822
  1295. 23823 #ifdef _MINIX
  1296. 23824 #include <sys/types.h>
  1297. 23825 #include <ctype.h>
  1298. 23826 #include <errno.h>
  1299. 23827 #include <stdio.h>
  1300. 23828 #include <string.h>
  1301. 23829
  1302. 23830 #include <net/hton.h>
  1303. 23831 #include <net/gen/nameser.h>
  1304. 23832 #include <net/gen/netdb.h>
  1305. 23833 #include <net/gen/in.h>
  1306. 23834 #include <net/gen/inet.h>
  1307. 23835 #include <net/gen/resolv.h>
  1308. 23836 #include <net/gen/socket.h>
  1309. 23837 #else
  1310. 23838 #include <sys/param.h>
  1311. 23839 #include <sys/socket.h>
  1312. 23840 #include <netinet/in.h>
  1313. 23841 #include <ctype.h>
  1314. 23842 #include <netdb.h>
  1315. 23843 #include <stdio.h>
  1316. 23844 #include <errno.h>
  1317. 23845 #include <arpa/inet.h>
  1318. 23846 #include <arpa/nameser.h>
  1319. 23847 #include <resolv.h>
  1320. 23848 #endif /* AMOEABA */
  1321. 23849
  1322. 23850 #define MAXALIASES      35
  1323. 23851 #define MAXADDRS        35
  1324. 23852
  1325. 23853 static char *h_addr_ptrs[MAXADDRS + 1];
  1326. 23854
  1327. 23855 #ifdef _MINIX
  1328. 23856 struct in_addr
  1329. 23857 {
  1330. 23858         ipaddr_t s_addr;
  1331. 23859 };
  1332. 23860 typedef u32_t u_long;
  1333. 23861 typedef u16_t u_short;
  1334. 23862 typedef u8_t u_char;
  1335. 23863 union querybuf;
  1336. 23864
  1337. 23865 extern int dn_skipname _ARGS(( const u_char *comp_dn, const u_char *eom ));
  1338. 23866 #define getshort _getshort
  1339. 23867 static struct hostent *getanswer _ARGS(( union querybuf *answer, int anslen, 
  1340. 23868         int iquery ));
  1341. 23869 #define bcmp memcmp
  1342. 23870 #define bcopy(s, d, l) memcpy(d, s, l)
  1343. 23871 #endif /* _MINIX */
  1344. 23872
  1345. 23873 static struct hostent host;
  1346. 23874 static char *host_aliases[MAXALIASES];
  1347. .Op 213 src/lib/ip/gethnmadr.c
  1348. 23875 static char hostbuf[BUFSIZ+1];
  1349. 23876 static struct in_addr host_addr;
  1350. 23877
  1351. 23878 #ifndef _MINIX
  1352. 23879 char *strpbrk();
  1353. 23880 #endif /* !_MINIX */
  1354. 23881
  1355. 23882 #if PACKETSZ > 1024
  1356. 23883 #define MAXPACKET       PACKETSZ
  1357. 23884 #else
  1358. 23885 #define MAXPACKET       1024
  1359. 23886 #endif
  1360. 23887
  1361. 23888 typedef union querybuf
  1362. 23889 {
  1363. 23890         dns_hdr_t hdr;
  1364. 23891         u_char buf[MAXPACKET];
  1365. 23892 } querybuf_t;
  1366. 23893
  1367. 23894 typedef union align {
  1368. 23895     long al;
  1369. 23896     char ac;
  1370. 23897 } align_t;
  1371. 23898
  1372. 23899 static struct hostent *
  1373. 23900 getanswer(answer, anslen, iquery)
  1374. 23901         querybuf_t *answer;
  1375. 23902         int anslen;
  1376. 23903         int iquery;
  1377. 23904 {
  1378. 23905         register dns_hdr_t *hp;
  1379. 23906         register u_char *cp;
  1380. 23907         register int n;
  1381. 23908         u_char *eom;
  1382. 23909         char *bp, **ap;
  1383. 23910         int type, class, buflen, ancount, qdcount;
  1384. 23911         int haveanswer, getclass = C_ANY;
  1385. 23912         char **hap;
  1386. 23913
  1387. 23914         eom = answer->buf + anslen;
  1388. 23915         /*
  1389. 23916          * find first satisfactory answer
  1390. 23917          */
  1391. 23918         hp = &answer->hdr;
  1392. 23919         ancount = ntohs(hp->dh_ancount);
  1393. 23920         qdcount = ntohs(hp->dh_qdcount);
  1394. 23921         bp = hostbuf;
  1395. 23922         buflen = sizeof(hostbuf);
  1396. 23923         cp = answer->buf + sizeof(dns_hdr_t);
  1397. 23924         if (qdcount) {
  1398. 23925                 if (iquery) {
  1399. 23926                         if ((n = dn_expand((u_char *)answer->buf, eom,
  1400. 23927                              cp, (u_char *)bp, buflen)) < 0) {
  1401. 23928                                 h_errno = NO_RECOVERY;
  1402. 23929                                 return ((struct hostent *) NULL);
  1403. 23930                         }
  1404. 23931                         cp += n + QFIXEDSZ;
  1405. 23932                         host.h_name = bp;
  1406. 23933                         n = strlen(bp) + 1;
  1407. 23934                         bp += n;
  1408. .Ep 214 src/lib/ip/gethnmadr.c
  1409. 23935                         buflen -= n;
  1410. 23936                 } else
  1411. 23937                         cp += dn_skipname(cp, eom) + QFIXEDSZ;
  1412. 23938                 while (--qdcount > 0)
  1413. 23939                         cp += dn_skipname(cp, eom) + QFIXEDSZ;
  1414. 23940         } else if (iquery) {
  1415. 23941                 if (hp->dh_flag1 & DHF_AA)
  1416. 23942                         h_errno = HOST_NOT_FOUND;
  1417. 23943                 else
  1418. 23944                         h_errno = TRY_AGAIN;
  1419. 23945                 return ((struct hostent *) NULL);
  1420. 23946         }
  1421. 23947         ap = host_aliases;
  1422. 23948         *ap = NULL;
  1423. 23949         host.h_aliases = host_aliases;
  1424. 23950         hap = h_addr_ptrs;
  1425. 23951         *hap = NULL;
  1426. 23952 #if BSD >= 43 || defined(h_addr)        /* new-style hostent structure */
  1427. 23953         host.h_addr_list = h_addr_ptrs;
  1428. 23954 #endif
  1429. 23955         haveanswer = 0;
  1430. 23956         while (--ancount >= 0 && cp < eom) {
  1431. 23957                 if ((n = dn_expand((u_char *)answer->buf, eom, cp, (u_char *)bp,
  1432. 23958                         buflen)) < 0)
  1433. 23959                         break;
  1434. 23960                 cp += n;
  1435. 23961                 type = getshort(cp);
  1436. 23962                 cp += sizeof(u_short);
  1437. 23963                 class = getshort(cp);
  1438. 23964                 cp += sizeof(u_short) + sizeof(u_long);
  1439. 23965                 n = getshort(cp);
  1440. 23966                 cp += sizeof(u_short);
  1441. 23967                 if (type == T_CNAME) {
  1442. 23968                         cp += n;
  1443. 23969                         if (ap >= &host_aliases[MAXALIASES-1])
  1444. 23970                                 continue;
  1445. 23971                         *ap++ = bp;
  1446. 23972                         n = strlen(bp) + 1;
  1447. 23973                         bp += n;
  1448. 23974                         buflen -= n;
  1449. 23975                         continue;
  1450. 23976                 }
  1451. 23977                 if (iquery && type == T_PTR) {
  1452. 23978                         if ((n = dn_expand((u8_t *)answer->buf, eom,
  1453. 23979                             cp, (u8_t *)bp, buflen)) < 0) {
  1454. 23980                                 cp += n;
  1455. 23981                                 continue;
  1456. 23982                         }
  1457. 23983                         cp += n;
  1458. 23984                         host.h_name = bp;
  1459. 23985                         return(&host);
  1460. 23986                 }
  1461. 23987                 if (iquery || type != T_A)  {
  1462. 23988 #ifdef DEBUG
  1463. 23989                         if (_res.options & RES_DEBUG)
  1464. 23990                                 printf("unexpected answer type %d, size %dn",
  1465. 23991                                         type, n);
  1466. 23992 #endif
  1467. 23993                         cp += n;
  1468. 23994                         continue;
  1469. .Op 215 src/lib/ip/gethnmadr.c
  1470. 23995                 }
  1471. 23996                 if (haveanswer) {
  1472. 23997                         if (n != host.h_length) {
  1473. 23998                                 cp += n;
  1474. 23999                                 continue;
  1475. 24000                         }
  1476. 24001                         if (class != getclass) {
  1477. 24002                                 cp += n;
  1478. 24003                                 continue;
  1479. 24004                         }
  1480. 24005                 } else {
  1481. 24006                         host.h_length = n;
  1482. 24007                         getclass = class;
  1483. 24008                         host.h_addrtype = (class == C_IN) ? AF_INET : AF_UNSPEC;
  1484. 24009                         if (!iquery) {
  1485. 24010                                 host.h_name = bp;
  1486. 24011                                 bp += strlen(bp) + 1;
  1487. 24012                         }
  1488. 24013                 }
  1489. 24014
  1490. 24015                 bp += (size_t)(sizeof(align_t) - 
  1491. 24016                                                 ((u_long)bp % sizeof(align_t)));
  1492. 24017
  1493. 24018                 if (bp + n >= &hostbuf[sizeof(hostbuf)]) {
  1494. 24019 #ifdef DEBUG
  1495. 24020                         if (_res.options & RES_DEBUG)
  1496. 24021                                 printf("size (%d) too bign", n);
  1497. 24022 #endif
  1498. 24023                         break;
  1499. 24024                 }
  1500. 24025                 bcopy(cp, *hap++ = bp, n);
  1501. 24026                 bp +=n;
  1502. 24027                 cp += n;
  1503. 24028                 haveanswer++;
  1504. 24029         }
  1505. 24030         if (haveanswer) {
  1506. 24031                 *ap = NULL;
  1507. 24032 #if BSD >= 43 || defined(h_addr)        /* new-style hostent structure */
  1508. 24033                 *hap = NULL;
  1509. 24034 #else
  1510. 24035                 host.h_addr = h_addr_ptrs[0];
  1511. 24036 #endif
  1512. 24037                 return (&host);
  1513. 24038         } else {
  1514. 24039                 h_errno = TRY_AGAIN;
  1515. 24040                 return ((struct hostent *) NULL);
  1516. 24041         }
  1517. 24042 }
  1518. 24044 struct hostent *
  1519. 24045 gethostbyname(name)
  1520. 24046         char *name;
  1521. 24047 {
  1522. 24048         querybuf_t buf;
  1523. 24049         register char *cp;
  1524. 24050         int n;
  1525. 24051
  1526. 24052         /*
  1527. 24053          * disallow names consisting only of digits/dots, unless
  1528. 24054          * they end in a dot.
  1529. .Ep 216 src/lib/ip/gethnmadr.c
  1530. 24055          */
  1531. 24056         if (isdigit(name[0]))
  1532. 24057                 for (cp = name;; ++cp) {
  1533. 24058                         if (!*cp) {
  1534. 24059                                 if (*--cp == '.')
  1535. 24060                                         break;
  1536. 24061                                 /*
  1537. 24062                                  * All-numeric, no dot at the end.
  1538. 24063                                  * Fake up a hostent as if we'd actually
  1539. 24064                                  * done a lookup.  What if someone types
  1540. 24065                                  * 255.255.255.255?  The test below will
  1541. 24066                                  * succeed spuriously... ???
  1542. 24067                                  */
  1543. 24068                                 if ((host_addr.s_addr = inet_addr(name)) == -1) {
  1544. 24069                                         h_errno = HOST_NOT_FOUND;
  1545. 24070                                         return((struct hostent *) NULL);
  1546. 24071                                 }
  1547. 24072                                 host.h_name = name;
  1548. 24073                                 host.h_aliases = host_aliases;
  1549. 24074                                 host_aliases[0] = NULL;
  1550. 24075                                 host.h_addrtype = AF_INET;
  1551. 24076                                 host.h_length = sizeof(u_long);
  1552. 24077                                 h_addr_ptrs[0] = (char *)&host_addr;
  1553. 24078                                 h_addr_ptrs[1] = (char *)0;
  1554. 24079 #if BSD >= 43 || defined(h_addr)        /* new-style hostent structure */
  1555. 24080                                 host.h_addr_list = h_addr_ptrs;
  1556. 24081 #else
  1557. 24082                                 host.h_addr = h_addr_ptrs[0];
  1558. 24083 #endif
  1559. 24084                                 return (&host);
  1560. 24085                         }
  1561. 24086                         if (!isdigit(*cp) && *cp != '.') 
  1562. 24087                                 break;
  1563. 24088                 }
  1564. 24089
  1565. 24090         if ((n = res_search(name, C_IN, T_A, buf.buf, sizeof(buf))) < 0) {
  1566. 24091 #ifdef DEBUG
  1567. 24092                 if (_res.options & RES_DEBUG)
  1568. 24093                         printf("res_search failedn");
  1569. 24094 #endif
  1570. 24095                 return ((struct hostent *) NULL);
  1571. 24096         }
  1572. 24097         return (getanswer(&buf, n, 0));
  1573. 24098 }
  1574. 24100 struct hostent *
  1575. 24101 gethostbyaddr(addr, len, type)
  1576. 24102         const char *addr;
  1577. 24103         int len, type;
  1578. 24104 {
  1579. 24105         int n;
  1580. 24106         querybuf_t buf;
  1581. 24107         register struct hostent *hp;
  1582. 24108         char qbuf[MAXDNAME];
  1583. 24109         
  1584. 24110         if (type != AF_INET)
  1585. 24111                 return ((struct hostent *) NULL);
  1586. 24112         (void)sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa",
  1587. 24113                 ((unsigned)addr[3] & 0xff),
  1588. 24114                 ((unsigned)addr[2] & 0xff),
  1589. .Op 217 src/lib/ip/gethnmadr.c
  1590. 24115                 ((unsigned)addr[1] & 0xff),
  1591. 24116                 ((unsigned)addr[0] & 0xff));
  1592. 24117         n = res_query(qbuf, C_IN, T_PTR, (u8_t *)&buf, sizeof(buf));
  1593. 24118         if (n < 0) {
  1594. 24119 #ifdef DEBUG
  1595. 24120                 if (_res.options & RES_DEBUG)
  1596. 24121                         printf("res_query failedn");
  1597. 24122 #endif
  1598. 24123                 return ((struct hostent *) NULL);
  1599. 24124         }
  1600. 24125         hp = getanswer(&buf, n, 1);
  1601. 24126         if (hp == NULL)
  1602. 24127                 return ((struct hostent *) NULL);
  1603. 24128         hp->h_addrtype = type;
  1604. 24129         hp->h_length = len;
  1605. 24130         h_addr_ptrs[0] = (char *)&host_addr;
  1606. 24131         h_addr_ptrs[1] = (char *)0;
  1607. 24132         host_addr = *(struct in_addr *)addr;
  1608. 24133 #if BSD < 43 && !defined(h_addr)        /* new-style hostent structure */
  1609. 24134         hp->h_addr = h_addr_ptrs[0];
  1610. 24135 #endif
  1611. 24136         return(hp);
  1612. 24137 }
  1613. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1614. src/lib/ip/gethostent.c    
  1615. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1616. 24200 /*
  1617. 24201  * Copyright (c) 1985, 1988 Regents of the University of California.
  1618. 24202  * All rights reserved.
  1619. 24203  *
  1620. 24204  * Redistribution and use in source and binary forms are permitted
  1621. 24205  * provided that: (1) source distributions retain this entire copyright
  1622. 24206  * notice and comment, and (2) distributions including binaries display
  1623. 24207  * the following acknowledgement:  ``This product includes software
  1624. 24208  * developed by the University of California, Berkeley and its contributors''
  1625. 24209  * in the documentation or other materials provided with the distribution
  1626. 24210  * and in all advertising materials mentioning features or use of this
  1627. 24211  * software. Neither the name of the University nor the names of its
  1628. 24212  * contributors may be used to endorse or promote products derived
  1629. 24213  * from this software without specific prior written permission.
  1630. 24214  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1631. 24215  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1632. 24216  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1633. 24217  */
  1634. 24218
  1635. 24219 #if defined(LIBC_SCCS) && !defined(lint)
  1636. 24220 static char sccsid[] = "@(#)gethostnamadr.c     6.41 (Berkeley) 6/1/90";
  1637. 24221 #endif /* LIBC_SCCS and not lint */
  1638. 24222
  1639. 24223 /* Prefix the functions defined here with underscores to distinguish them
  1640. 24224  * from the newer replacements in the resolver library.
  1641. 24225  */
  1642. 24226 #define sethostent      _sethostent
  1643. 24227 #define endhostent      _endhostent
  1644. 24228 #define gethostent      _gethostent
  1645. 24229 #define gethostbyname   _gethostbyname
  1646. .Ep 218 src/lib/ip/gethostent.c
  1647. 24230 #define gethostbyaddr   _gethostbyaddr
  1648. 24231
  1649. 24232 #ifdef _MINIX
  1650. 24233 #include <sys/types.h>
  1651. 24234 #include <ctype.h>
  1652. 24235 #include <errno.h>
  1653. 24236 #include <stdio.h>
  1654. 24237 #include <string.h>
  1655. 24238
  1656. 24239 #include <net/hton.h>
  1657. 24240 #include <net/gen/nameser.h>
  1658. 24241 #include <net/gen/netdb.h>
  1659. 24242 #include <net/gen/in.h>
  1660. 24243 #include <net/gen/inet.h>
  1661. 24244 #include <net/gen/resolv.h>
  1662. 24245 #include <net/gen/socket.h>
  1663. 24246 #else
  1664. 24247 #include <sys/param.h>
  1665. 24248 #include <sys/socket.h>
  1666. 24249 #include <netinet/in.h>
  1667. 24250 #include <ctype.h>
  1668. 24251 #include <netdb.h>
  1669. 24252 #include <stdio.h>
  1670. 24253 #include <errno.h>
  1671. 24254 #include <arpa/inet.h>
  1672. 24255 #include <arpa/nameser.h>
  1673. 24256 #include <resolv.h>
  1674. 24257 #endif /* !_MINIX */
  1675. 24258
  1676. 24259 #define MAXALIASES      35
  1677. 24260 #define MAXADDRS        35
  1678. 24261
  1679. 24262 #ifdef _MINIX
  1680. 24263 typedef u32_t u_long;
  1681. 24264 typedef u16_t u_short;
  1682. 24265 typedef u8_t u_char;
  1683. 24266
  1684. 24267 #define bcmp    memcmp
  1685. 24268 #endif /* _MINIX */
  1686. 24269
  1687. 24270 static struct hostent host;
  1688. 24271 static char *host_aliases[MAXALIASES];
  1689. 24272 static char hostbuf[BUFSIZ+1];
  1690. 24273 static FILE *hostf = NULL;
  1691. 24274 static u_long hostaddr[(MAXADDRS+sizeof(u_long)-1)/sizeof(u_long)];
  1692. 24275 static char *host_addrs[2];
  1693. 24276 static int stayopen = 0;
  1694. 24277
  1695. 24278 #ifndef _MINIX
  1696. 24279 char *strpbrk();
  1697. 24280 #endif /* !_MINIX */
  1698. 24281
  1699. 24282 void
  1700. 24283 sethostent(f)
  1701. 24284         int f;
  1702. 24285 {
  1703. 24286         if (hostf == NULL)
  1704. 24287                 hostf = fopen(_PATH_HOSTS, "r" );
  1705. 24288         else
  1706. 24289                 rewind(hostf);
  1707. .Op 219 src/lib/ip/gethostent.c
  1708. 24290         stayopen |= f;
  1709. 24291 }
  1710. 24293 void
  1711. 24294 endhostent()
  1712. 24295 {
  1713. 24296         if (hostf && !stayopen) {
  1714. 24297                 (void) fclose(hostf);
  1715. 24298                 hostf = NULL;
  1716. 24299         }
  1717. 24300 }
  1718. 24302 struct hostent *
  1719. 24303 gethostent()
  1720. 24304 {
  1721. 24305         char *p;
  1722. 24306         register char *cp, **q;
  1723. 24307
  1724. 24308         if (hostf == NULL && (hostf = fopen(_PATH_HOSTS, "r" )) == NULL)
  1725. 24309                 return (NULL);
  1726. 24310 again:
  1727. 24311         if ((p = fgets(hostbuf, BUFSIZ, hostf)) == NULL)
  1728. 24312                 return (NULL);
  1729. 24313         if (*p == '#')
  1730. 24314                 goto again;
  1731. 24315         cp = strpbrk(p, "#n");
  1732. 24316         if (cp == NULL)
  1733. 24317                 goto again;
  1734. 24318         *cp = '';
  1735. 24319         cp = strpbrk(p, " t");
  1736. 24320         if (cp == NULL)
  1737. 24321                 goto again;
  1738. 24322         *cp++ = '';
  1739. 24323         /* THIS STUFF IS INTERNET SPECIFIC */
  1740. 24324 #if BSD >= 43 || defined(h_addr)        /* new-style hostent structure */
  1741. 24325         host.h_addr_list = host_addrs;
  1742. 24326 #endif
  1743. 24327         host.h_addr = (char *) hostaddr;
  1744. 24328         *((u_long *)host.h_addr) = inet_addr(p);
  1745. 24329         host.h_length = sizeof (u_long);
  1746. 24330         host.h_addrtype = AF_INET;
  1747. 24331         while (*cp == ' ' || *cp == 't')
  1748. 24332                 cp++;
  1749. 24333         host.h_name = cp;
  1750. 24334         q = host.h_aliases = host_aliases;
  1751. 24335         cp = strpbrk(cp, " t");
  1752. 24336         if (cp != NULL) 
  1753. 24337                 *cp++ = '';
  1754. 24338         while (cp && *cp) {
  1755. 24339                 if (*cp == ' ' || *cp == 't') {
  1756. 24340                         cp++;
  1757. 24341                         continue;
  1758. 24342                 }
  1759. 24343                 if (q < &host_aliases[MAXALIASES - 1])
  1760. 24344                         *q++ = cp;
  1761. 24345                 cp = strpbrk(cp, " t");
  1762. 24346                 if (cp != NULL)
  1763. 24347                         *cp++ = '';
  1764. 24348         }
  1765. 24349         *q = NULL;
  1766. .Ep 220 src/lib/ip/gethostent.c
  1767. 24350         return (&host);
  1768. 24351 }
  1769. 24353 struct hostent *
  1770. 24354 gethostbyname(name)
  1771. 24355         char *name;
  1772. 24356 {
  1773. 24357         register struct hostent *p;
  1774. 24358         register char **cp;
  1775. 24359         
  1776. 24360         sethostent(0);
  1777. 24361         while (p = gethostent()) {
  1778. 24362                 if (strcasecmp(p->h_name, name) == 0)
  1779. 24363                         break;
  1780. 24364                 for (cp = p->h_aliases; *cp != 0; cp++)
  1781. 24365                         if (strcasecmp(*cp, name) == 0)
  1782. 24366                                 goto found;
  1783. 24367         }
  1784. 24368 found:
  1785. 24369         endhostent();
  1786. 24370         return (p);
  1787. 24371 }
  1788. 24373 struct hostent *
  1789. 24374 gethostbyaddr(addr, len, type)
  1790. 24375         const char *addr;
  1791. 24376         int len, type;
  1792. 24377 {
  1793. 24378         register struct hostent *p;
  1794. 24379
  1795. 24380         sethostent(0);
  1796. 24381         while (p = gethostent())
  1797. 24382                 if (p->h_addrtype == type && !bcmp(p->h_addr, addr, len))
  1798. 24383                         break;
  1799. 24384         endhostent();
  1800. 24385         return (p);
  1801. 24386 }
  1802. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1803. src/lib/ip/gethostname.c    
  1804. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1805. 24400 /* gethostname(2) system call emulation */
  1806. 24401
  1807. 24402 #include <sys/types.h>
  1808. 24403 #include <fcntl.h>
  1809. 24404 #include <stdlib.h>
  1810. 24405 #include <string.h>
  1811. 24406 #include <unistd.h>
  1812. 24407 #include <net/gen/netdb.h>
  1813. 24408
  1814. 24409 #define HOSTNAME_FILE "/etc/hostname.file"
  1815. 24410
  1816. 24411 int gethostname(char *buf, size_t len)
  1817. 24412 {
  1818. 24413         int fd;
  1819. 24414         int r;
  1820. .Op 221 src/lib/ip/gethostname.c
  1821. 24415         char *nl;
  1822. 24416
  1823. 24417         if ((fd= open(HOSTNAME_FILE, O_RDONLY)) < 0) return -1;
  1824. 24418
  1825. 24419         r= read(fd, buf, len);
  1826. 24420         close(fd);
  1827. 24421         if (r == -1) return -1;
  1828. 24422
  1829. 24423         buf[len-1]= '';
  1830. 24424         if ((nl= strchr(buf, 'n')) != NULL) *nl= '';
  1831. 24425         return 0;
  1832. 24426 }
  1833. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1834. src/lib/ip/getproto.c    
  1835. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1836. 24500 /*
  1837. 24501  * Copyright (c) 1983 Regents of the University of California.
  1838. 24502  * All rights reserved.
  1839. 24503  *
  1840. 24504  * Redistribution and use in source and binary forms are permitted
  1841. 24505  * provided that: (1) source distributions retain this entire copyright
  1842. 24506  * notice and comment, and (2) distributions including binaries display
  1843. 24507  * the following acknowledgement:  ``This product includes software
  1844. 24508  * developed by the University of California, Berkeley and its contributors''
  1845. 24509  * in the documentation or other materials provided with the distribution
  1846. 24510  * and in all advertising materials mentioning features or use of this
  1847. 24511  * software. Neither the name of the University nor the names of its
  1848. 24512  * contributors may be used to endorse or promote products derived
  1849. 24513  * from this software without specific prior written permission.
  1850. 24514  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1851. 24515  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1852. 24516  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1853. 24517  */
  1854. 24518
  1855. 24519 #if defined(LIBC_SCCS) && !defined(lint)
  1856. 24520 static char sccsid[] = "@(#)getproto.c  5.6 (Berkeley) 6/1/90";
  1857. 24521 #endif /* LIBC_SCCS and not lint */
  1858. 24522
  1859. 24523 #include <stddef.h>
  1860. 24524
  1861. 24525 #ifdef _MINIX
  1862. 24526 #include <ansi.h>
  1863. 24527 #include <net/gen/netdb.h>
  1864. 24528 #endif
  1865. 24529
  1866. 24530 extern int _proto_stayopen;
  1867. 24531
  1868. 24532 struct protoent *
  1869. 24533 getprotobynumber(proto)
  1870. 24534         register int proto;
  1871. 24535 {
  1872. 24536         register struct protoent *p;
  1873. 24537
  1874. 24538         setprotoent(_proto_stayopen);
  1875. 24539         while (p = getprotoent())
  1876. .Ep 222 src/lib/ip/getproto.c
  1877. 24540                 if (p->p_proto == proto)
  1878. 24541                         break;
  1879. 24542         if (!_proto_stayopen)
  1880. 24543                 endprotoent();
  1881. 24544         return (p);
  1882. 24545 }
  1883. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1884. src/lib/ip/getprotoent.c    
  1885. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1886. 24600 /*
  1887. 24601  * Copyright (c) 1983 Regents of the University of California.
  1888. 24602  * All rights reserved.
  1889. 24603  *
  1890. 24604  * Redistribution and use in source and binary forms are permitted
  1891. 24605  * provided that: (1) source distributions retain this entire copyright
  1892. 24606  * notice and comment, and (2) distributions including binaries display
  1893. 24607  * the following acknowledgement:  ``This product includes software
  1894. 24608  * developed by the University of California, Berkeley and its contributors''
  1895. 24609  * in the documentation or other materials provided with the distribution
  1896. 24610  * and in all advertising materials mentioning features or use of this
  1897. 24611  * software. Neither the name of the University nor the names of its
  1898. 24612  * contributors may be used to endorse or promote products derived
  1899. 24613  * from this software without specific prior written permission.
  1900. 24614  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1901. 24615  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1902. 24616  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1903. 24617  */
  1904. 24618
  1905. 24619 #if defined(LIBC_SCCS) && !defined(lint)
  1906. 24620 static char sccsid[] = "@(#)getprotoent.c       5.7 (Berkeley) 6/1/90";
  1907. 24621 #endif /* LIBC_SCCS and not lint */
  1908. 24622
  1909. 24623 #include <ctype.h>
  1910. 24624 #include <stdio.h>
  1911. 24625 #include <stdlib.h>
  1912. 24626
  1913. 24627 #ifdef _MINIX
  1914. 24628 #include <net/gen/netdb.h>
  1915. 24629
  1916. 24630 static char *any _ARGS(( char *cp, char *match ));
  1917. 24631 #endif
  1918. 24632
  1919. 24633 #define MAXALIASES      35
  1920. 24634
  1921. 24635 static FILE *protof = NULL;
  1922. 24636 static char line[BUFSIZ+1];
  1923. 24637 static struct protoent proto;
  1924. 24638 static char *proto_aliases[MAXALIASES];
  1925. 24639 int _proto_stayopen;
  1926. 24640
  1927. 24641 void
  1928. 24642 setprotoent(f)
  1929. 24643         int f;
  1930. 24644 {
  1931. .Op 223 src/lib/ip/getprotoent.c
  1932. 24645         if (protof == NULL)
  1933. 24646                 protof = fopen(_PATH_PROTOCOLS, "r" );
  1934. 24647         else
  1935. 24648                 rewind(protof);
  1936. 24649         _proto_stayopen |= f;
  1937. 24650 }
  1938. 24652 void
  1939. 24653 endprotoent()
  1940. 24654 {
  1941. 24655         if (protof) {
  1942. 24656                 fclose(protof);
  1943. 24657                 protof = NULL;
  1944. 24658         }
  1945. 24659         _proto_stayopen = 0;
  1946. 24660 }
  1947. 24662 struct protoent *
  1948. 24663 getprotoent()
  1949. 24664 {
  1950. 24665         char *p;
  1951. 24666         register char *cp, **q;
  1952. 24667
  1953. 24668         if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL)
  1954. 24669                 return (NULL);
  1955. 24670 again:
  1956. 24671         if ((p = fgets(line, BUFSIZ, protof)) == NULL)
  1957. 24672                 return (NULL);
  1958. 24673         if (*p == '#')
  1959. 24674                 goto again;
  1960. 24675         cp = any(p, "#n");
  1961. 24676         if (cp == NULL)
  1962. 24677                 goto again;
  1963. 24678         *cp = '';
  1964. 24679         proto.p_name = p;
  1965. 24680         cp = any(p, " t");
  1966. 24681         if (cp == NULL)
  1967. 24682                 goto again;
  1968. 24683         *cp++ = '';
  1969. 24684         while (*cp == ' ' || *cp == 't')
  1970. 24685                 cp++;
  1971. 24686         p = any(cp, " t");
  1972. 24687         if (p != NULL)
  1973. 24688                 *p++ = '';
  1974. 24689         proto.p_proto = atoi(cp);
  1975. 24690         q = proto.p_aliases = proto_aliases;
  1976. 24691         if (p != NULL) {
  1977. 24692                 cp = p;
  1978. 24693                 while (cp && *cp) {
  1979. 24694                         if (*cp == ' ' || *cp == 't') {
  1980. 24695                                 cp++;
  1981. 24696                                 continue;
  1982. 24697                         }
  1983. 24698                         if (q < &proto_aliases[MAXALIASES - 1])
  1984. 24699                                 *q++ = cp;
  1985. 24700                         cp = any(cp, " t");
  1986. 24701                         if (cp != NULL)
  1987. 24702                                 *cp++ = '';
  1988. 24703                 }
  1989. 24704         }
  1990. .Ep 224 src/lib/ip/getprotoent.c
  1991. 24705         *q = NULL;
  1992. 24706         return (&proto);
  1993. 24707 }
  1994. 24709 static char *
  1995. 24710 any(cp, match)
  1996. 24711         register char *cp;
  1997. 24712         char *match;
  1998. 24713 {
  1999. 24714         register char *mp, c;
  2000. 24715
  2001. 24716         while (c = *cp) {
  2002. 24717                 for (mp = match; *mp; mp++)
  2003. 24718                         if (*mp == c)
  2004. 24719                                 return (cp);
  2005. 24720                 cp++;
  2006. 24721         }
  2007. 24722         return ((char *)0);
  2008. 24723 }
  2009. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2010. src/lib/ip/getservent.c    
  2011. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2012. 24800 /*
  2013. 24801  * Copyright (c) 1983 Regents of the University of California.
  2014. 24802  * All rights reserved.
  2015. 24803  *
  2016. 24804  * Redistribution and use in source and binary forms are permitted
  2017. 24805  * provided that: (1) source distributions retain this entire copyright
  2018. 24806  * notice and comment, and (2) distributions including binaries display
  2019. 24807  * the following acknowledgement:  ``This product includes software
  2020. 24808  * developed by the University of California, Berkeley and its contributors''
  2021. 24809  * in the documentation or other materials provided with the distribution
  2022. 24810  * and in all advertising materials mentioning features or use of this
  2023. 24811  * software. Neither the name of the University nor the names of its
  2024. 24812  * contributors may be used to endorse or promote products derived
  2025. 24813  * from this software without specific prior written permission.
  2026. 24814  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2027. 24815  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2028. 24816  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2029. 24817  */
  2030. 24818
  2031. 24819 #if defined(LIBC_SCCS) && !defined(lint)
  2032. 24820 static char sccsid[] = "@(#)getservent.c        5.8 (Berkeley) 6/1/90";
  2033. 24821 #endif /* LIBC_SCCS and not lint */
  2034. 24822
  2035. 24823 #include <sys/types.h>
  2036. 24824 #include <ctype.h>
  2037. 24825 #include <stdio.h>
  2038. 24826 #include <stdlib.h>
  2039. 24827
  2040. 24828 #include <net/hton.h>
  2041. 24829 #include <net/gen/netdb.h>
  2042. 24830
  2043. 24831 #define MAXALIASES      35
  2044. 24832
  2045. 24833 static FILE *servf = NULL;
  2046. 24834 static char line[BUFSIZ+1];
  2047. .Op 225 src/lib/ip/getservent.c
  2048. 24835 static struct servent serv;
  2049. 24836 static char *serv_aliases[MAXALIASES];
  2050. 24837 int _serv_stayopen;
  2051. 24838
  2052. 24839 static char *any _ARGS(( char *cp, char *match ));
  2053. 24840
  2054. 24841 void
  2055. 24842 setservent(f)
  2056. 24843         int f;
  2057. 24844 {
  2058. 24845         if (servf == NULL)
  2059. 24846                 servf = fopen(_PATH_SERVICES, "r" );
  2060. 24847         else
  2061. 24848                 rewind(servf);
  2062. 24849         _serv_stayopen |= f;
  2063. 24850 }
  2064. 24852 void
  2065. 24853 endservent()
  2066. 24854 {
  2067. 24855         if (servf) {
  2068. 24856                 fclose(servf);
  2069. 24857                 servf = NULL;
  2070. 24858         }
  2071. 24859         _serv_stayopen = 0;
  2072. 24860 }
  2073. 24862 struct servent *
  2074. 24863 getservent()
  2075. 24864 {
  2076. 24865         char *p;
  2077. 24866         register char *cp, **q;
  2078. 24867
  2079. 24868         if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL)
  2080. 24869                 return (NULL);
  2081. 24870 again:
  2082. 24871         if ((p = fgets(line, BUFSIZ, servf)) == NULL)
  2083. 24872                 return (NULL);
  2084. 24873         if (*p == '#')
  2085. 24874                 goto again;
  2086. 24875         cp = any(p, "#n");
  2087. 24876         if (cp == NULL)
  2088. 24877                 goto again;
  2089. 24878         *cp = '';
  2090. 24879         serv.s_name = p;
  2091. 24880         p = any(p, " t");
  2092. 24881         if (p == NULL)
  2093. 24882                 goto again;
  2094. 24883         *p++ = '';
  2095. 24884         while (*p == ' ' || *p == 't')
  2096. 24885                 p++;
  2097. 24886         cp = any(p, ",/");
  2098. 24887         if (cp == NULL)
  2099. 24888                 goto again;
  2100. 24889         *cp++ = '';
  2101. 24890         serv.s_port = htons((u16_t)atoi(p));
  2102. 24891         serv.s_proto = cp;
  2103. 24892         q = serv.s_aliases = serv_aliases;
  2104. 24893         cp = any(cp, " t");
  2105. 24894         if (cp != NULL)
  2106. .Ep 226 src/lib/ip/getservent.c
  2107. 24895                 *cp++ = '';
  2108. 24896         while (cp && *cp) {
  2109. 24897                 if (*cp == ' ' || *cp == 't') {
  2110. 24898                         cp++;
  2111. 24899                         continue;
  2112. 24900                 }
  2113. 24901                 if (q < &serv_aliases[MAXALIASES - 1])
  2114. 24902                         *q++ = cp;
  2115. 24903                 cp = any(cp, " t");
  2116. 24904                 if (cp != NULL)
  2117. 24905                         *cp++ = '';
  2118. 24906         }
  2119. 24907         *q = NULL;
  2120. 24908         return (&serv);
  2121. 24909 }
  2122. 24911 static char *
  2123. 24912 any(cp, match)
  2124. 24913         register char *cp;
  2125. 24914         char *match;
  2126. 24915 {
  2127. 24916         register char *mp, c;
  2128. 24917
  2129. 24918         while (c = *cp) {
  2130. 24919                 for (mp = match; *mp; mp++)
  2131. 24920                         if (*mp == c)
  2132. 24921                                 return (cp);
  2133. 24922                 cp++;
  2134. 24923         }
  2135. 24924         return ((char *)0);
  2136. 24925 }
  2137. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2138. src/lib/ip/getsrvbyname.c    
  2139. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2140. 25000 /*
  2141. 25001  * Copyright (c) 1983 Regents of the University of California.
  2142. 25002  * All rights reserved.
  2143. 25003  *
  2144. 25004  * Redistribution and use in source and binary forms are permitted
  2145. 25005  * provided that: (1) source distributions retain this entire copyright
  2146. 25006  * notice and comment, and (2) distributions including binaries display
  2147. 25007  * the following acknowledgement:  ``This product includes software
  2148. 25008  * developed by the University of California, Berkeley and its contributors''
  2149. 25009  * in the documentation or other materials provided with the distribution
  2150. 25010  * and in all advertising materials mentioning features or use of this
  2151. 25011  * software. Neither the name of the University nor the names of its
  2152. 25012  * contributors may be used to endorse or promote products derived
  2153. 25013  * from this software without specific prior written permission.
  2154. 25014  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2155. 25015  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2156. 25016  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2157. 25017  */
  2158. 25018
  2159. 25019 #if defined(LIBC_SCCS) && !defined(lint)
  2160. .Op 227 src/lib/ip/getsrvbyname.c
  2161. 25020 static char sccsid[] = "@(#)getservbyname.c     5.6 (Berkeley) 6/1/90";
  2162. 25021 #endif /* LIBC_SCCS and not lint */
  2163. 25022
  2164. 25023 #include <string.h>
  2165. 25024
  2166. 25025 #include <net/gen/netdb.h>
  2167. 25026
  2168. 25027 extern int _serv_stayopen;
  2169. 25028
  2170. 25029 struct servent *
  2171. 25030 getservbyname(name, proto)
  2172. 25031         const char *name, *proto;
  2173. 25032 {
  2174. 25033         register struct servent *p;
  2175. 25034         register char **cp;
  2176. 25035
  2177. 25036         setservent(_serv_stayopen);
  2178. 25037         while (p = getservent()) {
  2179. 25038                 if (strcmp(name, p->s_name) == 0)
  2180. 25039                         goto gotname;
  2181. 25040                 for (cp = p->s_aliases; *cp; cp++)
  2182. 25041                         if (strcmp(name, *cp) == 0)
  2183. 25042                                 goto gotname;
  2184. 25043                 continue;
  2185. 25044 gotname:
  2186. 25045                 if (proto == 0 || strcmp(p->s_proto, proto) == 0)
  2187. 25046                         break;
  2188. 25047         }
  2189. 25048         if (!_serv_stayopen)
  2190. 25049                 endservent();
  2191. 25050         return (p);
  2192. 25051 }
  2193. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2194. src/lib/ip/getsrvbyport.c    
  2195. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2196. 25100 /*
  2197. 25101  * Copyright (c) 1983 Regents of the University of California.
  2198. 25102  * All rights reserved.
  2199. 25103  *
  2200. 25104  * Redistribution and use in source and binary forms are permitted
  2201. 25105  * provided that: (1) source distributions retain this entire copyright
  2202. 25106  * notice and comment, and (2) distributions including binaries display
  2203. 25107  * the following acknowledgement:  ``This product includes software
  2204. 25108  * developed by the University of California, Berkeley and its contributors''
  2205. 25109  * in the documentation or other materials provided with the distribution
  2206. 25110  * and in all advertising materials mentioning features or use of this
  2207. 25111  * software. Neither the name of the University nor the names of its
  2208. 25112  * contributors may be used to endorse or promote products derived
  2209. 25113  * from this software without specific prior written permission.
  2210. 25114  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2211. 25115  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2212. 25116  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2213. 25117  */
  2214. 25118
  2215. 25119 #if defined(LIBC_SCCS) && !defined(lint)
  2216. .Ep 228 src/lib/ip/getsrvbyport.c
  2217. 25120 static char sccsid[] = "@(#)getservbyport.c     5.6 (Berkeley) 6/1/90";
  2218. 25121 #endif /* LIBC_SCCS and not lint */
  2219. 25122
  2220. 25123 #include <stddef.h>
  2221. 25124 #include <string.h>
  2222. 25125
  2223. 25126 #ifdef _MINIX
  2224. 25127 #include <net/gen/netdb.h>
  2225. 25128 #endif
  2226. 25129
  2227. 25130 extern int _serv_stayopen;
  2228. 25131
  2229. 25132 struct servent *
  2230. 25133 getservbyport(port, proto)
  2231. 25134         int port;
  2232. 25135         const char *proto;
  2233. 25136 {
  2234. 25137         register struct servent *p;
  2235. 25138
  2236. 25139         setservent(_serv_stayopen);
  2237. 25140         while (p = getservent()) {
  2238. 25141                 if (p->s_port != port)
  2239. 25142                         continue;
  2240. 25143                 if (proto == 0 || strcmp(p->s_proto, proto) == 0)
  2241. 25144                         break;
  2242. 25145         }
  2243. 25146         if (!_serv_stayopen)
  2244. 25147                 endservent();
  2245. 25148         return (p);
  2246. 25149 }
  2247. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2248. src/lib/ip/hton.c    
  2249. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2250. 25200 /*
  2251. 25201 hton.c
  2252. 25202 */
  2253. 25203
  2254. 25204 #include <sys/types.h>
  2255. 25205 #include <minix/config.h>
  2256. 25206 #include <net/hton.h>
  2257. 25207
  2258. 25208 u16_t _tmp;
  2259. 25209 u32_t _tmp_l;
  2260. .Op 229 src/lib/ip/inet_addr.c
  2261. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2262. src/lib/ip/inet_addr.c    
  2263. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2264. 25300 /*
  2265. 25301  * Copyright (c) 1983, 1990 Regents of the University of California.
  2266. 25302  * All rights reserved.
  2267. 25303  *
  2268. 25304  * Redistribution and use in source and binary forms are permitted provided
  2269. 25305  * that: (1) source distributions retain this entire copyright notice and
  2270. 25306  * comment, and (2) distributions including binaries display the following
  2271. 25307  * acknowledgement:  ``This product includes software developed by the
  2272. 25308  * University of California, Berkeley and its contributors'' in the
  2273. 25309  * documentation or other materials provided with the distribution and in
  2274. 25310  * all advertising materials mentioning features or use of this software.
  2275. 25311  * Neither the name of the University nor the names of its contributors may
  2276. 25312  * be used to endorse or promote products derived from this software without
  2277. 25313  * specific prior written permission.
  2278. 25314  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  2279. 25315  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  2280. 25316  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2281. 25317  */
  2282. 25318
  2283. 25319 #if defined(LIBC_SCCS) && !defined(lint)
  2284. 25320 static char sccsid[] = "@(#)inet_addr.c 5.8 (Berkeley) 6/23/90";
  2285. 25321 #endif /* LIBC_SCCS and not lint */
  2286. 25322
  2287. 25323 #if _MINIX
  2288. 25324 #include <sys/types.h>
  2289. 25325 #include <ctype.h>
  2290. 25326 #include <errno.h>
  2291. 25327
  2292. 25328 #include <net/hton.h>
  2293. 25329 #include <net/gen/in.h>
  2294. 25330 #include <net/gen/inet.h>
  2295. 25331 #endif
  2296. 25332
  2297. 25333 #ifdef __STDC__
  2298. 25334 #define _CONST  const
  2299. 25335 #else
  2300. 25336 #define _CONST
  2301. 25337 #endif
  2302. 25338
  2303. 25339 /*
  2304. 25340  * Ascii internet address interpretation routine.
  2305. 25341  * The value returned is in network order.
  2306. 25342  */
  2307. 25343 ipaddr_t
  2308. 25344 inet_addr(cp)
  2309. 25345         register _CONST char *cp;
  2310. 25346 {
  2311. 25347         ipaddr_t val;
  2312. 25348
  2313. 25349         if (inet_aton(cp, &val))
  2314. 25350                 return (val);
  2315. 25351         errno= EINVAL;
  2316. 25352         return (ipaddr_t)-1;
  2317. 25353 }
  2318. .Ep 230 src/lib/ip/inet_addr.c
  2319. 25355 /* 
  2320. 25356  * Check whether "cp" is a valid ascii representation
  2321. 25357  * of an Internet address and convert to a binary address.
  2322. 25358  * Returns 1 if the address is valid, 0 if not.
  2323. 25359  * This replaces inet_addr, the return value from which
  2324. 25360  * cannot distinguish between failure and a local broadcast address.
  2325. 25361  */
  2326. 25362
  2327. 25363 int
  2328. 25364 inet_aton(cp, addr)
  2329. 25365         register _CONST char *cp;
  2330. 25366         ipaddr_t *addr;
  2331. 25367 {
  2332. 25368         register u32_t val, base, n;
  2333. 25369         register char c;
  2334. 25370         u32_t parts[4], *pp = parts;
  2335. 25371
  2336. 25372         for (;;) {
  2337. 25373                 /*
  2338. 25374                  * Collect number up to ``.''.
  2339. 25375                  * Values are specified as for C:
  2340. 25376                  * 0x=hex, 0=octal, other=decimal.
  2341. 25377                  */
  2342. 25378                 val = 0; base = 10;
  2343. 25379                 if (*cp == '0') {
  2344. 25380                         if (*++cp == 'x' || *cp == 'X')
  2345. 25381                                 base = 16, cp++;
  2346. 25382                         else
  2347. 25383                                 base = 8;
  2348. 25384                 }
  2349. 25385                 while ((c = *cp) != '') {
  2350. 25386                         if (isascii(c) && isdigit(c)) {
  2351. 25387                                 val = (val * base) + (c - '0');
  2352. 25388                                 cp++;
  2353. 25389                                 continue;
  2354. 25390                         }
  2355. 25391                         if (base == 16 && isascii(c) && isxdigit(c)) {
  2356. 25392                                 val = (val << 4) + 
  2357. 25393                                         (c + 10 - (islower(c) ? 'a' : 'A'));
  2358. 25394                                 cp++;
  2359. 25395                                 continue;
  2360. 25396                         }
  2361. 25397                         break;
  2362. 25398                 }
  2363. 25399                 if (*cp == '.') {
  2364. 25400                         /*
  2365. 25401                          * Internet format:
  2366. 25402                          *      a.b.c.d
  2367. 25403                          *      a.b.c   (with c treated as 16-bits)
  2368. 25404                          *      a.b     (with b treated as 24 bits)
  2369. 25405                          */
  2370. 25406                         if (pp >= parts + 3 || val > 0xff)
  2371. 25407                                 return (0);
  2372. 25408                         *pp++ = val, cp++;
  2373. 25409                 } else
  2374. 25410                         break;
  2375. 25411         }
  2376. 25412         /*
  2377. 25413          * Check for trailing characters.
  2378. 25414          */
  2379. .Op 231 src/lib/ip/inet_addr.c
  2380. 25415         if (*cp && (!isascii(*cp) || !isspace(*cp)))
  2381. 25416                 return (0);
  2382. 25417         /*
  2383. 25418          * Concoct the address according to
  2384. 25419          * the number of parts specified.
  2385. 25420          */
  2386. 25421         n = pp - parts + 1;
  2387. 25422         switch (n) {
  2388. 25423
  2389. 25424         case 1:                         /* a -- 32 bits */
  2390. 25425                 break;
  2391. 25426
  2392. 25427         case 2:                         /* a.b -- 8.24 bits */
  2393. 25428                 if (val > 0xffffff)
  2394. 25429                         return (0);
  2395. 25430                 val |= parts[0] << 24;
  2396. 25431                 break;
  2397. 25432
  2398. 25433         case 3:                         /* a.b.c -- 8.8.16 bits */
  2399. 25434                 if (val > 0xffff)
  2400. 25435                         return (0);
  2401. 25436                 val |= (parts[0] << 24) | (parts[1] << 16);
  2402. 25437                 break;
  2403. 25438
  2404. 25439         case 4:                         /* a.b.c.d -- 8.8.8.8 bits */
  2405. 25440                 if (val > 0xff)
  2406. 25441                         return (0);
  2407. 25442                 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  2408. 25443                 break;
  2409. 25444         }
  2410. 25445         if (addr)
  2411. 25446                 *addr = htonl(val);
  2412. 25447         return (1);
  2413. 25448 }
  2414. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2415. src/lib/ip/inet_ntoa.c    
  2416. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2417. 25500 /*
  2418. 25501  * Copyright (c) 1983 Regents of the University of California.
  2419. 25502  * All rights reserved.
  2420. 25503  *
  2421. 25504  * Redistribution and use in source and binary forms are permitted
  2422. 25505  * provided that: (1) source distributions retain this entire copyright
  2423. 25506  * notice and comment, and (2) distributions including binaries display
  2424. 25507  * the following acknowledgement:  ``This product includes software
  2425. 25508  * developed by the University of California, Berkeley and its contributors''
  2426. 25509  * in the documentation or other materials provided with the distribution
  2427. 25510  * and in all advertising materials mentioning features or use of this
  2428. 25511  * software. Neither the name of the University nor the names of its
  2429. 25512  * contributors may be used to endorse or promote products derived
  2430. 25513  * from this software without specific prior written permission.
  2431. 25514  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2432. 25515  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2433. 25516  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2434. 25517  */
  2435. 25518
  2436. 25519 #if defined(LIBC_SCCS) && !defined(lint)
  2437. .Ep 232 src/lib/ip/inet_ntoa.c
  2438. 25520 static char sccsid[] = "@(#)inet_ntoa.c 5.5 (Berkeley) 6/1/90";
  2439. 25521 #endif /* LIBC_SCCS and not lint */
  2440. 25522
  2441. 25523 /*
  2442. 25524  * Convert network-format internet address
  2443. 25525  * to base 256 d.d.d.d representation.
  2444. 25526  */
  2445. 25527
  2446. 25528 #include <sys/types.h>
  2447. 25529 #include <stdio.h>
  2448. 25530
  2449. 25531 #include <net/gen/in.h>
  2450. 25532 #include <net/gen/inet.h>
  2451. 25533
  2452. 25534 char *
  2453. 25535 inet_ntoa(in)
  2454. 25536         ipaddr_t in;
  2455. 25537 {
  2456. 25538         static char b[18];
  2457. 25539         register u8_t *p;
  2458. 25540
  2459. 25541         p = (u8_t *)&in;
  2460. 25542         sprintf(b, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  2461. 25543         return (b);
  2462. 25544 }
  2463. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2464. src/lib/ip/memcspn.c    
  2465. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2466. 25600 /*
  2467. 25601  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2468. 25602  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2469. 25603  */
  2470. 25604 /* $Header: strcspn.c,v 1.1 91/12/19 13:20:40 philip Exp $ */
  2471. 25605
  2472. 25606 #include        <string.h>
  2473. 25607
  2474. 25608 size_t
  2475. 25609 memcspn(const char *string, size_t strlen, const char *notin, size_t notinlen)
  2476. 25610 {
  2477. 25611         register const char *s1, *s2;
  2478. 25612         int i,j;
  2479. 25613
  2480. 25614         for (s1 = string, i = 0; i<strlen; s1++, i++) {
  2481. 25615                 for(s2 = notin, j = 0; *s2 != *s1 && j < notinlen; s2++, j++)
  2482. 25616                         /* EMPTY */ ;
  2483. 25617                 if (j != notinlen)
  2484. 25618                         break;
  2485. 25619         }
  2486. 25620         return s1 - string;
  2487. 25621 }
  2488. .Op 233 src/lib/ip/oneC_sum.c
  2489. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2490. src/lib/ip/oneC_sum.c    
  2491. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2492. 25700 /*      oneC_sum() - One complement's checksum          Author: Kees J. Bot
  2493. 25701  *                                                              8 May 1995
  2494. 25702  * See RFC 1071, "Computing the Internet checksum"
  2495. 25703  */
  2496. 25704
  2497. 25705 #include <sys/types.h>
  2498. 25706 #include <net/gen/oneCsum.h>
  2499. 25707
  2500. 25708 u16_t oneC_sum(U16_t prev, void *data, size_t size)
  2501. 25709 {
  2502. 25710         u8_t *dptr;
  2503. 25711         size_t n;
  2504. 25712         u16_t word;
  2505. 25713         u32_t sum;
  2506. 25714         int swap= 0;
  2507. 25715
  2508. 25716         sum= prev;
  2509. 25717         dptr= data;
  2510. 25718         n= size;
  2511. 25719
  2512. 25720         swap= ((size_t) dptr & 1);
  2513. 25721         if (swap) {
  2514. 25722                 sum= ((sum & 0xFF) << 8) | ((sum & 0xFF00) >> 8);
  2515. 25723                 if (n > 0) {
  2516. 25724                         ((u8_t *) &word)[0]= 0;
  2517. 25725                         ((u8_t *) &word)[1]= dptr[0];
  2518. 25726                         sum+= (u32_t) word;
  2519. 25727                         dptr+= 1;
  2520. 25728                         n-= 1;
  2521. 25729                 }
  2522. 25730         }
  2523. 25731
  2524. 25732         while (n >= 8) {
  2525. 25733                 sum+= (u32_t) ((u16_t *) dptr)[0]
  2526. 25734                     + (u32_t) ((u16_t *) dptr)[1]
  2527. 25735                     + (u32_t) ((u16_t *) dptr)[2]
  2528. 25736                     + (u32_t) ((u16_t *) dptr)[3];
  2529. 25737                 dptr+= 8;
  2530. 25738                 n-= 8;
  2531. 25739         }
  2532. 25740
  2533. 25741         while (n >= 2) {
  2534. 25742                 sum+= (u32_t) ((u16_t *) dptr)[0];
  2535. 25743                 dptr+= 2;
  2536. 25744                 n-= 2;
  2537. 25745         }
  2538. 25746
  2539. 25747         if (n > 0) {
  2540. 25748                 ((u8_t *) &word)[0]= dptr[0];
  2541. 25749                 ((u8_t *) &word)[1]= 0;
  2542. 25750                 sum+= (u32_t) word;
  2543. 25751         }
  2544. 25752
  2545. 25753         sum= (sum & 0xFFFF) + (sum >> 16);
  2546. 25754         if (sum > 0xFFFF) sum++;
  2547. .Ep 234 src/lib/ip/oneC_sum.c
  2548. 25755
  2549. 25756         if (swap) {
  2550. 25757                 sum= ((sum & 0xFF) << 8) | ((sum & 0xFF00) >> 8);
  2551. 25758         }
  2552. 25759         return sum;
  2553. 25760 }
  2554. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2555. src/lib/ip/rcmd.c    
  2556. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2557. 25800 /*
  2558. 25801  * Copyright (c) 1983 Regents of the University of California.
  2559. 25802  * All rights reserved.
  2560. 25803  *
  2561. 25804  * Redistribution and use in source and binary forms are permitted
  2562. 25805  * provided that: (1) source distributions retain this entire copyright
  2563. 25806  * notice and comment, and (2) distributions including binaries display
  2564. 25807  * the following acknowledgement:  ``This product includes software
  2565. 25808  * developed by the University of California, Berkeley and its contributors''
  2566. 25809  * in the documentation or other materials provided with the distribution
  2567. 25810  * and in all advertising materials mentioning features or use of this
  2568. 25811  * software. Neither the name of the University nor the names of its
  2569. 25812  * contributors may be used to endorse or promote products derived
  2570. 25813  * from this software without specific prior written permission.
  2571. 25814  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2572. 25815  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2573. 25816  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2574. 25817  */
  2575. 25818
  2576. 25819 #if defined(LIBC_SCCS) && !defined(lint)
  2577. 25820 static char sccsid[] = "@(#)rcmd.c      5.22 (Berkeley) 6/1/90";
  2578. 25821 #endif /* LIBC_SCCS and not lint */
  2579. 25822
  2580. 25823 #if _MINIX
  2581. 25824 #include <sys/types.h>
  2582. 25825 #include <sys/stat.h>
  2583. 25826 #include <sys/ioctl.h>
  2584. 25827 #include <ctype.h>
  2585. 25828 #include <errno.h>
  2586. 25829 #include <fcntl.h>
  2587. 25830 #include <limits.h>
  2588. 25831 #include <pwd.h>
  2589. 25832 #include <stdio.h>
  2590. 25833 #include <stdlib.h>
  2591. 25834 #include <signal.h>
  2592. 25835 #include <string.h>
  2593. 25836 #include <unistd.h>
  2594. 25837 #include <net/gen/netdb.h>
  2595. 25838 #include <net/gen/in.h>
  2596. 25839 #include <net/gen/tcp.h>
  2597. 25840 #include <net/gen/tcp_io.h>
  2598. 25841 #include <net/hton.h>
  2599. 25842 #include <net/netlib.h>
  2600. 25843
  2601. 25844 #define MAXHOSTNAMELEN  256
  2602. .Op 235 src/lib/ip/rcmd.c
  2603. 25845 #define MAXPATHLEN PATH_MAX
  2604. 25846 #else
  2605. 25847 #include <stdio.h>
  2606. 25848 #include <ctype.h>
  2607. 25849 #include <pwd.h>
  2608. 25850 #include <sys/param.h>
  2609. 25851 #include <sys/file.h>
  2610. 25852 #include <sys/signal.h>
  2611. 25853 #include <sys/socket.h>
  2612. 25854 #include <sys/stat.h>
  2613. 25855
  2614. 25856 #include <netinet/in.h>
  2615. 25857
  2616. 25858 #include <netdb.h>
  2617. 25859 #include <errno.h>
  2618. 25860 #endif
  2619. 25861
  2620. 25862 #ifdef __STDC__
  2621. 25863 #define CONST   const
  2622. 25864 #else
  2623. 25865 #define CONST
  2624. 25866 #endif
  2625. 25867
  2626. 25868 extern  errno;
  2627. 25869 #if _MINIX
  2628. 25870 int _validuser _ARGS(( FILE *hostf, const char *rhost, const char *luser,
  2629. 25871                                         const char *ruser, int baselen ));
  2630. 25872 static int _checkhost _ARGS(( const char *rhost, const char *lhost, int len ));
  2631. 25873 #else
  2632. 25874 char    *index();
  2633. 25875 #endif
  2634. 25876
  2635. 25877 #if _MINIX
  2636. 25878 int rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
  2637. 25879 char **ahost;
  2638. 25880 int rport;
  2639. 25881 CONST char *locuser, *remuser, *cmd;
  2640. 25882 int *fd2p;
  2641. 25883 {
  2642. 25884         int fd, fd2, result;
  2643. 25885         struct hostent *hp;
  2644. 25886         tcpport_t lport;
  2645. 25887         nwio_tcpconf_t tcpconf;
  2646. 25888         nwio_tcpcl_t tcpconnopt;
  2647. 25889         pid_t pid;
  2648. 25890         char num[8];
  2649. 25891         char c;
  2650. 25892         char *tcp_device;
  2651. 25893
  2652. 25894         fd= -1;
  2653. 25895         fd2= -1;
  2654. 25896
  2655. 25897         tcp_device= getenv("TCP_DEVICE");
  2656. 25898         if (tcp_device == NULL)
  2657. 25899                 tcp_device= TCP_DEVICE;
  2658. 25900         hp= gethostbyname(*ahost);
  2659. 25901         if (!hp)
  2660. 25902         {
  2661. 25903                 fprintf(stderr, "%s: unknown hostn", *ahost);
  2662. 25904                 return -1;
  2663. .Ep 236 src/lib/ip/rcmd.c
  2664. 25905         }
  2665. 25906         *ahost= hp->h_name;
  2666. 25907         for (lport= TCPPORT_RESERVED-1; lport >= TCPPORT_RESERVED/2; lport--)
  2667. 25908         {
  2668. 25909                 fd= open (tcp_device, O_RDWR);
  2669. 25910                 if (fd<0)
  2670. 25911                 {
  2671. 25912                         fprintf(stderr, "unable to open %s: %sn",
  2672. 25913                                 tcp_device, strerror(errno));
  2673. 25914                         goto bad;
  2674. 25915                 }
  2675. 25916                 tcpconf.nwtc_flags= NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP |
  2676. 25917                         NWTC_EXCL;
  2677. 25918                 tcpconf.nwtc_locport= htons(lport);
  2678. 25919                 tcpconf.nwtc_remport= rport;
  2679. 25920                 tcpconf.nwtc_remaddr= *(ipaddr_t *)hp->h_addr;
  2680. 25921
  2681. 25922                 result= ioctl(fd, NWIOSTCPCONF, &tcpconf);
  2682. 25923                 if (result<0)
  2683. 25924                 {
  2684. 25925                         if (errno == EADDRINUSE)
  2685. 25926                         {
  2686. 25927                                 close(fd);
  2687. 25928                                 continue;
  2688. 25929                         }
  2689. 25930                         fprintf(stderr, "unable to ioctl(NWIOSTCPCONF): %sn",
  2690. 25931                                 strerror(errno));
  2691. 25932                         goto bad;
  2692. 25933                 }
  2693. 25934                 tcpconf.nwtc_flags= NWTC_SHARED;
  2694. 25935                 result= ioctl(fd, NWIOSTCPCONF, &tcpconf);
  2695. 25936                 if (result<0)
  2696. 25937                 {
  2697. 25938                         fprintf(stderr, "unable to ioctl(NWIOSTCPCONF): %sn",
  2698. 25939                                 strerror(errno));
  2699. 25940                         goto bad;
  2700. 25941                 }
  2701. 25942                 tcpconnopt.nwtcl_flags= 0;
  2702. 25943
  2703. 25944                 do
  2704. 25945                 {
  2705. 25946                         result= ioctl (fd, NWIOTCPCONN, &tcpconnopt);
  2706. 25947                         if (result<0 && errno == EAGAIN)
  2707. 25948                         {
  2708. 25949                                 sleep(2);
  2709. 25950                         }
  2710. 25951                 } while (result<0 && errno == EAGAIN);
  2711. 25952                 if (result<0 && errno != EADDRINUSE)
  2712. 25953                 {
  2713. 25954                         fprintf(stderr,
  2714. 25955                                 "unable to ioctl(NWIOTCPCONN): %sn",
  2715. 25956                                 strerror(errno));
  2716. 25957                         goto bad;
  2717. 25958                 }
  2718. 25959                 if (result>=0)
  2719. 25960                         break;
  2720. 25961         }
  2721. 25962         if (lport<TCPPORT_RESERVED/2)
  2722. 25963         {
  2723. 25964                 fprintf(stderr, "can't get portn");
  2724. .Op 237 src/lib/ip/rcmd.c
  2725. 25965                 return -1;
  2726. 25966         }
  2727. 25967         if (!fd2p)
  2728. 25968         {
  2729. 25969                 if (write(fd, "", 1) != 1)
  2730. 25970                 {
  2731. 25971                         fprintf(stderr, "unable to write: %s", strerror(errno));
  2732. 25972                         goto bad;
  2733. 25973                 }
  2734. 25974         }
  2735. 25975         else
  2736. 25976         {
  2737. 25977                 fd2= open (tcp_device, O_RDWR);
  2738. 25978                 if (fd2<0)
  2739. 25979                 {
  2740. 25980                         fprintf(stderr, "unable to open %s: %sn",
  2741. 25981                                 tcp_device, strerror(errno));
  2742. 25982                         goto bad;
  2743. 25983                 }
  2744. 25984                 tcpconf.nwtc_flags= NWTC_LP_SET | NWTC_UNSET_RA | 
  2745. 25985                         NWTC_UNSET_RP | NWTC_SHARED;
  2746. 25986                 tcpconf.nwtc_locport= htons(lport);
  2747. 25987
  2748. 25988                 result= ioctl(fd2, NWIOSTCPCONF, &tcpconf);
  2749. 25989                 if (result<0)
  2750. 25990                 {
  2751. 25991                         fprintf(stderr,
  2752. 25992                                 "unable to ioctl(NWIOSTCPCONF): %sn",
  2753. 25993                                 strerror(errno));
  2754. 25994                         goto bad;
  2755. 25995                 }
  2756. 25996                 pid= fork();
  2757. 25997                 if (pid<0)
  2758. 25998                 {
  2759. 25999                         fprintf(stderr, "unable to fork: %sn",
  2760. 26000                                 strerror(errno));
  2761. 26001                         goto bad;
  2762. 26002                 }
  2763. 26003                 if (!pid)
  2764. 26004                 {
  2765. 26005                         alarm(0);
  2766. 26006                         signal(SIGALRM, SIG_DFL);
  2767. 26007                         alarm(30); /* give up after half a minute */
  2768. 26008                         tcpconnopt.nwtcl_flags= 0;
  2769. 26009
  2770. 26010                         do
  2771. 26011                         {
  2772. 26012                                 result= ioctl (fd2, NWIOTCPLISTEN,
  2773. 26013                                         &tcpconnopt);
  2774. 26014                                 if (result<0 && errno == EAGAIN)
  2775. 26015                                 {
  2776. 26016                                         sleep(2);
  2777. 26017                                 }
  2778. 26018                         } while (result<0 && errno == EAGAIN);
  2779. 26019                         if (result<0 && errno != EADDRINUSE)
  2780. 26020                         {
  2781. 26021                                 fprintf(stderr,
  2782. 26022                                         "unable to ioctl(NWIOTCPLISTEN): %sn",
  2783. 26023                                         strerror(errno));
  2784. 26024                                 exit(1);
  2785. .Ep 238 src/lib/ip/rcmd.c
  2786. 26025                         }
  2787. 26026                         if (result>=0)
  2788. 26027                                 exit(0);
  2789. 26028                         else
  2790. 26029                                 exit(1);
  2791. 26030                 }
  2792. 26031                 /*
  2793. 26032                  * This sleep is a HACK.  The command that we are starting
  2794. 26033                  * will try to connect to the fd2 port.  It seems that for
  2795. 26034                  * this to succeed the child process must have already made
  2796. 26035                  * the call to ioctl above (the NWIOTCPLISTEN) call.
  2797. 26036                  * The sleep gives the child a chance to make the call
  2798. 26037                  * before the parent sends the port number to the
  2799. 26038                  * command being started.
  2800. 26039                  */
  2801. 26040                 sleep(1);
  2802. 26041
  2803. 26042                 sprintf(num, "%d", lport);
  2804. 26043                 if (write(fd, num, strlen(num)+1) != strlen(num)+1)
  2805. 26044                 {
  2806. 26045                         fprintf(stderr, "unable to write: %sn",
  2807. 26046                                 strerror(errno));
  2808. 26047                         goto bad;
  2809. 26048                 }
  2810. 26049
  2811. 26050         }
  2812. 26051         write (fd, locuser, strlen(locuser)+1);
  2813. 26052         write (fd, remuser, strlen(remuser)+1);
  2814. 26053         write (fd, cmd, strlen(cmd)+1);
  2815. 26054         if (read(fd, &c, 1) != 1)
  2816. 26055         {
  2817. 26056                 fprintf(stderr, "unable to read: %sn", strerror(errno) );
  2818. 26057                 goto bad;
  2819. 26058         }
  2820. 26059         if (c != 0)
  2821. 26060         {
  2822. 26061                 while (read(fd, &c, 1) == 1)
  2823. 26062                 {
  2824. 26063                         write(2, &c, 1);
  2825. 26064                         if (c == 'n')
  2826. 26065                                 break;
  2827. 26066                 }
  2828. 26067                 goto bad;
  2829. 26068         }
  2830. 26069         if (fd2p)
  2831. 26070         {
  2832. 26071                 *fd2p= fd2;
  2833. 26072                 result= ioctl(fd2, NWIOGTCPCONF, &tcpconf);
  2834. 26073                 if (result<0)
  2835. 26074                 {
  2836. 26075                         fprintf(stderr, "unable to ioctl(NWIOGTCPCONF): %sn",
  2837. 26076                                 strerror(errno) );
  2838. 26077                         goto bad;
  2839. 26078                 }
  2840. 26079                 if (ntohs(tcpconf.nwtc_remport) >= TCPPORT_RESERVED)
  2841. 26080                 {
  2842. 26081                         fprintf(stderr, "unable to setup 2nd channeln");
  2843. 26082                         goto bad;
  2844. 26083                 }
  2845. 26084         }
  2846. .Op 239 src/lib/ip/rcmd.c
  2847. 26085         return fd;
  2848. 26086
  2849. 26087 bad:
  2850. 26088         if (fd>=0)
  2851. 26089                 close(fd);
  2852. 26090         if (fd2>=0)
  2853. 26091                 close(fd2);
  2854. 26092         return -1;
  2855. 26093 }
  2856. 26094 #else /* _MINIX */
  2857. 26095 rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
  2858. 26096         char **ahost;
  2859. 26097         u_short rport;
  2860. 26098         char *locuser, *remuser, *cmd;
  2861. 26099         int *fd2p;
  2862. 26100 {
  2863. 26101         int s, timo = 1, pid;
  2864. 26102         long oldmask;
  2865. 26103         struct sockaddr_in sin, sin2, from;
  2866. 26104         char c;
  2867. 26105         int lport = IPPORT_RESERVED - 1;
  2868. 26106         struct hostent *hp;
  2869. 26107         fd_set reads;
  2870. 26108
  2871. 26109         pid = getpid();
  2872. 26110         hp = gethostbyname(*ahost);
  2873. 26111         if (hp == 0) {
  2874. 26112                 herror(*ahost);
  2875. 26113                 return (-1);
  2876. 26114         }
  2877. 26115         *ahost = hp->h_name;
  2878. 26116         oldmask = sigblock(sigmask(SIGURG));
  2879. 26117         for (;;) {
  2880. 26118                 s = rresvport(&lport);
  2881. 26119                 if (s < 0) {
  2882. 26120                         if (errno == EAGAIN)
  2883. 26121                                 fprintf(stderr, "socket: All ports in usen");
  2884. 26122                         else
  2885. 26123                                 perror("rcmd: socket");
  2886. 26124                         sigsetmask(oldmask);
  2887. 26125                         return (-1);
  2888. 26126                 }
  2889. 26127                 fcntl(s, F_SETOWN, pid);
  2890. 26128                 sin.sin_family = hp->h_addrtype;
  2891. 26129                 bcopy(hp->h_addr_list[0], (caddr_t)&sin.sin_addr, hp->h_length);
  2892. 26130                 sin.sin_port = rport;
  2893. 26131                 if (connect(s, (caddr_t)&sin, sizeof (sin), 0) >= 0)
  2894. 26132                         break;
  2895. 26133                 (void) close(s);
  2896. 26134                 if (errno == EADDRINUSE) {
  2897. 26135                         lport--;
  2898. 26136                         continue;
  2899. 26137                 }
  2900. 26138                 if (errno == ECONNREFUSED && timo <= 16) {
  2901. 26139                         sleep(timo);
  2902. 26140                         timo *= 2;
  2903. 26141                         continue;
  2904. 26142                 }
  2905. 26143                 if (hp->h_addr_list[1] != NULL) {
  2906. 26144                         int oerrno = errno;
  2907. .Ep 240 src/lib/ip/rcmd.c
  2908. 26145
  2909. 26146                         fprintf(stderr,
  2910. 26147                             "connect to address %s: ", inet_ntoa(sin.sin_addr));
  2911. 26148                         errno = oerrno;
  2912. 26149                         perror(0);
  2913. 26150                         hp->h_addr_list++;
  2914. 26151                         bcopy(hp->h_addr_list[0], (caddr_t)&sin.sin_addr,
  2915. 26152                             hp->h_length);
  2916. 26153                         fprintf(stderr, "Trying %s...n",
  2917. 26154                                 inet_ntoa(sin.sin_addr));
  2918. 26155                         continue;
  2919. 26156                 }
  2920. 26157                 perror(hp->h_name);
  2921. 26158                 sigsetmask(oldmask);
  2922. 26159                 return (-1);
  2923. 26160         }
  2924. 26161         lport--;
  2925. 26162         if (fd2p == 0) {
  2926. 26163                 write(s, "", 1);
  2927. 26164                 lport = 0;
  2928. 26165         } else {
  2929. 26166                 char num[8];
  2930. 26167                 int s2 = rresvport(&lport), s3;
  2931. 26168                 int len = sizeof (from);
  2932. 26169
  2933. 26170                 if (s2 < 0)
  2934. 26171                         goto bad;
  2935. 26172                 listen(s2, 1);
  2936. 26173                 (void) sprintf(num, "%d", lport);
  2937. 26174                 if (write(s, num, strlen(num)+1) != strlen(num)+1) {
  2938. 26175                         perror("write: setting up stderr");
  2939. 26176                         (void) close(s2);
  2940. 26177                         goto bad;
  2941. 26178                 }
  2942. 26179                 FD_ZERO(&reads);
  2943. 26180                 FD_SET(s, &reads);
  2944. 26181                 FD_SET(s2, &reads);
  2945. 26182                 errno = 0;
  2946. 26183                 if (select(32, &reads, 0, 0, 0) < 1 ||
  2947. 26184                     !FD_ISSET(s2, &reads)) {
  2948. 26185                         if (errno != 0)
  2949. 26186                                 perror("select: setting up stderr");
  2950. 26187                         else
  2951. 26188                             fprintf(stderr,
  2952. 26189                                 "select: protocol failure in circuit setup.n");
  2953. 26190                         (void) close(s2);
  2954. 26191                         goto bad;
  2955. 26192                 }
  2956. 26193                 s3 = accept(s2, &from, &len, 0);
  2957. 26194                 (void) close(s2);
  2958. 26195                 if (s3 < 0) {
  2959. 26196                         perror("accept");
  2960. 26197                         lport = 0;
  2961. 26198                         goto bad;
  2962. 26199                 }
  2963. 26200                 *fd2p = s3;
  2964. 26201                 from.sin_port = ntohs((u_short)from.sin_port);
  2965. 26202                 if (from.sin_family != AF_INET ||
  2966. 26203                     from.sin_port >= IPPORT_RESERVED ||
  2967. 26204                     from.sin_port < IPPORT_RESERVED / 2) {
  2968. .Op 241 src/lib/ip/rcmd.c
  2969. 26205                         fprintf(stderr,
  2970. 26206                             "socket: protocol failure in circuit setup.n");
  2971. 26207                         goto bad2;
  2972. 26208                 }
  2973. 26209         }
  2974. 26210         (void) write(s, locuser, strlen(locuser)+1);
  2975. 26211         (void) write(s, remuser, strlen(remuser)+1);
  2976. 26212         (void) write(s, cmd, strlen(cmd)+1);
  2977. 26213         if (read(s, &c, 1) != 1) {
  2978. 26214                 perror(*ahost);
  2979. 26215                 goto bad2;
  2980. 26216         }
  2981. 26217         if (c != 0) {
  2982. 26218                 while (read(s, &c, 1) == 1) {
  2983. 26219                         (void) write(2, &c, 1);
  2984. 26220                         if (c == 'n')
  2985. 26221                                 break;
  2986. 26222                 }
  2987. 26223                 goto bad2;
  2988. 26224         }
  2989. 26225         sigsetmask(oldmask);
  2990. 26226         return (s);
  2991. 26227 bad2:
  2992. 26228         if (lport)
  2993. 26229                 (void) close(*fd2p);
  2994. 26230 bad:
  2995. 26231         (void) close(s);
  2996. 26232         sigsetmask(oldmask);
  2997. 26233         return (-1);
  2998. 26234 }
  2999. 26236 rresvport(alport)
  3000. 26237         int *alport;
  3001. 26238 {
  3002. 26239         struct sockaddr_in sin;
  3003. 26240         int s;
  3004. 26241
  3005. 26242         sin.sin_family = AF_INET;
  3006. 26243         sin.sin_addr.s_addr = INADDR_ANY;
  3007. 26244         s = socket(AF_INET, SOCK_STREAM, 0);
  3008. 26245         if (s < 0)
  3009. 26246                 return (-1);
  3010. 26247         for (;;) {
  3011. 26248                 sin.sin_port = htons((u_short)*alport);
  3012. 26249                 if (bind(s, (caddr_t)&sin, sizeof (sin)) >= 0)
  3013. 26250                         return (s);
  3014. 26251                 if (errno != EADDRINUSE) {
  3015. 26252                         (void) close(s);
  3016. 26253                         return (-1);
  3017. 26254                 }
  3018. 26255                 (*alport)--;
  3019. 26256                 if (*alport == IPPORT_RESERVED/2) {
  3020. 26257                         (void) close(s);
  3021. 26258                         errno = EAGAIN;         /* close */
  3022. 26259                         return (-1);
  3023. 26260                 }
  3024. 26261         }
  3025. 26262 }
  3026. 26263 #endif /* _MINIX */
  3027. 26264
  3028. .Ep 242 src/lib/ip/rcmd.c
  3029. 26265 int     _check_rhosts_file = 1;
  3030. 26266
  3031. 26267 ruserok(rhost, superuser, ruser, luser)
  3032. 26268         CONST char *rhost;
  3033. 26269         int superuser;
  3034. 26270         CONST char *ruser, *luser;
  3035. 26271 {
  3036. 26272         FILE *hostf;
  3037. 26273         char fhost[MAXHOSTNAMELEN];
  3038. 26274         int first = 1;
  3039. 26275         register CONST char *sp;
  3040. 26276         register char *p;
  3041. 26277         int baselen = -1;
  3042. 26278
  3043. 26279         sp = rhost;
  3044. 26280         p = fhost;
  3045. 26281         while (*sp) {
  3046. 26282                 if (*sp == '.') {
  3047. 26283                         if (baselen == -1)
  3048. 26284                                 baselen = sp - rhost;
  3049. 26285                         *p++ = *sp++;
  3050. 26286                 } else {
  3051. 26287                         *p++ = isupper(*sp) ? tolower(*sp++) : *sp++;
  3052. 26288                 }
  3053. 26289         }
  3054. 26290         *p = '';
  3055. 26291         hostf = superuser ? (FILE *)0 : fopen(_PATH_HEQUIV, "r");
  3056. 26292 again:
  3057. 26293         if (hostf) {
  3058. 26294                 if (!_validuser(hostf, fhost, luser, ruser, baselen)) {
  3059. 26295                         (void) fclose(hostf);
  3060. 26296                         return(0);
  3061. 26297                 }
  3062. 26298                 (void) fclose(hostf);
  3063. 26299         }
  3064. 26300         if (first == 1 && (_check_rhosts_file || superuser)) {
  3065. 26301                 struct stat sbuf;
  3066. 26302                 struct passwd *pwd;
  3067. 26303                 char pbuf[MAXPATHLEN];
  3068. 26304
  3069. 26305                 first = 0;
  3070. 26306                 if ((pwd = getpwnam(luser)) == NULL)
  3071. 26307                         return(-1);
  3072. 26308                 (void)strcpy(pbuf, pwd->pw_dir);
  3073. 26309                 (void)strcat(pbuf, "/.rhosts");
  3074. 26310                 if ((hostf = fopen(pbuf, "r")) == NULL)
  3075. 26311                         return(-1);
  3076. 26312                 /*
  3077. 26313                  * if owned by someone other than user or root or if
  3078. 26314                  * writeable by anyone but the owner, quit
  3079. 26315                  */
  3080. 26316                 if (fstat(fileno(hostf), &sbuf) ||
  3081. 26317                     sbuf.st_uid && sbuf.st_uid != pwd->pw_uid ||
  3082. 26318                     sbuf.st_mode&022) {
  3083. 26319                         fclose(hostf);
  3084. 26320                         return(-1);
  3085. 26321                 }
  3086. 26322                 goto again;
  3087. 26323         }
  3088. 26324         return (-1);
  3089. .Op 243 src/lib/ip/rcmd.c
  3090. 26325 }
  3091. 26327 /* don't make static, used by lpd(8) */
  3092. 26328 int _validuser(hostf, rhost, luser, ruser, baselen)
  3093. 26329         FILE *hostf;
  3094. 26330         CONST char *rhost, *luser, *ruser;
  3095. 26331         int baselen;
  3096. 26332 {
  3097. 26333         char *user;
  3098. 26334         char ahost[MAXHOSTNAMELEN];
  3099. 26335         register char *p;
  3100. 26336
  3101. 26337         while (fgets(ahost, sizeof (ahost), hostf)) {
  3102. 26338                 p = ahost;
  3103. 26339                 while (*p != 'n' && *p != ' ' && *p != 't' && *p != '') {
  3104. 26340                         *p = isupper(*p) ? tolower(*p) : *p;
  3105. 26341                         p++;
  3106. 26342                 }
  3107. 26343                 if (*p == ' ' || *p == 't') {
  3108. 26344                         *p++ = '';
  3109. 26345                         while (*p == ' ' || *p == 't')
  3110. 26346                                 p++;
  3111. 26347                         user = p;
  3112. 26348                         while (*p != 'n' && *p != ' ' && *p != 't' && *p != '')
  3113. 26349                                 p++;
  3114. 26350                 } else
  3115. 26351                         user = p;
  3116. 26352                 *p = '';
  3117. 26353                 if (_checkhost(rhost, ahost, baselen) &&
  3118. 26354                     !strcmp(ruser, *user ? user : luser)) {
  3119. 26355                         return (0);
  3120. 26356                 }
  3121. 26357         }
  3122. 26358         return (-1);
  3123. 26359 }
  3124. 26361 static int
  3125. 26362 _checkhost(rhost, lhost, len)
  3126. 26363         CONST char *rhost, *lhost;
  3127. 26364         int len;
  3128. 26365 {
  3129. 26366         static char ldomain[MAXHOSTNAMELEN + 1];
  3130. 26367         static char *domainp = NULL;
  3131. 26368         static int nodomain = 0;
  3132. 26369         register char *cp;
  3133. 26370
  3134. 26371         if (len == -1)
  3135. 26372                 return(!strcmp(rhost, lhost));
  3136. 26373         if (strncmp(rhost, lhost, len))
  3137. 26374                 return(0);
  3138. 26375         if (!strcmp(rhost, lhost))
  3139. 26376                 return(1);
  3140. 26377         if (*(lhost + len) != '')
  3141. 26378                 return(0);
  3142. 26379         if (nodomain)
  3143. 26380                 return(0);
  3144. 26381         if (!domainp) {
  3145. 26382                 if (gethostname(ldomain, sizeof(ldomain)) == -1) {
  3146. 26383                         nodomain = 1;
  3147. 26384                         return(0);
  3148. .Ep 244 src/lib/ip/rcmd.c
  3149. 26385                 }
  3150. 26386                 ldomain[MAXHOSTNAMELEN] = 0;
  3151. 26387                 if ((domainp = index(ldomain, '.')) == (char *)NULL) {
  3152. 26388                         nodomain = 1;
  3153. 26389                         return(0);
  3154. 26390                 }
  3155. 26391                 for (cp = ++domainp; *cp; ++cp)
  3156. 26392                         if (isupper(*cp))
  3157. 26393                                 *cp = tolower(*cp);
  3158. 26394         }
  3159. 26395         return(!strcmp(domainp, rhost + len +1));
  3160. 26396 }
  3161. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3162. src/lib/ip/res_comp.c    
  3163. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3164. 26400 /*
  3165. 26401  * Copyright (c) 1985 Regents of the University of California.
  3166. 26402  * All rights reserved.
  3167. 26403  *
  3168. 26404  * Redistribution and use in source and binary forms are permitted provided
  3169. 26405  * that: (1) source distributions retain this entire copyright notice and
  3170. 26406  * comment, and (2) distributions including binaries display the following
  3171. 26407  * acknowledgement:  ``This product includes software developed by the
  3172. 26408  * University of California, Berkeley and its contributors'' in the
  3173. 26409  * documentation or other materials provided with the distribution and in
  3174. 26410  * all advertising materials mentioning features or use of this software.
  3175. 26411  * Neither the name of the University nor the names of its contributors may
  3176. 26412  * be used to endorse or promote products derived from this software without
  3177. 26413  * specific prior written permission.
  3178. 26414  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  3179. 26415  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  3180. 26416  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  3181. 26417  */
  3182. 26418
  3183. 26419 #if defined(LIBC_SCCS) && !defined(lint)
  3184. 26420 static char sccsid[] = "@(#)res_comp.c  6.18 (Berkeley) 6/27/90";
  3185. 26421 #endif /* LIBC_SCCS and not lint */
  3186. 26422
  3187. 26423 #if _MINIX
  3188. 26424 #include <sys/types.h>
  3189. 26425 #include <stdlib.h>
  3190. 26426
  3191. 26427 #include <net/gen/in.h>
  3192. 26428 #include <net/gen/nameser.h>
  3193. 26429 #include <net/gen/resolv.h>
  3194. 26430
  3195. 26431 typedef u8_t u_char;
  3196. 26432 typedef u16_t u_short;
  3197. 26433 typedef u32_t u_long;
  3198. 26434
  3199. 26435 static int dn_find _ARGS(( const u_char *exp_dn, const u_char *msg,
  3200. 26436         u_char **dnptrs, u_char **lastdnptr ));
  3201. 26437 int dn_skipname _ARGS(( const u_char *comp_dn, const u_char *eom ));
  3202. 26438
  3203. 26439 #define getshort _getshort
  3204. .Op 245 src/lib/ip/res_comp.c
  3205. 26440 #define getlong _getlong
  3206. 26441 #define putshort __putshort
  3207. 26442 #define putlong __putlong
  3208. 26443 #else
  3209. 26444 #include <sys/types.h>
  3210. 26445 #include <stdio.h>
  3211. 26446 #include <arpa/nameser.h>
  3212. 26447
  3213. 26448 static dn_find();
  3214. 26449 #endif
  3215. 26450
  3216. 26451 #ifdef __STDC__
  3217. 26452 #define CONST   const
  3218. 26453 #else
  3219. 26454 #define CONST
  3220. 26455 #endif
  3221. 26456
  3222. 26457 /*
  3223. 26458  * Expand compressed domain name 'comp_dn' to full domain name.
  3224. 26459  * 'msg' is a pointer to the begining of the message,
  3225. 26460  * 'eomorig' points to the first location after the message,
  3226. 26461  * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
  3227. 26462  * Return size of compressed name or -1 if there was an error.
  3228. 26463  */
  3229. 26464 dn_expand(msg, eomorig, comp_dn, exp_dn, length)
  3230. 26465         CONST u_char *msg, *eomorig, *comp_dn;
  3231. 26466         u_char *exp_dn;
  3232. 26467         int length;
  3233. 26468 {
  3234. 26469         register CONST u_char *cp;
  3235. 26470         register u_char *dn;
  3236. 26471         register int n, c;
  3237. 26472         CONST u_char *eom;
  3238. 26473         int len = -1, checked = 0;
  3239. 26474
  3240. 26475         dn = exp_dn;
  3241. 26476         cp = comp_dn;
  3242. 26477         eom = exp_dn + length;
  3243. 26478         /*
  3244. 26479          * fetch next label in domain name
  3245. 26480          */
  3246. 26481         while (n = *cp++) {
  3247. 26482                 /*
  3248. 26483                  * Check for indirection
  3249. 26484                  */
  3250. 26485                 switch (n & INDIR_MASK) {
  3251. 26486                 case 0:
  3252. 26487                         if (dn != exp_dn) {
  3253. 26488                                 if (dn >= eom)
  3254. 26489                                         return (-1);
  3255. 26490                                 *dn++ = '.';
  3256. 26491                         }
  3257. 26492                         if (dn+n >= eom)
  3258. 26493                                 return (-1);
  3259. 26494                         checked += n + 1;
  3260. 26495                         while (--n >= 0) {
  3261. 26496                                 if ((c = *cp++) == '.') {
  3262. 26497                                         if (dn + n + 2 >= eom)
  3263. 26498                                                 return (-1);
  3264. 26499                                         *dn++ = '\';
  3265. .Ep 246 src/lib/ip/res_comp.c
  3266. 26500                                 }
  3267. 26501                                 *dn++ = c;
  3268. 26502                                 if (cp >= eomorig)      /* out of range */
  3269. 26503                                         return(-1);
  3270. 26504                         }
  3271. 26505                         break;
  3272. 26506
  3273. 26507                 case INDIR_MASK:
  3274. 26508                         if (len < 0)
  3275. 26509                                 len = cp - comp_dn + 1;
  3276. 26510                         cp = msg + (((n & 0x3f) << 8) | (*cp & 0xff));
  3277. 26511                         if (cp < msg || cp >= eomorig)  /* out of range */
  3278. 26512                                 return(-1);
  3279. 26513                         checked += 2;
  3280. 26514                         /*
  3281. 26515                          * Check for loops in the compressed name;
  3282. 26516                          * if we've looked at the whole message,
  3283. 26517                          * there must be a loop.
  3284. 26518                          */
  3285. 26519                         if (checked >= eomorig - msg)
  3286. 26520                                 return (-1);
  3287. 26521                         break;
  3288. 26522
  3289. 26523                 default:
  3290. 26524                         return (-1);                    /* flag error */
  3291. 26525                 }
  3292. 26526         }
  3293. 26527         *dn = '';
  3294. 26528         if (len < 0)
  3295. 26529                 len = cp - comp_dn;
  3296. 26530         return (len);
  3297. 26531 }
  3298. 26533 /*
  3299. 26534  * Compress domain name 'exp_dn' into 'comp_dn'.
  3300. 26535  * Return the size of the compressed name or -1.
  3301. 26536  * 'length' is the size of the array pointed to by 'comp_dn'.
  3302. 26537  * 'dnptrs' is a list of pointers to previous compressed names. dnptrs[0]
  3303. 26538  * is a pointer to the beginning of the message. The list ends with NULL.
  3304. 26539  * 'lastdnptr' is a pointer to the end of the arrary pointed to
  3305. 26540  * by 'dnptrs'. Side effect is to update the list of pointers for
  3306. 26541  * labels inserted into the message as we compress the name.
  3307. 26542  * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr'
  3308. 26543  * is NULL, we don't update the list.
  3309. 26544  */
  3310. 26545 int
  3311. 26546 dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr)
  3312. 26547         CONST u_char *exp_dn;
  3313. 26548         u_char *comp_dn;
  3314. 26549         int length;
  3315. 26550         u_char **dnptrs, **lastdnptr;
  3316. 26551 {
  3317. 26552         register u_char *cp;
  3318. 26553         register CONST u_char *dn;
  3319. 26554         register int c, l;
  3320. 26555         u_char **cpp, **lpp, *sp, *eob;
  3321. 26556         u_char *msg;
  3322. 26557
  3323. 26558         dn = exp_dn;
  3324. 26559         cp = comp_dn;
  3325. .Op 247 src/lib/ip/res_comp.c
  3326. 26560         eob = cp + length;
  3327. 26561         if (dnptrs != NULL) {
  3328. 26562                 if ((msg = *dnptrs++) != NULL) {
  3329. 26563                         for (cpp = dnptrs; *cpp != NULL; cpp++)
  3330. 26564                                 ;
  3331. 26565                         lpp = cpp;      /* end of list to search */
  3332. 26566                 }
  3333. 26567         } else
  3334. 26568                 msg = NULL;
  3335. 26569         for (c = *dn++; c != ''; ) {
  3336. 26570                 /* look to see if we can use pointers */
  3337. 26571                 if (msg != NULL) {
  3338. 26572                         if ((l = dn_find(dn-1, msg, dnptrs, lpp)) >= 0) {
  3339. 26573                                 if (cp+1 >= eob)
  3340. 26574                                         return (-1);
  3341. 26575                                 *cp++ = (l >> 8) | INDIR_MASK;
  3342. 26576                                 *cp++ = l % 256;
  3343. 26577                                 return (cp - comp_dn);
  3344. 26578                         }
  3345. 26579                         /* not found, save it */
  3346. 26580                         if (lastdnptr != NULL && cpp < lastdnptr-1) {
  3347. 26581                                 *cpp++ = cp;
  3348. 26582                                 *cpp = NULL;
  3349. 26583                         }
  3350. 26584                 }
  3351. 26585                 sp = cp++;      /* save ptr to length byte */
  3352. 26586                 do {
  3353. 26587                         if (c == '.') {
  3354. 26588                                 c = *dn++;
  3355. 26589                                 break;
  3356. 26590                         }
  3357. 26591                         if (c == '\') {
  3358. 26592                                 if ((c = *dn++) == '')
  3359. 26593                                         break;
  3360. 26594                         }
  3361. 26595                         if (cp >= eob) {
  3362. 26596                                 if (msg != NULL)
  3363. 26597                                         *lpp = NULL;
  3364. 26598                                 return (-1);
  3365. 26599                         }
  3366. 26600                         *cp++ = c;
  3367. 26601                 } while ((c = *dn++) != '');
  3368. 26602                 /* catch trailing '.'s but not '..' */
  3369. 26603                 if ((l = cp - sp - 1) == 0 && c == '') {
  3370. 26604                         cp--;
  3371. 26605                         break;
  3372. 26606                 }
  3373. 26607                 if (l <= 0 || l > MAXLABEL) {
  3374. 26608                         if (msg != NULL)
  3375. 26609                                 *lpp = NULL;
  3376. 26610                         return (-1);
  3377. 26611                 }
  3378. 26612                 *sp = l;
  3379. 26613         }
  3380. 26614         if (cp >= eob) {
  3381. 26615                 if (msg != NULL)
  3382. 26616                         *lpp = NULL;
  3383. 26617                 return (-1);
  3384. 26618         }
  3385. 26619         *cp++ = '';
  3386. .Ep 248 src/lib/ip/res_comp.c
  3387. 26620         return (cp - comp_dn);
  3388. 26621 }
  3389. 26623 /*
  3390. 26624  * Skip over a compressed domain name. Return the size or -1.
  3391. 26625  */
  3392. 26626 dn_skipname(comp_dn, eom)
  3393. 26627         CONST u_char *comp_dn, *eom;
  3394. 26628 {
  3395. 26629         register CONST u_char *cp;
  3396. 26630         register int n;
  3397. 26631
  3398. 26632         cp = comp_dn;
  3399. 26633         while (cp < eom && (n = *cp++)) {
  3400. 26634                 /*
  3401. 26635                  * check for indirection
  3402. 26636                  */
  3403. 26637                 switch (n & INDIR_MASK) {
  3404. 26638                 case 0:         /* normal case, n == len */
  3405. 26639                         cp += n;
  3406. 26640                         continue;
  3407. 26641                 default:        /* illegal type */
  3408. 26642                         return (-1);
  3409. 26643                 case INDIR_MASK:        /* indirection */
  3410. 26644                         cp++;
  3411. 26645                 }
  3412. 26646                 break;
  3413. 26647         }
  3414. 26648         return (cp - comp_dn);
  3415. 26649 }
  3416. 26651 /*
  3417. 26652  * Search for expanded name from a list of previously compressed names.
  3418. 26653  * Return the offset from msg if found or -1.
  3419. 26654  * dnptrs is the pointer to the first name on the list,
  3420. 26655  * not the pointer to the start of the message.
  3421. 26656  */
  3422. 26657 static int
  3423. 26658 dn_find(exp_dn, msg, dnptrs, lastdnptr)
  3424. 26659         CONST u_char *exp_dn, *msg;
  3425. 26660         u_char **dnptrs, **lastdnptr;
  3426. 26661 {
  3427. 26662         CONST register u_char *dn, *cp;
  3428. 26663         register u_char **cpp;
  3429. 26664         register int n;
  3430. 26665         CONST u_char *sp;
  3431. 26666
  3432. 26667         for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
  3433. 26668                 dn = exp_dn;
  3434. 26669                 sp = cp = *cpp;
  3435. 26670                 while (n = *cp++) {
  3436. 26671                         /*
  3437. 26672                          * check for indirection
  3438. 26673                          */
  3439. 26674                         switch (n & INDIR_MASK) {
  3440. 26675                         case 0:         /* normal case, n == len */
  3441. 26676                                 while (--n >= 0) {
  3442. 26677                                         if (*dn == '.')
  3443. 26678                                                 goto next;
  3444. 26679                                         if (*dn == '\')
  3445. .Op 249 src/lib/ip/res_comp.c
  3446. 26680                                                 dn++;
  3447. 26681                                         if (*dn++ != *cp++)
  3448. 26682                                                 goto next;
  3449. 26683                                 }
  3450. 26684                                 if ((n = *dn++) == '' && *cp == '')
  3451. 26685                                         return (sp - msg);
  3452. 26686                                 if (n == '.')
  3453. 26687                                         continue;
  3454. 26688                                 goto next;
  3455. 26689
  3456. 26690                         default:        /* illegal type */
  3457. 26691                                 return (-1);
  3458. 26692
  3459. 26693                         case INDIR_MASK:        /* indirection */
  3460. 26694                                 cp = msg + (((n & 0x3f) << 8) | *cp);
  3461. 26695                         }
  3462. 26696                 }
  3463. 26697                 if (*dn == '')
  3464. 26698                         return (sp - msg);
  3465. 26699         next:   ;
  3466. 26700         }
  3467. 26701         return (-1);
  3468. 26702 }
  3469. 26704 /*
  3470. 26705  * Routines to insert/extract short/long's. Must account for byte
  3471. 26706  * order and non-alignment problems. This code at least has the
  3472. 26707  * advantage of being portable.
  3473. 26708  *
  3474. 26709  * used by sendmail.
  3475. 26710  */
  3476. 26711
  3477. 26712 u16_t
  3478. 26713 getshort(msgp)
  3479. 26714         CONST u8_t *msgp;
  3480. 26715 {
  3481. 26716         return ((msgp[0] << 8) | (msgp[1] << 0));
  3482. 26717 }
  3483. 26719 u32_t
  3484. 26720 getlong(msgp)
  3485. 26721         CONST u8_t *msgp;
  3486. 26722 {
  3487. 26723         return (  ((u32_t) msgp[0] << 24)
  3488. 26724                 | ((u32_t) msgp[1] << 16)
  3489. 26725                 | ((u32_t) msgp[2] <<  8)
  3490. 26726                 | ((u32_t) msgp[3] <<  0));
  3491. 26727 }
  3492. 26730 void
  3493. 26731 putshort(s, msgp)
  3494. 26732         register U16_t s;
  3495. 26733         register u8_t *msgp;
  3496. 26734 {
  3497. 26735