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

操作系统开发

开发平台:

C/C++

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