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

操作系统开发

开发平台:

C/C++

  1. 37173 #endif
  2. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3. src/lib/other/regsub.c    
  4. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5. 37200 /* regsub
  6. 37201  *
  7. 37202  *      Copyright (c) 1986 by University of Toronto.
  8. 37203  *      Written by Henry Spencer.  Not derived from licensed software.
  9. 37204  *
  10. 37205  *      Permission is granted to anyone to use this software for any
  11. 37206  *      purpose on any computer system, and to redistribute it freely,
  12. 37207  *      subject to the following restrictions:
  13. 37208  *
  14. 37209  *      1. The author is not responsible for the consequences of use of
  15. 37210  *              this software, no matter how awful, even if they arise
  16. 37211  *              from defects in it.
  17. 37212  *
  18. 37213  *      2. The origin of this software must not be misrepresented, either
  19. 37214  *              by explicit claim or by omission.
  20. 37215  *
  21. 37216  *      3. Altered versions must be plainly marked as such, and must not
  22. 37217  *              be misrepresented as being the original software.
  23. 37218  */
  24. 37219
  25. 37220 #include <lib.h>
  26. 37221 #include <string.h>
  27. 37222 #include <regexp.h>
  28. 37223 #include <stdio.h>
  29. 37224
  30. 37225 /* The first byte of the regexp internal "program" is actually this magic
  31. 37226  * number; the start node begins in the second byte.
  32. 37227  */
  33. 37228 #define MAGIC   0234
  34. 37229
  35. 37230 #define CHARBITS 0377
  36. 37231 #ifndef CHARBITS
  37. 37232 #define UCHARAT(p)      ((int)*(unsigned char *)(p))
  38. 37233 #else
  39. 37234 #define UCHARAT(p)      ((int)*(p)&CHARBITS)
  40. 37235 #endif
  41. 37236
  42. 37237 /*
  43. 37238  - regsub - perform substitutions after a regexp match
  44. 37239  */
  45. 37240 void regsub(prog, source, dest)
  46. 37241 regexp *prog;
  47. 37242 char *source;
  48. 37243 char *dest;
  49. 37244 {
  50. 37245   register char *src;
  51. 37246   register char *dst;
  52. 37247   register char c;
  53. 37248   register int no;
  54. 37249   register int len;
  55. 37250
  56. 37251   if (prog == (regexp *)NULL || source == (char *)NULL || dest == (char *)NULL) {
  57. 37252         regerror("NULL parm to regsub");
  58. 37253         return;
  59. 37254   }
  60. 37255   if (UCHARAT(prog->program) != MAGIC) {
  61. 37256         regerror("damaged regexp fed to regsub");
  62. 37257         return;
  63. 37258   }
  64. 37259   src = source;
  65. 37260   dst = dest;
  66. 37261   while ((c = *src++) != '') {
  67. 37262         if (c == '&')
  68. 37263                 no = 0;
  69. 37264         else if (c == '\' && '0' <= *src && *src <= '9')
  70. 37265                 no = *src++ - '0';
  71. 37266         else
  72. 37267                 no = -1;
  73. 37268
  74. 37269         if (no < 0) {           /* Ordinary character. */
  75. 37270                 if (c == '\' && (*src == '\' || *src == '&')) c = *src++;
  76. 37271                 *dst++ = c;
  77. 37272         } else
  78. 37273         if (prog->startp[no] != (char *)NULL && prog->endp[no] != (char *)NULL) {
  79. 37274                 len = (int) (prog->endp[no] - prog->startp[no]);
  80. 37275                 strncpy(dst, prog->startp[no], len);
  81. 37276                 dst += len;
  82. 37277                 if (len != 0 && *(dst - 1) == '') {   /* strncpy hit NUL. */
  83. 37278                         regerror("damaged match string");
  84. 37279                         return;
  85. 37280                 }
  86. 37281         }
  87. 37282   }
  88. 37283   *dst++ = '';
  89. 37284 }
  90. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  91. src/lib/other/rindex.c    
  92. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  93. 37300 #include <lib.h>
  94. 37301 /* rindex - find last occurrence of a character in a string  */
  95. 37302
  96. 37303 #include <string.h>
  97. 37304
  98. 37305 char *rindex(s, charwanted)     /* found char, or NULL if none */
  99. 37306 _CONST char *s;
  100. 37307 char charwanted;
  101. 37308 {
  102. 37309   return(strrchr(s, charwanted));
  103. 37310 }
  104. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  105. src/lib/other/stderr.c    
  106. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  107. 37400 #include <lib.h>
  108. 37401 #include <sys/types.h>
  109. 37402 #include <unistd.h>
  110. 37403
  111. 37404 _PROTOTYPE( void std_err, (char *s));
  112. 37405
  113. 37406 void std_err(s)
  114. 37407 char *s;
  115. 37408 {
  116. 37409   register char *p = s;
  117. 37410
  118. 37411   while (*p != 0) p++;
  119. 37412   write(2, s, (int) (p - s));
  120. 37413 }
  121. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  122. src/lib/other/swab.c    
  123. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  124. 37500 #include <lib.h>
  125. 37501 /*  swab(3)
  126. 37502  *
  127. 37503  *  Author: Terrence W. Holm          Sep. 1988
  128. 37504  */
  129. 37505 _PROTOTYPE( void swab, (char *from, char *to, int count));
  130. 37506
  131. 37507 void swab(from, to, count)
  132. 37508 char *from;
  133. 37509 char *to;
  134. 37510 int count;
  135. 37511 {
  136. 37512   register char temp;
  137. 37513
  138. 37514   count >>= 1;
  139. 37515
  140. 37516   while (--count >= 0) {
  141. 37517         temp = *from++;
  142. 37518         *to++ = *from++;
  143. 37519         *to++ = temp;
  144. 37520   }
  145. 37521 }
  146. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  147. src/lib/other/syscall.c    
  148. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  149. 37600 #include <lib.h>
  150. 37601
  151. 37602 PUBLIC int _syscall(who, syscallnr, msgptr)
  152. 37603 int who;
  153. 37604 int syscallnr;
  154. 37605 register message *msgptr;
  155. 37606 {
  156. 37607   int status;
  157. 37608
  158. 37609   msgptr->m_type = syscallnr;
  159. 37610   status = _sendrec(who, msgptr);
  160. 37611   if (status != 0) {
  161. 37612         /* 'sendrec' itself failed. */
  162. 37613         /* XXX - strerror doesn't know all the codes */
  163. 37614         msgptr->m_type = status;
  164. 37615   }
  165. 37616   if (msgptr->m_type < 0) {
  166. 37617         errno = -msgptr->m_type;
  167. 37618         return(-1);
  168. 37619   }
  169. 37620   return(msgptr->m_type);
  170. 37621 }
  171. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  172. src/lib/other/sysconf.c    
  173. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  174. 37700 /* sysconf.c                                            POSIX 4.8.1
  175. 37701  *      long int sysconf(int name);
  176. 37702  *
  177. 37703  *      POSIX allows some of the values in <limits.h> to be increased at
  178. 37704  *      run time.  The sysconf() function allows such values to be checked
  179. 37705  *      at run time.  MINIX does not use this facility - the run time
  180. 37706  *      limits are those given in <limits.h>.
  181. 37707  */
  182. 37708
  183. 37709 #include <lib.h>
  184. 37710 #include <unistd.h>
  185. 37711 #include <time.h>
  186. 37712
  187. 37713 PUBLIC long int sysconf(name)
  188. 37714 int name;                       /* property being inspected */
  189. 37715 {
  190. 37716   switch(name) {
  191. 37717         case _SC_ARG_MAX:
  192. 37718                 return (long) ARG_MAX;
  193. 37719
  194. 37720         case _SC_CHILD_MAX:
  195. 37721                 return (long) CHILD_MAX;
  196. 37722
  197. 37723         case _SC_CLK_TCK:
  198. 37724                 return (long) CLOCKS_PER_SEC;
  199. 37725
  200. 37726         case _SC_NGROUPS_MAX:
  201. 37727                 return (long) NGROUPS_MAX;
  202. 37728
  203. 37729         case _SC_OPEN_MAX:
  204. 37730                 return (long) OPEN_MAX;
  205. 37731
  206. 37732         case _SC_JOB_CONTROL:
  207. 37733                 return -1L;                     /* no job control */
  208. 37734
  209. 37735         case _SC_SAVED_IDS:
  210. 37736                 return -1L;                     /* no saved uid/gid */
  211. 37737
  212. 37738         case _SC_VERSION:
  213. 37739                 return (long) _POSIX_VERSION;
  214. 37740
  215. 37741         case _SC_STREAM_MAX:
  216. 37742                 return (long) STREAM_MAX;
  217. 37743
  218. 37744         case _SC_TZNAME_MAX:
  219. 37745                 return (long) TZNAME_MAX;
  220. 37746
  221. 37747         default:
  222. 37748                 errno = EINVAL;
  223. 37749                 return -1L;
  224. 37750   }
  225. 37751 }
  226. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  227. src/lib/other/telldir.c    
  228. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  229. 37800 /*      telldir()                                       Author: Kees J. Bot
  230. 37801  *                                                              24 Apr 1989
  231. 37802  */
  232. 37803 #define nil 0
  233. 37804 #include <lib.h>
  234. 37805 #include <sys/types.h>
  235. 37806 #include <dirent.h>
  236. 37807 #include <errno.h>
  237. 37808
  238. 37809 off_t telldir(DIR *dp)
  239. 37810 /* Return the current read position in a directory. */
  240. 37811 {
  241. 37812         if (dp == nil) { errno= EBADF; return -1; }
  242. 37813
  243. 37814         return dp->_pos;
  244. 37815 }
  245. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  246. src/lib/other/termcap.c    
  247. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  248. 37900 /*
  249. 37901  *      termcap.c       V1.1    20/7/87         agc     Joypace Ltd
  250. 37902  *
  251. 37903  *      Copyright Joypace Ltd, London, UK, 1987. All rights reserved.
  252. 37904  *      This file may be freely distributed provided that this notice
  253. 37905  *      remains attached.
  254. 37906  *
  255. 37907  *      A public domain implementation of the termcap(3) routines.
  256. 37908  *
  257. 37909  *
  258. 37910  *
  259. 37911  *       Klamer Schutte       V1.2    Nov. 1988
  260. 37912  *
  261. 37913  *   - Can match multiple terminal names                 [tgetent]
  262. 37914  *   - Removal of **area assignments                     [tgetstr]
  263. 37915  *
  264. 37916  *       Terrence W. Holm     V1.3    May, Sep, Oct.  1988
  265. 37917  *
  266. 37918  *   - Correct when TERM != name and TERMCAP is defined  [tgetent]
  267. 37919  *   - Correct the comparison for the terminal name      [tgetent]
  268. 37920  *   - Correct the value of ^x escapes                   [tgetstr]
  269. 37921  *   - Added %r to reverse row/column                    [tgoto]
  270. 37922  *   - Fixed end of definition test                      [tgetnum/flag/str]
  271. 37923  *
  272. 37924  *       Terrence W. Holm     V1.4    Jan. 1989
  273. 37925  *
  274. 37926  *   - Incorporated Klamer's V1.2 fixes into V1.3
  275. 37927  *   - Added %d, (old %d is now %2)                      [tgoto]
  276. 37928  *   - Allow '#' comments in definition file             [tgetent]
  277. 37929  */
  278. 37930
  279. 37931 #include <lib.h>
  280. 37932 #include <termcap.h>
  281. 37933 #include <ctype.h>
  282. 37934 #include <stdlib.h>
  283. 37935 #include <string.h>
  284. 37936 #include <stdio.h>
  285. 37937
  286. 37938 char *capab = (char *)NULL;             /* the capability itself */
  287. 37939
  288. 37940 #if 0
  289. 37941 /*  The following are not yet used.  */
  290. 37942 extern short ospeed;            /* output speed */
  291. 37943 extern char PC;                 /* padding character */
  292. 37944 extern char *BC;                /* back cursor movement */
  293. 37945 extern char *UP;                /* up cursor movement */
  294. 37946 #endif
  295. 37947
  296. 37948 /*
  297. 37949  *      tgetent - get the termcap entry for terminal name, and put it
  298. 37950  *      in bp (which must be an array of 1024 chars). Returns 1 if
  299. 37951  *      termcap entry found, 0 if not found, and -1 if file not found.
  300. 37952  */
  301. 37953
  302. 37954 int tgetent(bp, name)
  303. 37955 char *bp;
  304. 37956 char *name;
  305. 37957 {
  306. 37958   FILE *fp;
  307. 37959   char *file;
  308. 37960   char *term;
  309. 37961   short len = strlen(name);
  310. 37962
  311. 37963   capab = bp;
  312. 37964
  313. 37965   /* If TERMCAP begins with a '/' then use TERMCAP as the path   */
  314. 37966   /* Name of the termcap definitions file. If TERMCAP is a       */
  315. 37967   /* Definition and TERM equals "name" then use TERMCAP as the   */
  316. 37968   /* Definition. Otherwise use "/etc/termcap" as the path name.  */
  317. 37969
  318. 37970   if ((file = getenv("TERMCAP")) == (char *)NULL)
  319. 37971         file = "/etc/termcap";
  320. 37972   else if (*file != '/')
  321. 37973         if ((term = getenv("TERM")) != (char *)NULL && strcmp(term, name) == 0) {
  322. 37974                 *bp = '';
  323. 37975                 strncat(bp, file, 1023);
  324. 37976                 return(1);
  325. 37977         } else
  326. 37978                 file = "/etc/termcap";
  327. 37979
  328. 37980   if ((fp = fopen(file, "r")) == (FILE *) NULL) {
  329. 37981         capab = (char *)NULL;           /* no valid termcap  */
  330. 37982         return(-1);
  331. 37983   }
  332. 37984   for (;;) {
  333. 37985         /* Read in each definition */
  334. 37986         int def_len = 0;
  335. 37987         char *cp = bp;
  336. 37988
  337. 37989         do {
  338. 37990                 if (fgets(&bp[def_len], (unsigned int)(1024 - def_len), fp) == (char *)NULL) {
  339. 37991                         fclose(fp);
  340. 37992                         capab = (char *)NULL;   /* no valid termcap */
  341. 37993                         return(0);
  342. 37994                 }
  343. 37995                 def_len = strlen(bp) - 2;
  344. 37996         } while (bp[def_len] == '\');
  345. 37997
  346. 37998         while (isspace(*cp)) cp++;
  347. 37999
  348. 38000         /* Comment lines start with a '#'  */
  349. 38001         if (*cp == '#') continue;
  350. 38002
  351. 38003         /* See if any of the terminal names in this definition */
  352. 38004         /* Match "name".                                                 */
  353. 38005
  354. 38006         do {
  355. 38007                 if (strncmp(name, cp, len) == 0 &&
  356. 38008                     (cp[len] == '|' || cp[len] == ':')) {
  357. 38009                         fclose(fp);
  358. 38010                         return(1);
  359. 38011                 }
  360. 38012                 while ((*cp) && (*cp != '|') && (*cp != ':')) cp++;
  361. 38013         } while (*cp++ == '|');
  362. 38014   }
  363. 38015 }
  364. 38018 /*
  365. 38019  *      tgetnum - get the numeric terminal capability corresponding
  366. 38020  *      to id. Returns the value, -1 if invalid.
  367. 38021  */
  368. 38022
  369. 38023 int tgetnum(id)
  370. 38024 char *id;
  371. 38025 {
  372. 38026   register char *cp = capab;
  373. 38027
  374. 38028   if (cp == (char *)NULL || id == (char *)NULL) return(-1);
  375. 38029
  376. 38030   for (;;) {
  377. 38031         while (*cp++ != ':')
  378. 38032                 if (cp[-1] == '') return(-1);
  379. 38033
  380. 38034         while (isspace(*cp)) cp++;
  381. 38035
  382. 38036         if (strncmp(cp, id, 2) == 0 && cp[2] == '#') return(atoi(cp + 3));
  383. 38037   }
  384. 38038 }
  385. 38041 /*
  386. 38042  *      tgetflag - get the boolean flag corresponding to id. Returns -1
  387. 38043  *      if invalid, 0 if the flag is not in termcap entry, or 1 if it is
  388. 38044  *      present.
  389. 38045  */
  390. 38046
  391. 38047 int tgetflag(id)
  392. 38048 char *id;
  393. 38049 {
  394. 38050   register char *cp = capab;
  395. 38051
  396. 38052   if (cp == (char *)NULL || id == (char *)NULL) return(-1);
  397. 38053
  398. 38054   for (;;) {
  399. 38055         while (*cp++ != ':')
  400. 38056                 if (cp[-1] == '') return(0);
  401. 38057
  402. 38058         while (isspace(*cp)) cp++;
  403. 38059
  404. 38060         if (strncmp(cp, id, 2) == 0) return(1);
  405. 38061   }
  406. 38062 }
  407. 38065 /*
  408. 38066  *      tgetstr - get the string capability corresponding to id and place
  409. 38067  *      it in area (advancing area at same time). Expand escape sequences
  410. 38068  *      etc. Returns the string, or NULL if it can't do it.
  411. 38069  */
  412. 38070
  413. 38071 char *tgetstr(id, area)
  414. 38072 char *id;
  415. 38073 char **area;
  416. 38074 {
  417. 38075   register char *cp = capab;
  418. 38076   register char *wsp = *area;   /* workspace pointer  */
  419. 38077
  420. 38078   if (cp == (char *)NULL || id == (char *)NULL) return((char *)NULL);
  421. 38079
  422. 38080   for (;;) {
  423. 38081         while (*cp++ != ':')
  424. 38082                 if (cp[-1] == '') return((char *)NULL);
  425. 38083
  426. 38084         while (isspace(*cp)) cp++;
  427. 38085
  428. 38086         if (strncmp(cp, id, 2) == 0 && cp[2] == '=') {
  429. 38087                 for (cp += 3; *cp && *cp != ':'; wsp++, cp++) switch (*cp) {
  430. 38088                             case '^':
  431. 38089                                 *wsp = *++cp - '@';
  432. 38090                                 break;
  433. 38091
  434. 38092                             case '\':
  435. 38093                                 switch (*++cp) {
  436. 38094                                     case 'E':
  437. 38095                                         *wsp = '33';
  438. 38096                                         break;
  439. 38097                                     case 'n':
  440. 38098                                         *wsp = 'n';
  441. 38099                                         break;
  442. 38100                                     case 'r':
  443. 38101                                         *wsp = 'r';
  444. 38102                                         break;
  445. 38103                                     case 't':
  446. 38104                                         *wsp = 't';
  447. 38105                                         break;
  448. 38106                                     case 'b':
  449. 38107                                         *wsp = 'b';
  450. 38108                                         break;
  451. 38109                                     case 'f':
  452. 38110                                         *wsp = 'f';
  453. 38111                                         break;
  454. 38112                                     case '0':
  455. 38113                                     case '1':
  456. 38114                                     case '2':
  457. 38115                                     case '3':
  458. 38116                                         {
  459. 38117                                                 int i;
  460. 38118                                                 int t = 0;
  461. 38119                                                 for (i = 0; i < 3 &&
  462. 38120                                                      isdigit(*cp); ++i, ++cp)
  463. 38121                                                         t = t * 8 + *cp - '0';
  464. 38122                                                 *wsp = t;
  465. 38123                                                 cp--;
  466. 38124                                                 break;
  467. 38125                                         }
  468. 38126                                     default:
  469. 38127                                         *wsp = *cp;
  470. 38128                                 }
  471. 38129                                 break;
  472. 38130
  473. 38131                             default:    *wsp = *cp;
  474. 38132                         }
  475. 38133
  476. 38134                 *wsp++ = '';
  477. 38135
  478. 38136                 {
  479. 38137                         char *ret = *area;
  480. 38138                         *area = wsp;
  481. 38139                         return(ret);
  482. 38140                 }
  483. 38141         }
  484. 38142   }                             /* end for(;;) */
  485. 38143 }
  486. 38147 /*
  487. 38148  *      tgoto - given the cursor motion string cm, make up the string
  488. 38149  *      for the cursor to go to (destcol, destline), and return the string.
  489. 38150  *      Returns "OOPS" if something's gone wrong, or the string otherwise.
  490. 38151  */
  491. 38152
  492. 38153 char *tgoto(cm, destcol, destline)
  493. 38154 char *cm;
  494. 38155 int destcol;
  495. 38156 int destline;
  496. 38157 {
  497. 38158   PRIVATE char ret[24];
  498. 38159   char *rp = ret;
  499. 38160   int incr = 0;
  500. 38161   int argno = 0;
  501. 38162   int numval;
  502. 38163
  503. 38164   for (; *cm; cm++) {
  504. 38165         if (*cm == '%') {
  505. 38166                 switch (*++cm) {
  506. 38167                     case 'i':   incr = 1;                               break;
  507. 38168
  508. 38169                     case 'r':   argno = 1;                              break;
  509. 38170
  510. 38171                     case '+':
  511. 38172                         numval = (argno == 0 ? destline : destcol);
  512. 38173                         *rp++ = numval + incr + *++cm;
  513. 38174                         argno = 1 - argno;
  514. 38175                         break;
  515. 38176
  516. 38177                     case '2':
  517. 38178                         numval = (argno == 0 ? destline : destcol);
  518. 38179                         numval = (numval + incr) % 100;
  519. 38180                         *rp++ = '0' + (numval / 10);
  520. 38181                         *rp++ = '0' + (numval % 10);
  521. 38182                         argno = 1 - argno;
  522. 38183                         break;
  523. 38184
  524. 38185                     case 'd':
  525. 38186                         numval = (argno == 0 ? destline : destcol);
  526. 38187                         numval = (numval + incr) % 1000;
  527. 38188                         if (numval > 99) *rp++ = '0' + (numval / 100);
  528. 38189                         if (numval > 9) *rp++ = '0' + (numval / 10) % 10;
  529. 38190                         *rp++ = '0' + (numval % 10);
  530. 38191                         argno = 1 - argno;
  531. 38192                         break;
  532. 38193
  533. 38194                     case '%':   *rp++ = '%';                            break;
  534. 38195
  535. 38196                     default:    return("OOPS");
  536. 38197                 }
  537. 38198
  538. 38199         } else
  539. 38200                 *rp++ = *cm;
  540. 38201   }
  541. 38202
  542. 38203   *rp = '';
  543. 38204   return(ret);
  544. 38205 }
  545. 38209 /*
  546. 38210  *      tputs - put the string cp out onto the terminal, using the function
  547. 38211  *      outc. This should do padding for the terminal, but I can't find a
  548. 38212  *      terminal that needs padding at the moment...
  549. 38213  */
  550. 38214
  551. 38215 int tputs(cp, affcnt, outc)
  552. 38216 register char *cp;
  553. 38217 int affcnt;
  554. 38218 _PROTOTYPE( void (*outc), (int ch));
  555. 38219 {
  556. 38220   if (cp == (char *)NULL) return(1);
  557. 38221   /* Do any padding interpretation - left null for MINIX just now */
  558. 38222   while (*cp) (*outc) (*cp++);
  559. 38223   return(1);
  560. 38224 }
  561. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  562. src/lib/other/ttyname.c    
  563. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  564. 38300 /* ttyname.c                                            POSIX 4.7.2
  565. 38301  *      char *ttyname(int fildes);
  566. 38302  *
  567. 38303  *      Determines name of a terminal device.
  568. 38304  */
  569. 38305
  570. 38306 #include <lib.h>
  571. 38307 #include <sys/stat.h>
  572. 38308 #include <dirent.h>
  573. 38309 #include <fcntl.h>
  574. 38310 #include <stddef.h>
  575. 38311 #include <string.h>
  576. 38312 #include <unistd.h>
  577. 38313
  578. 38314 PRIVATE char base[] = "/dev";
  579. 38315 PRIVATE char path[sizeof(base) + 1 + NAME_MAX]; /* extra 1 for '/' */
  580. 38316
  581. 38317 PUBLIC char *ttyname(fildes)
  582. 38318 int fildes;
  583. 38319 {
  584. 38320   DIR *devices;
  585. 38321   struct dirent *entry;
  586. 38322   struct stat tty_stat;
  587. 38323   struct stat dev_stat;
  588. 38324
  589. 38325   /* Simple first test: file descriptor must be a character device */
  590. 38326   if (fstat(fildes, &tty_stat) < 0 || !S_ISCHR(tty_stat.st_mode))
  591. 38327         return (char *) NULL;
  592. 38328
  593. 38329   /* Open device directory for reading  */
  594. 38330   if ((devices = opendir(base)) == (DIR *) NULL)
  595. 38331         return (char *) NULL;
  596. 38332
  597. 38333   /* Scan the entries for one that matches perfectly */
  598. 38334   while ((entry = readdir(devices)) != (struct dirent *) NULL) {
  599. 38335         if (tty_stat.st_ino != entry->d_ino)
  600. 38336                 continue;
  601. 38337         strcpy(path, base);
  602. 38338         strcat(path, "/");
  603. 38339         strcat(path, entry->d_name);
  604. 38340         if (stat(path, &dev_stat) < 0 || !S_ISCHR(dev_stat.st_mode))
  605. 38341                 continue;
  606. 38342         if (tty_stat.st_ino == dev_stat.st_ino &&
  607. 38343             tty_stat.st_dev == dev_stat.st_dev &&
  608. 38344             tty_stat.st_rdev == dev_stat.st_rdev) {
  609. 38345                 closedir(devices);
  610. 38346                 return path;
  611. 38347         }
  612. 38348   }
  613. 38349
  614. 38350   closedir(devices);
  615. 38351   return (char *) NULL;
  616. 38352 }
  617. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  618. src/lib/other/ttyslot.c    
  619. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  620. 38400 /*
  621. 38401 ttyslot.c
  622. 38402
  623. 38403 Return the index in the utmp file for the current user's terminal. The 
  624. 38404 current user's terminal is the first file descriptor in the range 0..2
  625. 38405 for which ttyname() returns a name. The index is the line number in the
  626. 38406 /etc/ttytab file. 0 will be returned in case of an error.
  627. 38407
  628. 38408 Created:        Oct 11, 1992 by Philip Homburg
  629. 38409 */
  630. 38410
  631. 38411 #define _MINIX_SOURCE
  632. 38412
  633. 38413 #include <sys/types.h>
  634. 38414 #include <ttyent.h>
  635. 38415 #include <string.h>
  636. 38416 #include <unistd.h>
  637. 38417
  638. 38418 int ttyslot()
  639. 38419 {
  640. 38420         int slot;
  641. 38421
  642. 38422         slot= fttyslot(0);
  643. 38423         if (slot == 0) slot= fttyslot(1);
  644. 38424         if (slot == 0) slot= fttyslot(2);
  645. 38425         return slot;
  646. 38426 }
  647. 38428 int fttyslot(fd)
  648. 38429 int fd;
  649. 38430 {
  650. 38431         char *tname;
  651. 38432         int lineno;
  652. 38433         struct ttyent *ttyp;
  653. 38434
  654. 38435         tname= ttyname(fd);
  655. 38436         if (tname == NULL) return 0;
  656. 38437
  657. 38438         /* Assume that tty devices are in /dev */
  658. 38439         if (strncmp(tname, "/dev/", 5) != 0)
  659. 38440                 return 0;       /* Malformed tty name. */
  660. 38441         tname += 5;
  661. 38442
  662. 38443         /* Scan /etc/ttytab. */
  663. 38444         lineno= 1;
  664. 38445         while ((ttyp= getttyent()) != NULL)
  665. 38446         {
  666. 38447                 if (strcmp(tname, ttyp->ty_name) == 0)
  667. 38448                 {
  668. 38449                         endttyent();
  669. 38450                         return lineno;
  670. 38451                 }
  671. 38452                 lineno++;
  672. 38453         }
  673. 38454         /* No match */
  674. 38455         endttyent();
  675. 38456         return 0;
  676. 38457 }
  677. 38459 /*
  678. 38460  * $PchHeader: /mount/hd2/minix/lib/misc/RCS/ttyslot.c,v 1.3 1994/12/22 13:49:12 philip Exp $
  679. 38461  */
  680. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  681. src/lib/posix/__exit.c    
  682. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  683. 38500 #define _exit   __exit
  684. 38501 #include <lib.h>
  685. 38502 #include <unistd.h>
  686. 38503
  687. 38504 PUBLIC void _exit(status)
  688. 38505 int status;
  689. 38506 {
  690. 38507   message m;
  691. 38508
  692. 38509   m.m1_i1 = status;
  693. 38510   _syscall(MM, EXIT, &m);
  694. 38511 }
  695. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  696. src/lib/posix/_access.c    
  697. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  698. 38600 #include <lib.h>
  699. 38601 #define access  _access
  700. 38602 #include <unistd.h>
  701. 38603
  702. 38604 PUBLIC int access(name, mode)
  703. 38605 _CONST char *name;
  704. 38606 int mode;
  705. 38607 {
  706. 38608   message m;
  707. 38609
  708. 38610   m.m3_i2 = mode;
  709. 38611   _loadname(name, &m);
  710. 38612   return(_syscall(FS, ACCESS, &m));
  711. 38613 }
  712. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  713. src/lib/posix/_alarm.c    
  714. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  715. 38700 #include <lib.h>
  716. 38701 #define alarm   _alarm
  717. 38702 #include <unistd.h>
  718. 38703
  719. 38704 PUBLIC unsigned int alarm(sec)
  720. 38705 unsigned int sec;
  721. 38706 {
  722. 38707   message m;
  723. 38708
  724. 38709   m.m1_i1 = (int) sec;
  725. 38710   return( (unsigned) _syscall(MM, ALARM, &m));
  726. 38711 }
  727. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  728. src/lib/posix/_cfgetispeed.c    
  729. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  730. 38800 /*
  731. 38801 posix/_cfgetispeed
  732. 38802
  733. 38803 Created:        June 11, 1993 by Philip Homburg
  734. 38804 */
  735. 38805
  736. 38806 #include <termios.h>
  737. 38807
  738. 38808 speed_t _cfgetispeed(const struct termios *termios_p)
  739. 38809 {
  740. 38810   return termios_p->c_ispeed;
  741. 38811 }
  742. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  743. src/lib/posix/_cfgetospeed.c    
  744. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  745. 38900 /*
  746. 38901 posix/_cfgetospeed
  747. 38902
  748. 38903 Created:        June 11, 1993 by Philip Homburg
  749. 38904 */
  750. 38905
  751. 38906 #include <termios.h>
  752. 38907
  753. 38908 speed_t _cfgetospeed(const struct termios *termios_p)
  754. 38909 {
  755. 38910   return termios_p->c_ospeed;
  756. 38911 }
  757. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  758. src/lib/posix/_cfsetispeed.c    
  759. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  760. 39000 /*
  761. 39001 posix/_cfsetispeed
  762. 39002
  763. 39003 Created:        June 11, 1993 by Philip Homburg
  764. 39004 */
  765. 39005
  766. 39006 #include <termios.h>
  767. 39007
  768. 39008 int _cfsetispeed(struct termios *termios_p, speed_t speed)
  769. 39009 {
  770. 39010   termios_p->c_ispeed= speed;
  771. 39011   return 0;
  772. 39012 }
  773. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  774. src/lib/posix/_cfsetospeed.c    
  775. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  776. 39100 /*
  777. 39101 posix/_cfsetospeed
  778. 39102
  779. 39103 Created:        June 11, 1993 by Philip Homburg
  780. 39104 */
  781. 39105
  782. 39106 #include <termios.h>
  783. 39107
  784. 39108 int _cfsetospeed(struct termios *termios_p, speed_t speed)
  785. 39109 {
  786. 39110   termios_p->c_ospeed= speed;
  787. 39111   return 0;
  788. 39112 }
  789. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  790. src/lib/posix/_chdir.c    
  791. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  792. 39200 #include <lib.h>
  793. 39201 #define chdir   _chdir
  794. 39202 #include <unistd.h>
  795. 39203
  796. 39204 PUBLIC int chdir(name)
  797. 39205 _CONST char *name;
  798. 39206 {
  799. 39207   message m;
  800. 39208
  801. 39209   _loadname(name, &m);
  802. 39210   return(_syscall(FS, CHDIR, &m));
  803. 39211 }
  804. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  805. src/lib/posix/_chmod.c    
  806. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  807. 39300 #include <lib.h>
  808. 39301 #define chmod   _chmod
  809. 39302 #include <sys/stat.h>
  810. 39303
  811. 39304 PUBLIC int chmod(name, mode)
  812. 39305 _CONST char *name;
  813. 39306 Mode_t mode;
  814. 39307 {
  815. 39308   message m;
  816. 39309
  817. 39310   m.m3_i2 = mode;
  818. 39311   _loadname(name, &m);
  819. 39312   return(_syscall(FS, CHMOD, &m));
  820. 39313 }
  821. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  822. src/lib/posix/_chown.c    
  823. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  824. 39400 #include <lib.h>
  825. 39401 #define chown   _chown
  826. 39402 #include <string.h>
  827. 39403 #include <unistd.h>
  828. 39404
  829. 39405 PUBLIC int chown(name, owner, grp)
  830. 39406 _CONST char *name;
  831. 39407 Uid_t owner;
  832. 39408 Gid_t grp;
  833. 39409 {
  834. 39410   message m;
  835. 39411
  836. 39412   m.m1_i1 = strlen(name) + 1;
  837. 39413   m.m1_i2 = owner;
  838. 39414   m.m1_i3 = grp;
  839. 39415   m.m1_p1 = (char *) name;
  840. 39416   return(_syscall(FS, CHOWN, &m));
  841. 39417 }
  842. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  843. src/lib/posix/_chroot.c    
  844. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  845. 39500 #include <lib.h>
  846. 39501 #define chroot  _chroot
  847. 39502 #include <unistd.h>
  848. 39503
  849. 39504 PUBLIC int chroot(name)
  850. 39505 _CONST char *name;
  851. 39506 {
  852. 39507   message m;
  853. 39508
  854. 39509   _loadname(name, &m);
  855. 39510   return(_syscall(FS, CHROOT, &m));
  856. 39511 }
  857. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  858. src/lib/posix/_close.c    
  859. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  860. 39600 #include <lib.h>
  861. 39601 #define close   _close
  862. 39602 #include <unistd.h>
  863. 39603
  864. 39604 PUBLIC int close(fd)
  865. 39605 int fd;
  866. 39606 {
  867. 39607   message m;
  868. 39608
  869. 39609   m.m1_i1 = fd;
  870. 39610   return(_syscall(FS, CLOSE, &m));
  871. 39611 }
  872. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  873. src/lib/posix/_closedir.c    
  874. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  875. 39700 /*      closedir()                                      Author: Kees J. Bot
  876. 39701  *                                                              24 Apr 1989
  877. 39702  */
  878. 39703 #define nil 0
  879. 39704 #include <lib.h>
  880. 39705 #define close   _close
  881. 39706 #define closedir _closedir
  882. 39707 #include <sys/types.h>
  883. 39708 #include <dirent.h>
  884. 39709 #include <unistd.h>
  885. 39710 #include <stdlib.h>
  886. 39711 #include <errno.h>
  887. 39712
  888. 39713 int closedir(DIR *dp)
  889. 39714 /* Finish reading a directory. */
  890. 39715 {
  891. 39716         int d;
  892. 39717
  893. 39718         if (dp == nil) { errno= EBADF; return -1; }
  894. 39719
  895. 39720         d= dp->_fd;
  896. 39721         free((void *) dp);
  897. 39722         return close(d);
  898. 39723 }
  899. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  900. src/lib/posix/_creat.c    
  901. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  902. 39800 #include <lib.h>
  903. 39801 #define creat   _creat
  904. 39802 #include <fcntl.h>
  905. 39803
  906. 39804 PUBLIC int creat(name, mode)
  907. 39805 _CONST char *name;
  908. 39806 Mode_t mode;
  909. 39807 {
  910. 39808   message m;
  911. 39809
  912. 39810   m.m3_i2 = mode;
  913. 39811   _loadname(name, &m);
  914. 39812   return(_syscall(FS, CREAT, &m));
  915. 39813 }
  916. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  917. src/lib/posix/_dup.c    
  918. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  919. 39900 #include <lib.h>
  920. 39901 #define dup     _dup
  921. 39902 #define fcntl   _fcntl
  922. 39903 #include <fcntl.h>
  923. 39904 #include <unistd.h>
  924. 39905
  925. 39906 PUBLIC int dup(fd)
  926. 39907 int fd;
  927. 39908 {
  928. 39909   return(fcntl(fd, F_DUPFD, 0));
  929. 39910 }
  930. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  931. src/lib/posix/_dup2.c    
  932. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  933. 40000 #include <lib.h>
  934. 40001 #define close   _close
  935. 40002 #define dup2    _dup2
  936. 40003 #define fcntl   _fcntl
  937. 40004 #include <fcntl.h>
  938. 40005 #include <unistd.h>
  939. 40006
  940. 40007 PUBLIC int dup2(fd, fd2)
  941. 40008 int fd, fd2;
  942. 40009 {
  943. 40010 /* The behavior of dup2 is defined by POSIX in 6.2.1.2 as almost, but not
  944. 40011  * quite the same as fcntl.
  945. 40012  */
  946. 40013
  947. 40014   if (fd2 < 0 || fd2 > OPEN_MAX) {
  948. 40015         errno = EBADF;
  949. 40016         return(-1);
  950. 40017   }
  951. 40018
  952. 40019   /* Check to see if fildes is valid. */
  953. 40020   if (fcntl(fd, F_GETFL) < 0) {
  954. 40021         /* 'fd' is not valid. */
  955. 40022         return(-1);
  956. 40023   } else {
  957. 40024         /* 'fd' is valid. */
  958. 40025         if (fd == fd2) return(fd2);
  959. 40026         close(fd2);
  960. 40027         return(fcntl(fd, F_DUPFD, fd2));
  961. 40028   }
  962. 40029 }
  963. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  964. src/lib/posix/_exec.c    
  965. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  966. 40100 #include <lib.h>
  967. 40101 #define execl   _execl
  968. 40102 #define execle  _execle
  969. 40103 #define execv   _execv
  970. 40104 #define execve  _execve
  971. 40105 #define sbrk    _sbrk
  972. 40106 #include <minix/minlib.h>
  973. 40107 #include <stdarg.h>
  974. 40108 #include <string.h>
  975. 40109 #include <unistd.h>
  976. 40110
  977. 40111 extern char **environ;
  978. 40112
  979. 40113 #define PTRSIZE (sizeof(char *))
  980. 40114
  981. 40115 #ifdef _ANSI
  982. 40116 PUBLIC int execl(const char *name, const char *arg, ...)
  983. 40117 #else
  984. 40118 PUBLIC int execl(name)
  985. 40119 char *name;
  986. 40120 #endif
  987. 40121 {
  988. 40122   va_list argp;
  989. 40123   int result;
  990. 40124
  991. 40125   va_start(argp, name);
  992. 40126
  993. 40127   /* The following cast of argp is not portable.  Doing it right by copying
  994. 40128    * the args to a true array will cost as much as ARG_MAX bytes of space.
  995. 40129    */
  996. 40130   result = execve(name, (char **) argp, environ);
  997. 40131   va_end(argp);
  998. 40132   return(result);
  999. 40133 }
  1000. 40136 #ifdef _ANSI
  1001. 40137 PUBLIC int execle(const char *name, const char *arg, ...)
  1002. 40138 #else
  1003. 40139 PUBLIC int execle(name)
  1004. 40140 char *name;
  1005. 40141 #endif
  1006. 40142 {
  1007. 40143   va_list argp;
  1008. 40144   char **p;
  1009. 40145   int result;
  1010. 40146
  1011. 40147   va_start(argp, name);
  1012. 40148   
  1013. 40149   /* The following cast of argp is not portable, as for execl(). */
  1014. 40150   p = (char **) argp;
  1015. 40151   while (*p++ != NIL_PTR)
  1016. 40152         ;                       /* null statement */
  1017. 40153   result = execve(name, (char **) argp, (char **) *p);
  1018. 40154   va_end(argp);
  1019. 40155   return(result);
  1020. 40156 }
  1021. 40159 PUBLIC int execv(name, argv)
  1022. 40160 _CONST char *name;
  1023. 40161 char * _CONST argv[];
  1024. 40162 {
  1025. 40163   return(execve(name, argv, environ));
  1026. 40164 }
  1027. 40167 PUBLIC int execve(path, argv, envp)
  1028. 40168 _CONST char *path;              /* pointer to name of file to be executed */
  1029. 40169 char * _CONST argv[];           /* pointer to argument array */
  1030. 40170 char * _CONST envp[];           /* pointer to environment */
  1031. 40171 {
  1032. 40172   int i, j;
  1033. 40173
  1034. 40174   /* Count the argument pointers and environment pointers. */
  1035. 40175   i = 0;
  1036. 40176   if (argv != NULL)
  1037. 40177   {
  1038. 40178         while (argv[i] != NULL) i++;
  1039. 40179   }
  1040. 40180   j = 0;
  1041. 40181   if (envp != NULL)
  1042. 40182   {
  1043. 40183         while (envp[j] != NULL) j++;
  1044. 40184   }
  1045. 40185
  1046. 40186   return(__execve(path, argv, envp, i, j));
  1047. 40187 }
  1048. 40190 PUBLIC int __execve(path, argv, envp, nargs, nenvps)
  1049. 40191 _CONST char *path;              /* pointer to name of file to be executed */
  1050. 40192 char * _CONST argv[];           /* pointer to argument array */
  1051. 40193 char * _CONST envp[];           /* pointer to environment */
  1052. 40194 int nargs;                      /* number of args */
  1053. 40195 int nenvps;                     /* number of environment strings */
  1054. 40196 {
  1055. 40197 /* This is split off from execve to be called from execvp, so execvp does not
  1056. 40198  * have to allocate up to ARG_MAX bytes just to prepend "sh" to the arg array.
  1057. 40199  */
  1058. 40200
  1059. 40201   char *hp, **ap, *p;
  1060. 40202   int i, stackbytes, npointers, overflow, temp;
  1061. 40203   char *stack;
  1062. 40204   message m;
  1063. 40205
  1064. 40206   /* Decide how big a stack is needed. Be paranoid about overflow. */
  1065. 40207   overflow = FALSE;
  1066. 40208   npointers = 1 + nargs + 1 + nenvps + 1;       /* 1's for argc and NULLs */
  1067. 40209   stackbytes = nargs + nenvps;          /* 1 byte for each null in strings */
  1068. 40210   if (nargs < 0 || nenvps < 0 || stackbytes < nargs || npointers < stackbytes)
  1069. 40211         overflow = TRUE;
  1070. 40212   for (i = PTRSIZE; i != 0; i--) {
  1071. 40213         temp = stackbytes + npointers;
  1072. 40214         if (temp < stackbytes) overflow = TRUE;
  1073. 40215         stackbytes = temp;
  1074. 40216   }
  1075. 40217   ap = (char **) argv;
  1076. 40218   for (i = 0; i < nargs; i++) {
  1077. 40219         temp = stackbytes + strlen(*ap++);
  1078. 40220         if (temp < stackbytes) overflow = TRUE;
  1079. 40221         stackbytes = temp;
  1080. 40222   }
  1081. 40223   ap = (char **) envp;
  1082. 40224   for (i = 0; i < nenvps; i++) {
  1083. 40225         temp = stackbytes + strlen(*ap++);
  1084. 40226         if (temp < stackbytes) overflow = TRUE;
  1085. 40227         stackbytes = temp;
  1086. 40228   }
  1087. 40229   temp = stackbytes + PTRSIZE - 1;
  1088. 40230   if (temp < stackbytes) overflow = TRUE;
  1089. 40231   stackbytes = (temp / PTRSIZE) * PTRSIZE;
  1090. 40232
  1091. 40233   /* Check for overflow before committing sbrk. */
  1092. 40234   if (overflow) {
  1093. 40235         errno = E2BIG;
  1094. 40236         return(-1);
  1095. 40237   }
  1096. 40238
  1097. 40239   /* Allocate the stack. */
  1098. 40240   stack = sbrk(stackbytes);
  1099. 40241   if (stack == (char *) -1) {
  1100. 40242         errno = E2BIG;
  1101. 40243         return(-1);
  1102. 40244   }
  1103. 40245
  1104. 40246   /* Prepare the stack vector and argc. */
  1105. 40247   ap = (char **) stack;
  1106. 40248   hp = &stack[npointers * PTRSIZE];
  1107. 40249   *ap++ = (char *) nargs;
  1108. 40250
  1109. 40251   /* Prepare the argument pointers and strings. */
  1110. 40252   for (i = 0; i < nargs; i++) {
  1111. 40253         *ap++ = (char *) (hp - stack);
  1112. 40254         p = *argv++;
  1113. 40255         while ( (*hp++ = *p++) != 0)
  1114. 40256                 ;
  1115. 40257   }
  1116. 40258   *ap++ = (char *) NULL;
  1117. 40259
  1118. 40260   /* Prepare the environment pointers and strings. */
  1119. 40261   for (i = 0; i < nenvps; i++) {
  1120. 40262         *ap++ = (char *) (hp - stack);
  1121. 40263         p = *envp++;
  1122. 40264         while ( (*hp++ = *p++) != 0)
  1123. 40265                 ;
  1124. 40266   }
  1125. 40267   *ap++ = (char *) NULL;
  1126. 40268
  1127. 40269   /* Do the real work. */
  1128. 40270   m.m1_i1 = strlen(path) + 1;
  1129. 40271   m.m1_i2 = stackbytes;
  1130. 40272   m.m1_p1 = (char *) path;
  1131. 40273   m.m1_p2 = stack;
  1132. 40274   (void) _syscall(MM, EXEC, &m);
  1133. 40275
  1134. 40276   /* The exec failed. */
  1135. 40277   sbrk(-stackbytes);
  1136. 40278   return(m.m_type);
  1137. 40279 }
  1138. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1139. src/lib/posix/_execn.c    
  1140. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1141. 40300 #include <lib.h>
  1142. 40301 #include <string.h>
  1143. 40302
  1144. 40303 #define PTRSIZE sizeof(char *)
  1145. 40304 _PROTOTYPE( int _execn, (char * name));
  1146. 40305
  1147. 40306 PUBLIC int _execn(name)
  1148. 40307 char *name;                     /* pointer to file to be exec'd */
  1149. 40308 {
  1150. 40309 /* Special version used when there are no args and no environment.  This call
  1151. 40310  * is principally used by INIT, to avoid having to allocate ARG_MAX.
  1152. 40311  */
  1153. 40312
  1154. 40313   PRIVATE char stack[3 * PTRSIZE];
  1155. 40314   message m;
  1156. 40315
  1157. 40316   m.m1_i1 = strlen(name) + 1;
  1158. 40317   m.m1_i2 = sizeof(stack);
  1159. 40318   m.m1_p1 = name;
  1160. 40319   m.m1_p2 = stack;
  1161. 40320   (void) _syscall(MM, EXEC, &m);
  1162. 40321 }
  1163. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1164. src/lib/posix/_fcntl.c    
  1165. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1166. 40400 #include <lib.h>
  1167. 40401 #define fcntl _fcntl
  1168. 40402 #include <fcntl.h>
  1169. 40403 #include <stdarg.h>
  1170. 40404
  1171. 40405 #if _ANSI
  1172. 40406 PUBLIC int fcntl(int fd, int cmd, ...)
  1173. 40407 #else
  1174. 40408 PUBLIC int fcntl(fd, cmd)
  1175. 40409 int fd;
  1176. 40410 int cmd;
  1177. 40411 #endif
  1178. 40412 {
  1179. 40413   va_list argp;
  1180. 40414   message m;
  1181. 40415
  1182. 40416   va_start(argp, cmd);
  1183. 40417
  1184. 40418   /* Set up for the sensible case where there is no variable parameter.  This
  1185. 40419    * covers F_GETFD, F_GETFL and invalid commands.
  1186. 40420    */
  1187. 40421   m.m1_i3 = 0;
  1188. 40422   m.m1_p1 = NIL_PTR;
  1189. 40423
  1190. 40424   /* Adjust for the stupid cases. */
  1191. 40425   switch(cmd) {
  1192. 40426      case F_DUPFD:
  1193. 40427      case F_SETFD:
  1194. 40428      case F_SETFL:
  1195. 40429         m.m1_i3 = va_arg(argp, int);
  1196. 40430         break;
  1197. 40431      case F_GETLK:
  1198. 40432      case F_SETLK:
  1199. 40433      case F_SETLKW:
  1200. 40434         m.m1_p1 = (char *) va_arg(argp, struct flock *);
  1201. 40435         break;
  1202. 40436   }
  1203. 40437
  1204. 40438   /* Clean up and make the system call. */
  1205. 40439   va_end(argp);
  1206. 40440   m.m1_i1 = fd;
  1207. 40441   m.m1_i2 = cmd;
  1208. 40442   return(_syscall(FS, FCNTL, &m));
  1209. 40443 }
  1210. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1211. src/lib/posix/_fork.c    
  1212. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1213. 40500 #include <lib.h>
  1214. 40501 #define fork    _fork
  1215. 40502 #include <unistd.h>
  1216. 40503
  1217. 40504 PUBLIC pid_t fork()
  1218. 40505 {
  1219. 40506   message m;
  1220. 40507
  1221. 40508   return(_syscall(MM, FORK, &m));
  1222. 40509 }
  1223. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1224. src/lib/posix/_fpathconf.c    
  1225. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1226. 40600 /* POSIX fpathconf (Sec. 5.7.1)                 Author: Andy Tanenbaum */
  1227. 40601
  1228. 40602 #include <lib.h>
  1229. 40603 #define fstat           _fstat
  1230. 40604 #define fpathconf       _fpathconf
  1231. 40605 #include <sys/stat.h>
  1232. 40606 #include <errno.h>
  1233. 40607 #include <limits.h>
  1234. 40608 #include <unistd.h>
  1235. 40609 #include <termios.h>
  1236. 40610
  1237. 40611 PUBLIC long fpathconf(fd, name)
  1238. 40612 int fd;                         /* file descriptor being interrogated */
  1239. 40613 int name;                       /* property being inspected */
  1240. 40614 {
  1241. 40615 /* POSIX allows some of the values in <limits.h> to be increased at
  1242. 40616  * run time.  The pathconf and fpathconf functions allow these values
  1243. 40617  * to be checked at run time.  MINIX does not use this facility.
  1244. 40618  * The run-time limits are those given in <limits.h>.
  1245. 40619  */
  1246. 40620
  1247. 40621   struct stat stbuf;
  1248. 40622
  1249. 40623   switch(name) {
  1250. 40624         case _PC_LINK_MAX:
  1251. 40625                 /* Fstat the file.  If that fails, return -1. */
  1252. 40626                 if (fstat(fd, &stbuf) != 0) return(-1);
  1253. 40627                 if (S_ISDIR(stbuf.st_mode))
  1254. 40628                         return(1L);     /* no links to directories */
  1255. 40629                 else
  1256. 40630                         return( (long) LINK_MAX);
  1257. 40631
  1258. 40632         case _PC_MAX_CANON:
  1259. 40633                 return( (long) MAX_CANON);
  1260. 40634
  1261. 40635         case _PC_MAX_INPUT:
  1262. 40636                 return( (long) MAX_INPUT);
  1263. 40637
  1264. 40638         case _PC_NAME_MAX:
  1265. 40639                 return( (long) NAME_MAX);
  1266. 40640
  1267. 40641         case _PC_PATH_MAX:
  1268. 40642                 return( (long) PATH_MAX);
  1269. 40643
  1270. 40644         case _PC_PIPE_BUF:
  1271. 40645                 return( (long) PIPE_BUF);
  1272. 40646
  1273. 40647         case _PC_CHOWN_RESTRICTED:
  1274. 40648                 return( (long) _POSIX_CHOWN_RESTRICTED);
  1275. 40649
  1276. 40650         case _PC_NO_TRUNC:
  1277. 40651                 return( (long) _POSIX_NO_TRUNC);
  1278. 40652
  1279. 40653         case _PC_VDISABLE:
  1280. 40654                 return( (long) _POSIX_VDISABLE);
  1281. 40655
  1282. 40656         default:
  1283. 40657                 errno = EINVAL;
  1284. 40658                 return(-1);
  1285. 40659   }
  1286. 40660 }
  1287. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1288. src/lib/posix/_fstat.c    
  1289. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1290. 40700 #include <lib.h>
  1291. 40701 #define fstat   _fstat
  1292. 40702 #include <sys/stat.h>
  1293. 40703
  1294. 40704 PUBLIC int fstat(fd, buffer)
  1295. 40705 int fd;
  1296. 40706 struct stat *buffer;
  1297. 40707 {
  1298. 40708   message m;
  1299. 40709
  1300. 40710   m.m1_i1 = fd;
  1301. 40711   m.m1_p1 = (char *) buffer;
  1302. 40712   return(_syscall(FS, FSTAT, &m));
  1303. 40713 }
  1304. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1305. src/lib/posix/_getcwd.c    
  1306. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1307. 40800 /*      getcwd() - get the name of the current working directory.
  1308. 40801  *                                                      Author: Kees J. Bot
  1309. 40802  *                                                              30 Apr 1989
  1310. 40803  */
  1311. 40804 #define nil 0
  1312. 40805 #define chdir _chdir
  1313. 40806 #define closedir _closedir
  1314. 40807 #define getcwd _getcwd
  1315. 40808 #define opendir _opendir
  1316. 40809 #define readdir _readdir
  1317. 40810 #define rewinddir _rewinddir
  1318. 40811 #define stat _stat
  1319. 40812 #include <sys/types.h>
  1320. 40813 #include <sys/stat.h>
  1321. 40814 #include <errno.h>
  1322. 40815 #include <unistd.h>
  1323. 40816 #include <dirent.h>
  1324. 40817 #include <limits.h>
  1325. 40818 #include <string.h>
  1326. 40819
  1327. 40820 static int addpath(const char *path, char **ap, const char *entry)
  1328. 40821 /* Add the name of a directory entry at the front of the path being built.
  1329. 40822  * Note that the result always starts with a slash.
  1330. 40823  */
  1331. 40824 {
  1332. 40825         const char *e= entry;
  1333. 40826         char *p= *ap;
  1334. 40827
  1335. 40828         while (*e != 0) e++;
  1336. 40829
  1337. 40830         while (e > entry && p > path) *--p = *--e;
  1338. 40831
  1339. 40832         if (p == path) return -1;
  1340. 40833         *--p = '/';
  1341. 40834         *ap= p;
  1342. 40835         return 0;
  1343. 40836 }
  1344. 40838 static int recover(char *p)
  1345. 40839 /* Undo all those chdir("..")'s that have been recorded by addpath.  This
  1346. 40840  * has to be done entry by entry, because the whole pathname may be too long.
  1347. 40841  */
  1348. 40842 {
  1349. 40843         int e= errno, slash;
  1350. 40844         char *p0;
  1351. 40845
  1352. 40846         while (*p != 0) {
  1353. 40847                 p0= ++p;
  1354. 40848
  1355. 40849                 do p++; while (*p != 0 && *p != '/');
  1356. 40850                 slash= *p; *p= 0;
  1357. 40851
  1358. 40852                 if (chdir(p0) < 0) return -1;
  1359. 40853                 *p= slash;
  1360. 40854         }
  1361. 40855         errno= e;
  1362. 40856         return 0;
  1363. 40857 }
  1364. 40859 char *getcwd(char *path, size_t size)
  1365. 40860 {
  1366. 40861         struct stat above, current, tmp;
  1367. 40862         struct dirent *entry;
  1368. 40863         DIR *d;
  1369. 40864         char *p, *up, *dotdot;
  1370. 40865         int cycle;
  1371. 40866
  1372. 40867         if (path == nil || size <= 2) { errno= EINVAL; return nil; }
  1373. 40868
  1374. 40869         p= path + size;
  1375. 40870         *--p = 0;
  1376. 40871
  1377. 40872         if (stat(".", &current) < 0) return nil;
  1378. 40873
  1379. 40874         while (1) {
  1380. 40875                 dotdot= "..";
  1381. 40876                 if (stat(dotdot, &above) < 0) { recover(p); return nil; }
  1382. 40877
  1383. 40878                 if (above.st_dev == current.st_dev
  1384. 40879                                         && above.st_ino == current.st_ino)
  1385. 40880                         break;  /* Root dir found */
  1386. 40881
  1387. 40882                 if ((d= opendir(dotdot)) == nil) { recover(p); return nil; }
  1388. 40883
  1389. 40884                 /* Cycle is 0 for a simple inode nr search, or 1 for a search
  1390. 40885                  * for inode *and* device nr.
  1391. 40886                  */
  1392. 40887                 cycle= above.st_dev == current.st_dev ? 0 : 1;
  1393. 40888
  1394. 40889                 do {
  1395. 40890                         char name[3 + NAME_MAX + 1];
  1396. 40891
  1397. 40892                         tmp.st_ino= 0;
  1398. 40893                         if ((entry= readdir(d)) == nil) {
  1399. 40894                                 switch (++cycle) {
  1400. 40895                                 case 1:
  1401. 40896                                         rewinddir(d);
  1402. 40897                                         continue;
  1403. 40898                                 case 2:
  1404. 40899                                         closedir(d);
  1405. 40900                                         errno= ENOENT;
  1406. 40901                                         recover(p);
  1407. 40902                                         return nil;
  1408. 40903                                 }
  1409. 40904                         }
  1410. 40905                         if (strcmp(entry->d_name, ".") == 0) continue;
  1411. 40906                         if (strcmp(entry->d_name, "..") == 0) continue;
  1412. 40907
  1413. 40908                         switch (cycle) {
  1414. 40909                         case 0:
  1415. 40910                                 /* Simple test on inode nr. */
  1416. 40911                                 if (entry->d_ino != current.st_ino) continue;
  1417. 40912                                 /*FALL THROUGH*/
  1418. 40913
  1419. 40914                         case 1:
  1420. 40915                                 /* Current is mounted. */
  1421. 40916                                 strcpy(name, "../");
  1422. 40917                                 strcpy(name+3, entry->d_name);
  1423. 40918                                 if (stat(name, &tmp) < 0) continue;
  1424. 40919                                 break;
  1425. 40920                         }
  1426. 40921                 } while (tmp.st_ino != current.st_ino
  1427. 40922                                         || tmp.st_dev != current.st_dev);
  1428. 40923
  1429. 40924                 up= p;
  1430. 40925                 if (addpath(path, &up, entry->d_name) < 0) {
  1431. 40926                         closedir(d);
  1432. 40927                         errno = ERANGE;
  1433. 40928                         recover(p);
  1434. 40929                         return nil;
  1435. 40930                 }
  1436. 40931                 closedir(d);
  1437. 40932
  1438. 40933                 if (chdir(dotdot) < 0) { recover(p); return nil; }
  1439. 40934                 p= up;
  1440. 40935
  1441. 40936                 current= above;
  1442. 40937         }
  1443. 40938         if (recover(p) < 0) return nil; /* Undo all those chdir("..")'s. */
  1444. 40939         if (*p == 0) *--p = '/';        /* Cwd is "/" if nothing added */
  1445. 40940         if (p > path) strcpy(path, p);  /* Move string to start of path. */
  1446. 40941         return path;
  1447. 40942 }
  1448. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1449. src/lib/posix/_getegid.c    
  1450. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1451. 41000 #include <lib.h>
  1452. 41001 #define getegid _getegid
  1453. 41002 #include <unistd.h>
  1454. 41003
  1455. 41004 PUBLIC gid_t getegid()
  1456. 41005 {
  1457. 41006   message m;
  1458. 41007
  1459. 41008   /* POSIX says that this function is always successful and that no
  1460. 41009    * return value is reserved to indicate an error.  Minix syscalls
  1461. 41010    * are not always successful and Minix returns the unreserved value
  1462. 41011    * (gid_t) -1 when there is an error.
  1463. 41012    */
  1464. 41013   if (_syscall(MM, GETGID, &m) < 0) return ( (gid_t) -1);
  1465. 41014   return( (gid_t) m.m2_i1);
  1466. 41015 }
  1467. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1468. src/lib/posix/_geteuid.c    
  1469. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1470. 41100 #include <lib.h>
  1471. 41101 #define geteuid _geteuid
  1472. 41102 #include <unistd.h>
  1473. 41103
  1474. 41104 PUBLIC uid_t geteuid()
  1475. 41105 {
  1476. 41106   message m;
  1477. 41107
  1478. 41108   /* POSIX says that this function is always successful and that no
  1479. 41109    * return value is reserved to indicate an error.  Minix syscalls
  1480. 41110    * are not always successful and Minix returns the unreserved value
  1481. 41111    * (uid_t) -1 when there is an error.
  1482. 41112    */
  1483. 41113   if (_syscall(MM, GETUID, &m) < 0) return ( (uid_t) -1);
  1484. 41114   return( (uid_t) m.m2_i1);
  1485. 41115 }
  1486. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1487. src/lib/posix/_getgid.c    
  1488. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1489. 41200 #include <lib.h>
  1490. 41201 #define getgid  _getgid
  1491. 41202 #include <unistd.h>
  1492. 41203
  1493. 41204 PUBLIC gid_t getgid()
  1494. 41205 {
  1495. 41206   message m;
  1496. 41207
  1497. 41208   return( (gid_t) _syscall(MM, GETGID, &m));
  1498. 41209 }
  1499. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1500. src/lib/posix/_getgroups.c    
  1501. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1502. 41300 /* getgroups.c                                          POSIX 4.2.3
  1503. 41301  *      int getgroups(gidsetsize, grouplist);
  1504. 41302  *
  1505. 41303  *      This call relates to suplementary group ids, which are not
  1506. 41304  *      supported in MINIX.
  1507. 41305  */
  1508. 41306
  1509. 41307 #include <lib.h>
  1510. 41308 #define getgroups _getgroups
  1511. 41309 #include <unistd.h>
  1512. 41310 #include <time.h>
  1513. 41311
  1514. 41312 PUBLIC int getgroups(gidsetsize, grouplist)
  1515. 41313 int gidsetsize;
  1516. 41314 gid_t grouplist[];
  1517. 41315 {
  1518. 41316   return(0);
  1519. 41317 }
  1520. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1521. src/lib/posix/_getpgrp.c    
  1522. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1523. 41400 #include <lib.h>
  1524. 41401 #define getpgrp _getpgrp
  1525. 41402 #include <unistd.h>
  1526. 41403
  1527. 41404 PUBLIC pid_t getpgrp()
  1528. 41405 {
  1529. 41406   message m;
  1530. 41407
  1531. 41408   return(_syscall(MM, GETPGRP, &m));
  1532. 41409 }
  1533. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1534. src/lib/posix/_getpid.c    
  1535. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1536. 41500 #include <lib.h>
  1537. 41501 #define getpid  _getpid
  1538. 41502 #include <unistd.h>
  1539. 41503
  1540. 41504 PUBLIC pid_t getpid()
  1541. 41505 {
  1542. 41506   message m;
  1543. 41507
  1544. 41508   return(_syscall(MM, GETPID, &m));
  1545. 41509 }
  1546. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1547. src/lib/posix/_getppid.c    
  1548. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1549. 41600 #include <lib.h>
  1550. 41601 #define getppid _getppid
  1551. 41602 #include <unistd.h>
  1552. 41603
  1553. 41604 PUBLIC pid_t getppid()
  1554. 41605 {
  1555. 41606   message m;
  1556. 41607
  1557. 41608   /* POSIX says that this function is always successful and that no
  1558. 41609    * return value is reserved to indicate an error.  Minix syscalls
  1559. 41610    * are not always successful and Minix returns the reserved value
  1560. 41611    * (pid_t) -1 when there is an error.
  1561. 41612    */
  1562. 41613   if (_syscall(MM, GETPID, &m) < 0) return ( (pid_t) -1);
  1563. 41614   return( (pid_t) m.m2_i1);
  1564. 41615 }
  1565. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1566. src/lib/posix/_getuid.c    
  1567. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1568. 41700 #include <lib.h>
  1569. 41701 #define getuid  _getuid
  1570. 41702 #include <unistd.h>
  1571. 41703
  1572. 41704 PUBLIC uid_t getuid()
  1573. 41705 {
  1574. 41706   message m;
  1575. 41707
  1576. 41708   return( (uid_t) _syscall(MM, GETUID, &m));
  1577. 41709 }
  1578. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1579. src/lib/posix/_ioctl.c    
  1580. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1581. 41800 #include <lib.h>
  1582. 41801 #define ioctl   _ioctl
  1583. 41802 #include <minix/com.h>
  1584. 41803 #include <sys/ioctl.h>
  1585. 41804
  1586. 41805 PUBLIC int ioctl(fd, request, data)
  1587. 41806 int fd;
  1588. 41807 int request;
  1589. 41808 void *data;
  1590. 41809 {
  1591. 41810   message m;
  1592. 41811
  1593. 41812   m.TTY_LINE = fd;
  1594. 41813   m.TTY_REQUEST = request;
  1595. 41814   m.ADDRESS = (char *) data;
  1596. 41815   return(_syscall(FS, IOCTL, &m));
  1597. 41816 }
  1598. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1599. src/lib/posix/_isatty.c    
  1600. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1601. 41900 #include <lib.h>
  1602. 41901 #define isatty _isatty
  1603. 41902 #define tcgetattr _tcgetattr
  1604. 41903 #include <termios.h>
  1605. 41904 #include <unistd.h>
  1606. 41905
  1607. 41906 PUBLIC int isatty(fd)
  1608. 41907 int fd;
  1609. 41908 {
  1610. 41909   struct termios dummy;
  1611. 41910
  1612. 41911   return(tcgetattr(fd, &dummy) == 0);
  1613. 41912 }
  1614. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1615. src/lib/posix/_kill.c    
  1616. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1617. 42000 #include <lib.h>
  1618. 42001 #define kill    _kill
  1619. 42002 #include <signal.h>
  1620. 42003
  1621. 42004 PUBLIC int kill(proc, sig)
  1622. 42005 int proc;                       /* which process is to be sent the signal */
  1623. 42006 int sig;                        /* signal number */
  1624. 42007 {
  1625. 42008   message m;
  1626. 42009
  1627. 42010   m.m1_i1 = proc;
  1628. 42011   m.m1_i2 = sig;
  1629. 42012   return(_syscall(MM, KILL, &m));
  1630. 42013 }
  1631. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1632. src/lib/posix/_link.c    
  1633. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1634. 42100 #include <lib.h>
  1635. 42101 #define link    _link
  1636. 42102 #include <string.h>
  1637. 42103 #include <unistd.h>
  1638. 42104
  1639. 42105 PUBLIC int link(name, name2)
  1640. 42106 _CONST char *name, *name2;
  1641. 42107 {
  1642. 42108   message m;
  1643. 42109
  1644. 42110   m.m1_i1 = strlen(name) + 1;
  1645. 42111   m.m1_i2 = strlen(name2) + 1;
  1646. 42112   m.m1_p1 = (char *) name;
  1647. 42113   m.m1_p2 = (char *) name2;
  1648. 42114   return(_syscall(FS, LINK, &m));
  1649. 42115 }
  1650. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1651. src/lib/posix/_lseek.c    
  1652. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1653. 42200 #include <lib.h>
  1654. 42201 #define lseek   _lseek
  1655. 42202 #include <unistd.h>
  1656. 42203
  1657. 42204 PUBLIC off_t lseek(fd, offset, whence)
  1658. 42205 int fd;
  1659. 42206 off_t offset;
  1660. 42207 int whence;
  1661. 42208 {
  1662. 42209   message m;
  1663. 42210
  1664. 42211   m.m2_i1 = fd;
  1665. 42212   m.m2_l1 = offset;
  1666. 42213   m.m2_i2 = whence;
  1667. 42214   if (_syscall(FS, LSEEK, &m) < 0) return( (off_t) -1);
  1668. 42215   return( (off_t) m.m2_l1);
  1669. 42216 }
  1670. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1671. src/lib/posix/_mkdir.c    
  1672. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1673. 42300 #include <lib.h>
  1674. 42301 #define mkdir   _mkdir
  1675. 42302 #include <sys/stat.h>
  1676. 42303 #include <string.h>
  1677. 42304
  1678. 42305 PUBLIC int mkdir(name, mode)
  1679. 42306 _CONST char *name;
  1680. 42307 Mode_t mode;
  1681. 42308 {
  1682. 42309   message m;
  1683. 42310
  1684. 42311   m.m1_i1 = strlen(name) + 1;
  1685. 42312   m.m1_i2 = mode;
  1686. 42313   m.m1_p1 = (char *) name;
  1687. 42314   return(_syscall(FS, MKDIR, &m));
  1688. 42315 }
  1689. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1690. src/lib/posix/_mkfifo.c    
  1691. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1692. 42400 #include <lib.h>
  1693. 42401 #define mkfifo  _mkfifo
  1694. 42402 #define mknod   _mknod
  1695. 42403 #include <sys/stat.h>
  1696. 42404 #include <unistd.h>
  1697. 42405
  1698. 42406 PUBLIC int mkfifo(name, mode)
  1699. 42407 _CONST char *name;
  1700. 42408 Mode_t mode;
  1701. 42409 {
  1702. 42410   return mknod(name, mode | S_IFIFO, (Dev_t) 0);
  1703. 42411 }
  1704. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1705. src/lib/posix/_mknod.c    
  1706. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1707. 42500 #include <lib.h>
  1708. 42501 #define mknod   _mknod
  1709. 42502 #include <string.h>
  1710. 42503 #include <stdlib.h>
  1711. 42504 #include <unistd.h>
  1712. 42505
  1713. 42506 PUBLIC int mknod(name, mode, dev)
  1714. 42507 _CONST char *name;
  1715. 42508 Mode_t mode;
  1716. 42509 Dev_t dev;
  1717. 42510 {
  1718. 42511   message m;
  1719. 42512
  1720. 42513   m.m1_i1 = strlen(name) + 1;
  1721. 42514   m.m1_i2 = mode;
  1722. 42515   m.m1_i3 = dev;
  1723. 42516   m.m1_p1 = (char *) name;
  1724. 42517   m.m1_p2 = (char *) ((int) 0);         /* obsolete size field */
  1725. 42518   return(_syscall(FS, MKNOD, &m));
  1726. 42519 }
  1727. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1728. src/lib/posix/_mktemp.c    
  1729. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1730. 42600 /* mktemp - make a name for a temporary file */
  1731. 42601
  1732. 42602 #include <lib.h>
  1733. 42603 #define access  _access
  1734. 42604 #define getpid  _getpid
  1735. 42605 #define mktemp  _mktemp
  1736. 42606 #include <unistd.h>
  1737. 42607
  1738. 42608 PUBLIC char *mktemp(template)
  1739. 42609 char *template;
  1740. 42610 {
  1741. 42611   register int k;
  1742. 42612   register char *p;
  1743. 42613   register pid_t pid;
  1744. 42614
  1745. 42615   pid = getpid();               /* get process id as semi-unique number */
  1746. 42616   p = template;
  1747. 42617   while (*p != 0) p++;          /* find end of string */
  1748. 42618
  1749. 42619   /* Replace XXXXXX at end of template with a letter, then as many of the
  1750. 42620    * trailing digits of the pid as fit.
  1751. 42621    */
  1752. 42622   while (*--p == 'X') {
  1753. 42623         *p = '0' + (pid % 10);
  1754. 42624         pid /= 10;
  1755. 42625   }
  1756. 42626   if (*++p != 0) {
  1757. 42627         for (k = 'a'; k <= 'z'; k++) {
  1758. 42628                 *p = k;
  1759. 42629                 if (access(template, F_OK) < 0) return(template);
  1760. 42630         }
  1761. 42631   }
  1762. 42632   return("/");
  1763. 42633 }
  1764. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1765. src/lib/posix/_mount.c    
  1766. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1767. 42700 #include <lib.h>
  1768. 42701 #define mount   _mount
  1769. 42702 #include <string.h>
  1770. 42703 #include <unistd.h>
  1771. 42704
  1772. 42705 PUBLIC int mount(special, name, rwflag)
  1773. 42706 char *name, *special;
  1774. 42707 int rwflag;
  1775. 42708 {
  1776. 42709   message m;
  1777. 42710
  1778. 42711   m.m1_i1 = strlen(special) + 1;
  1779. 42712   m.m1_i2 = strlen(name) + 1;
  1780. 42713   m.m1_i3 = rwflag;
  1781. 42714   m.m1_p1 = special;
  1782. 42715   m.m1_p2 = name;
  1783. 42716   return(_syscall(FS, MOUNT, &m));
  1784. 42717 }
  1785. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1786. src/lib/posix/_open.c    
  1787. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1788. 42800 #include <lib.h>
  1789. 42801 #define open    _open
  1790. 42802 #include <fcntl.h>
  1791. 42803 #include <stdarg.h>
  1792. 42804 #include <string.h>
  1793. 42805
  1794. 42806 #if _ANSI
  1795. 42807 PUBLIC int open(const char *name, int flags, ...)
  1796. 42808 #else
  1797. 42809 PUBLIC int open(name, flags)
  1798. 42810 _CONST char *name;
  1799. 42811 int flags;
  1800. 42812 #endif
  1801. 42813 {
  1802. 42814   va_list argp;
  1803. 42815   message m;
  1804. 42816
  1805. 42817   va_start(argp, flags);
  1806. 42818   if (flags & O_CREAT) {
  1807. 42819         m.m1_i1 = strlen(name) + 1;
  1808. 42820         m.m1_i2 = flags;
  1809. 42821         m.m1_i3 = va_arg(argp, Mode_t);
  1810. 42822         m.m1_p1 = (char *) name;
  1811. 42823   } else {
  1812. 42824         _loadname(name, &m);
  1813. 42825         m.m3_i2 = flags;
  1814. 42826   }
  1815. 42827   va_end(argp);
  1816. 42828   return (_syscall(FS, OPEN, &m));
  1817. 42829 }
  1818. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1819. src/lib/posix/_opendir.c    
  1820. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1821. 42900 /*      opendir()                                       Author: Kees J. Bot
  1822. 42901  *                                                              24 Apr 1989
  1823. 42902  */
  1824. 42903 #define nil 0
  1825. 42904 #include <lib.h>
  1826. 42905 #define close   _close
  1827. 42906 #define fcntl   _fcntl
  1828. 42907 #define fstat   _fstat
  1829. 42908 #define open    _open
  1830. 42909 #define opendir _opendir
  1831. 42910 #define stat    _stat
  1832. 42911 #include <sys/types.h>
  1833. 42912 #include <sys/stat.h>
  1834. 42913 #include <dirent.h>
  1835. 42914 #include <unistd.h>
  1836. 42915 #include <stdlib.h>
  1837. 42916 #include <fcntl.h>
  1838. 42917 #include <errno.h>
  1839. 42918
  1840. 42919 DIR *opendir(const char *name)
  1841. 42920 /* Open a directory for reading. */
  1842. 42921 {
  1843. 42922         int d, f;
  1844. 42923         DIR *dp;
  1845. 42924         struct stat st;
  1846. 42925
  1847. 42926         /* Only read directories. */
  1848. 42927         if (stat(name, &st) < 0) return nil;
  1849. 42928         if (!S_ISDIR(st.st_mode)) { errno= ENOTDIR; return nil; }
  1850. 42929
  1851. 42930         if ((d= open(name, O_RDONLY | O_NONBLOCK)) < 0) return nil;
  1852. 42931
  1853. 42932         /* Check the type again, mark close-on-exec, get a buffer. */
  1854. 42933         if (fstat(d, &st) < 0
  1855. 42934                 || (errno= ENOTDIR, !S_ISDIR(st.st_mode))
  1856. 42935                 || (f= fcntl(d, F_GETFD)) < 0
  1857. 42936                 || fcntl(d, F_SETFD, f | FD_CLOEXEC) < 0
  1858. 42937                 || (dp= (DIR *) malloc(sizeof(*dp))) == nil
  1859. 42938         ) {
  1860. 42939                 int err= errno;
  1861. 42940                 (void) close(d);
  1862. 42941                 errno= err;
  1863. 42942                 return nil;
  1864. 42943         }
  1865. 42944
  1866. 42945         dp->_fd= d;
  1867. 42946         dp->_v7= -1;
  1868. 42947         dp->_count= 0;
  1869. 42948         dp->_pos= 0;
  1870. 42949
  1871. 42950         return dp;
  1872. 42951 }
  1873. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1874. src/lib/posix/_pathconf.c    
  1875. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1876. 43000 /* POSIX pathconf (Sec. 5.7.1)          Author: Andy Tanenbaum */
  1877. 43001
  1878. 43002 #include <lib.h>
  1879. 43003 #define close           _close
  1880. 43004 #define open            _open
  1881. 43005 #define pathconf        _pathconf
  1882. 43006 #include <fcntl.h>
  1883. 43007 #include <errno.h>
  1884. 43008 #include <unistd.h>
  1885. 43009
  1886. 43010 PUBLIC long pathconf(path, name)
  1887. 43011 _CONST char *path;              /* name of file being interrogated */
  1888. 43012 int name;                       /* property being inspected */
  1889. 43013 {
  1890. 43014 /* POSIX allows some of the values in <limits.h> to be increased at
  1891. 43015  * run time.  The pathconf and fpathconf functions allow these values
  1892. 43016  * to be checked at run time.  MINIX does not use this facility.
  1893. 43017  * The run-time limits are those given in <limits.h>.
  1894. 43018  */
  1895. 43019
  1896. 43020   int fd;
  1897. 43021   long val;
  1898. 43022
  1899. 43023   if ( (fd = open(path, O_RDONLY)) < 0) return(-1L);
  1900. 43024   val = fpathconf(fd, name);
  1901. 43025   close(fd);
  1902. 43026   return(val);
  1903. 43027 }
  1904. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1905. src/lib/posix/_pause.c    
  1906. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1907. 43100 #include <lib.h>
  1908. 43101 #define pause   _pause
  1909. 43102 #include <unistd.h>
  1910. 43103
  1911. 43104 PUBLIC int pause()
  1912. 43105 {
  1913. 43106   message m;
  1914. 43107
  1915. 43108   return(_syscall(MM, PAUSE, &m));
  1916. 43109 }
  1917. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1918. src/lib/posix/_pipe.c    
  1919. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1920. 43200 #include <lib.h>
  1921. 43201 #define pipe    _pipe
  1922. 43202 #include <unistd.h>
  1923. 43203
  1924. 43204 PUBLIC int pipe(fild)
  1925. 43205 int fild[2];
  1926. 43206 {
  1927. 43207   message m;
  1928. 43208
  1929. 43209   if (_syscall(FS, PIPE, &m) < 0) return(-1);
  1930. 43210   fild[0] = m.m1_i1;
  1931. 43211   fild[1] = m.m1_i2;
  1932. 43212   return(0);
  1933. 43213 }
  1934. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1935. src/lib/posix/_ptrace.c    
  1936. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1937. 43300 #include <lib.h>
  1938. 43301 #define ptrace  _ptrace
  1939. 43302 #include <unistd.h>
  1940. 43303
  1941. 43304 PUBLIC long ptrace(req, pid, addr, data)
  1942. 43305 int req;
  1943. 43306 pid_t pid;
  1944. 43307 long addr;
  1945. 43308 long data;
  1946. 43309 {
  1947. 43310   message m;
  1948. 43311
  1949. 43312   m.m2_i1 = pid;
  1950. 43313   m.m2_i2 = req;
  1951. 43314   m.m2_l1 = addr;
  1952. 43315   m.m2_l2 = data;
  1953. 43316   if (_syscall(MM, PTRACE, &m) < 0) return(-1);
  1954. 43317
  1955. 43318   /* There was no error, but -1 is a legal return value.  Clear errno if
  1956. 43319    * necessary to distinguish this case.  _syscall has set errno to nonzero
  1957. 43320    * for the error case.
  1958. 43321    */
  1959. 43322   if (m.m2_l2 == -1) errno = 0;
  1960. 43323   return(m.m2_l2);
  1961. 43324 }
  1962. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1963. src/lib/posix/_read.c    
  1964. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1965. 43400 #include <lib.h>
  1966. 43401 #define read    _read
  1967. 43402 #include <unistd.h>
  1968. 43403
  1969. 43404 PUBLIC ssize_t read(fd, buffer, nbytes)
  1970. 43405 int fd;
  1971. 43406 void *buffer;
  1972. 43407 size_t nbytes;
  1973. 43408 {
  1974. 43409   message m;
  1975. 43410
  1976. 43411   m.m1_i1 = fd;
  1977. 43412   m.m1_i2 = nbytes;
  1978. 43413   m.m1_p1 = (char *) buffer;
  1979. 43414   return(_syscall(FS, READ, &m));
  1980. 43415 }
  1981. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1982. src/lib/posix/_readdir.c    
  1983. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1984. 43500 /*      readdir()                                       Author: Kees J. Bot
  1985. 43501  *                                                              24 Apr 1989
  1986. 43502  */
  1987. 43503 #define nil 0
  1988. 43504 #include <lib.h>
  1989. 43505 #define read    _read
  1990. 43506 #define readdir _readdir
  1991. 43507 #include <sys/types.h>
  1992. 43508 #include <sys/stat.h>
  1993. 43509 #include <dirent.h>
  1994. 43510 #include <unistd.h>
  1995. 43511 #include <stdlib.h>
  1996. 43512 #include <fcntl.h>
  1997. 43513 #include <limits.h>
  1998. 43514 #include <errno.h>
  1999. 43515 #include <string.h>
  2000. 43516
  2001. 43517 #define v7ent(p)        ((struct _v7_direct *) (p))
  2002. 43518
  2003. 43519 struct dirent *readdir(DIR *dp)
  2004. 43520 /* Return the next entry in a directory.  Handle V7 and FLEX format dirs. */
  2005. 43521 {
  2006. 43522         struct dirent *e;
  2007. 43523
  2008. 43524         if (dp == nil) { errno= EBADF; return nil; }
  2009. 43525
  2010. 43526         do {
  2011. 43527                 if (dp->_count <= 0) {
  2012. 43528                         /* Read the next directory block. */
  2013. 43529                         dp->_count= read(dp->_fd, dp->_buf, sizeof(dp->_buf));
  2014. 43530                         if (dp->_count <= 0) return nil;
  2015. 43531
  2016. 43532                         dp->_count/= sizeof(dp->_buf[0]);
  2017. 43533                         dp->_ptr= dp->_buf;
  2018. 43534
  2019. 43535                         /* Extent is zero of the first flex entry. */
  2020. 43536                         if (dp->_v7 == (char)-1) dp->_v7= dp->_buf[0].d_extent;
  2021. 43537                 }
  2022. 43538
  2023. 43539                 if (!dp->_v7) {
  2024. 43540                         /* FLEX. */
  2025. 43541                         e= (struct dirent *) dp->_ptr;
  2026. 43542                 } else {
  2027. 43543                         /* V7: transform to FLEX. */
  2028. 43544                         e= (struct dirent *) dp->_v7f;
  2029. 43545                         e->d_ino= v7ent(dp->_ptr)->d_ino;
  2030. 43546                         e->d_extent= 1;
  2031. 43547                         memcpy(e->d_name, v7ent(dp->_ptr)->d_name, 14);
  2032. 43548                         e->d_name[14]= 0;
  2033. 43549                 }
  2034. 43550
  2035. 43551                 dp->_ptr+= 1 + e->d_extent;
  2036. 43552                 dp->_count-= 1 + e->d_extent;
  2037. 43553                 dp->_pos+= (1 + e->d_extent) * sizeof(*dp->_ptr);
  2038. 43554
  2039. 43555         } while (e->d_ino == 0);
  2040. 43556         return e;
  2041. 43557 }
  2042. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2043. src/lib/posix/_rename.c    
  2044. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2045. 43600 #include <lib.h>
  2046. 43601 #define rename  _rename
  2047. 43602 #include <string.h>
  2048. 43603 #include <stdio.h>
  2049. 43604
  2050. 43605 PUBLIC int rename(name, name2)
  2051. 43606 _CONST char *name, *name2;
  2052. 43607 {
  2053. 43608   message m;
  2054. 43609
  2055. 43610   m.m1_i1 = strlen(name) + 1;
  2056. 43611   m.m1_i2 = strlen(name2) + 1;
  2057. 43612   m.m1_p1 = (char *) name;
  2058. 43613   m.m1_p2 = (char *) name2;
  2059. 43614   return(_syscall(FS, RENAME, &m));
  2060. 43615 }
  2061. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2062. src/lib/posix/_rewinddir.c    
  2063. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2064. 43700 /*      rewinddir()                                     Author: Kees J. Bot
  2065. 43701  *                                                              24 Apr 1989
  2066. 43702  */
  2067. 43703 #define nil 0
  2068. 43704 #include <lib.h>
  2069. 43705 #define rewinddir _rewinddir
  2070. 43706 #define seekdir _seekdir
  2071. 43707 #include <sys/types.h>
  2072. 43708 #include <dirent.h>
  2073. 43709
  2074. 43710 void rewinddir(DIR *dp)
  2075. 43711 {
  2076. 43712         (void) seekdir(dp, 0);
  2077. 43713 }
  2078. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2079. src/lib/posix/_rmdir.c    
  2080. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2081. 43800 #include <lib.h>
  2082. 43801 #define rmdir   _rmdir
  2083. 43802 #include <unistd.h>
  2084. 43803
  2085. 43804 PUBLIC int rmdir(name)
  2086. 43805 _CONST char *name;
  2087. 43806 {
  2088. 43807   message m;
  2089. 43808
  2090. 43809   _loadname(name, &m);
  2091. 43810   return(_syscall(FS, RMDIR, &m));
  2092. 43811 }
  2093. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2094. src/lib/posix/_setgid.c    
  2095. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2096. 43900 #include <lib.h>
  2097. 43901 #define setgid  _setgid
  2098. 43902 #include <unistd.h>
  2099. 43903
  2100. 43904 PUBLIC int setgid(grp)
  2101. 43905 gid_t grp;
  2102. 43906 {
  2103. 43907   message m;
  2104. 43908
  2105. 43909   m.m1_i1 = (int) grp;
  2106. 43910   return(_syscall(MM, SETGID, &m));
  2107. 43911 }
  2108. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2109. src/lib/posix/_setsid.c    
  2110. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2111. 44000 #include <lib.h>
  2112. 44001 #define setsid  _setsid
  2113. 44002 #include <unistd.h>
  2114. 44003
  2115. 44004 PUBLIC pid_t setsid()
  2116. 44005 {
  2117. 44006   message m;
  2118. 44007
  2119. 44008   return(_syscall(MM, SETSID, &m));
  2120. 44009 }
  2121. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2122. src/lib/posix/_setuid.c    
  2123. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2124. 44100 #include <lib.h>
  2125. 44101 #define setuid  _setuid
  2126. 44102 #include <unistd.h>
  2127. 44103
  2128. 44104 PUBLIC int setuid(usr)
  2129. 44105 Uid_t usr;
  2130. 44106 {
  2131. 44107   message m;
  2132. 44108
  2133. 44109   m.m1_i1 = usr;
  2134. 44110   return(_syscall(MM, SETUID, &m));
  2135. 44111 }
  2136. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2137. src/lib/posix/_sigaction.c    
  2138. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2139. 44200 #include <lib.h>
  2140. 44201 #define sigaction _sigaction
  2141. 44202 #include <sys/sigcontext.h>
  2142. 44203 #include <signal.h>
  2143. 44204
  2144. 44205 _PROTOTYPE(int __sigreturn, (void));
  2145. 44206
  2146. 44207 PUBLIC int sigaction(sig, act, oact)
  2147. 44208 int sig;
  2148. 44209 _CONST struct sigaction *act;
  2149. 44210 struct sigaction *oact;
  2150. 44211 {
  2151. 44212   message m;
  2152. 44213
  2153. 44214   m.m1_i2 = sig;
  2154. 44215
  2155. 44216   /* XXX - yet more type puns because message struct is short of types. */
  2156. 44217   m.m1_p1 = (char *) act;
  2157. 44218   m.m1_p2 = (char *) oact;
  2158. 44219   m.m1_p3 = (char *) __sigreturn;
  2159. 44220
  2160. 44221   return(_syscall(MM, SIGACTION, &m));
  2161. 44222 }
  2162. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2163. src/lib/posix/_sigpending.c    
  2164. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2165. 44300 #include <lib.h>
  2166. 44301 #define sigpending _sigpending
  2167. 44302 #include <signal.h>
  2168. 44303
  2169. 44304 PUBLIC int sigpending(set)
  2170. 44305 sigset_t *set;
  2171. 44306 {
  2172. 44307   message m;
  2173. 44308
  2174. 44309   if (_syscall(MM, SIGPENDING, &m) < 0) return(-1);
  2175. 44310   *set = (sigset_t) m.m2_l1;
  2176. 44311   return(m.m_type);
  2177. 44312 }
  2178. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2179. src/lib/posix/_sigprocmask.c    
  2180. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2181. 44400 #include <lib.h>
  2182. 44401 #define sigprocmask _sigprocmask
  2183. 44402 #include <signal.h>
  2184. 44403
  2185. 44404 PUBLIC int sigprocmask(how, set, oset)
  2186. 44405 int how;
  2187. 44406 _CONST sigset_t *set;
  2188. 44407 sigset_t *oset;
  2189. 44408 {
  2190. 44409   message m;
  2191. 44410
  2192. 44411   if (set == (sigset_t *) NULL) {
  2193. 44412         m.m2_i1 = SIG_INQUIRE;
  2194. 44413         m.m2_l1 = 0;
  2195. 44414   } else {
  2196. 44415         m.m2_i1 = how;
  2197. 44416         m.m2_l1 = (long) *set;
  2198. 44417   }
  2199. 44418   if (_syscall(MM, SIGPROCMASK, &m) < 0) return(-1);
  2200. 44419   if (oset != (sigset_t *) NULL) *oset = (sigset_t) (m.m2_l1);
  2201. 44420   return(m.m_type);
  2202. 44421 }
  2203. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2204. src/lib/posix/_sigreturn.c    
  2205. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2206. 44500 #include <lib.h>
  2207. 44501 #define sigfillset      _sigfillset
  2208. 44502 #define sigjmp          _sigjmp
  2209. 44503 #define sigprocmask     _sigprocmask
  2210. 44504 #define sigreturn       _sigreturn
  2211. 44505 #include <sys/sigcontext.h>
  2212. 44506 #include <setjmp.h>
  2213. 44507 #include <signal.h>
  2214. 44508
  2215. 44509 _PROTOTYPE( int sigjmp, (jmp_buf jb, int retval));
  2216. 44510
  2217. 44511 #if (_SETJMP_SAVES_REGS == 0)
  2218. 44512 /* 'sigreturn' using a short format jmp_buf (no registers saved). */
  2219. 44513 PUBLIC int sigjmp(jb, retval)
  2220. 44514 jmp_buf jb;
  2221. 44515 int retval;
  2222. 44516 {
  2223. 44517   struct sigcontext sc;
  2224. 44518
  2225. 44519   sc.sc_flags = jb[0].__flags;
  2226. 44520   sc.sc_mask = jb[0].__mask;
  2227. 44521
  2228. 44522 #if (CHIP == INTEL)
  2229. 44523   sc.sc_pc = (int) jb[0].__pc;
  2230. 44524   sc.sc_sp = (int) jb[0].__sp;
  2231. 44525   sc.sc_fp = (int) jb[0].__lb;
  2232. 44526 #endif
  2233. 44527
  2234. 44528 #if (CHIP == M68000)
  2235. 44529   sc.sc_pc = (long) jb[0].__pc;
  2236. 44530   sc.sc_sp = (long) jb[0].__sp;
  2237. 44531   sc.sc_fp = (long) jb[0].__lb;
  2238. 44532 #endif
  2239. 44533
  2240. 44534   sc.sc_retreg = retval;
  2241. 44535   return sigreturn(&sc);
  2242. 44536 }
  2243. 44537 #endif
  2244. 44538
  2245. 44539 PUBLIC int sigreturn(scp)
  2246. 44540 register struct sigcontext *scp;
  2247. 44541 {
  2248. 44542   sigset_t set;
  2249. 44543
  2250. 44544   /* The message can't be on the stack, because the stack will vanish out
  2251. 44545    * from under us.  The send part of sendrec will succeed, but when
  2252. 44546    * a message is sent to restart the current process, who knows what will
  2253. 44547    * be in the place formerly occupied by the message?
  2254. 44548    */
  2255. 44549   static message m;
  2256. 44550
  2257. 44551   /* Protect against race conditions by blocking all interrupts. */
  2258. 44552   sigfillset(&set);             /* splhi */
  2259. 44553   sigprocmask(SIG_SETMASK, &set, (sigset_t *) NULL);
  2260. 44554
  2261. 44555   m.m2_l1 = scp->sc_mask;
  2262. 44556   m.m2_i2 = scp->sc_flags;
  2263. 44557   m.m2_p1 = (char *) scp;
  2264. 44558   return(_syscall(MM, SIGRETURN, &m));  /* normally this doesn't return */
  2265. 44559 }
  2266. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2267. src/lib/posix/_sigset.c    
  2268. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2269. 44600 #include <lib.h>
  2270. 44601 /* XXX - these have to be hidden because signal() uses them and signal() is
  2271. 44602  * ANSI and not POSIX.  It would be surely be better to use macros for the
  2272. 44603  * library and system uses, and perhaps macros as well as functions for the
  2273. 44604  * POSIX user interface.  The macros would not need underlines.  It may be
  2274. 44605  * inconvenient to match the exact semantics of the current functions
  2275. 44606  * because the interface is bloated by reporting errors.  For library and
  2276. 44607  * system uses, the signal number is mostly already known to be valid
  2277. 44608  * before the sigset-changing routines are called.
  2278. 44609  */
  2279. 44610 #define sigaddset       _sigaddset
  2280. 44611 #define sigdelset       _sigdelset
  2281. 44612 #define sigemptyset     _sigemptyset
  2282. 44613 #define sigfillset      _sigfillset
  2283. 44614 #define sigismember     _sigismember
  2284. 44615 #include <signal.h>
  2285. 44616
  2286. 44617 /* Low bit of signal masks. */
  2287. 44618 #define SIGBIT_0        ((sigset_t) 1)
  2288. 44619
  2289. 44620 /* Mask of valid signals (0 - _NSIG).  Assume the shift doesn't overflow. */
  2290. 44621 #define SIGMASK         ((SIGBIT_0 << (_NSIG + 1)) - 1)
  2291. 44622
  2292. 44623 #define sigisvalid(signo) ((unsigned) (signo) <= _NSIG)
  2293. 44624
  2294. 44625 PUBLIC int sigaddset(set, signo)
  2295. 44626 sigset_t *set;
  2296. 44627 int signo;
  2297. 44628 {
  2298. 44629   if (!sigisvalid(signo)) {
  2299. 44630         errno = EINVAL;
  2300. 44631         return -1;
  2301. 44632   }
  2302. 44633   *set |= SIGBIT_0 << signo;
  2303. 44634   return 0;
  2304. 44635 }
  2305. 44637 PUBLIC int sigdelset(set, signo)
  2306. 44638 sigset_t *set;
  2307. 44639 int signo;
  2308. 44640 {
  2309. 44641   if (!sigisvalid(signo)) {
  2310. 44642         errno = EINVAL;
  2311. 44643         return -1;
  2312. 44644   }
  2313. 44645   *set &= ~(SIGBIT_0 << signo);
  2314. 44646   return 0;
  2315. 44647 }
  2316. 44649 PUBLIC int sigemptyset(set)
  2317. 44650 sigset_t *set;
  2318. 44651 {
  2319. 44652   *set = 0;
  2320. 44653   return 0;
  2321. 44654 }
  2322. 44656 PUBLIC int sigfillset(set)
  2323. 44657 sigset_t *set;
  2324. 44658 {
  2325. 44659   *set = SIGMASK;
  2326. 44660   return 0;
  2327. 44661 }
  2328. 44663 PUBLIC int sigismember(set, signo)
  2329. 44664 sigset_t *set;
  2330. 44665 int signo;
  2331. 44666 {
  2332. 44667   if (!sigisvalid(signo)) {
  2333. 44668         errno = EINVAL;
  2334. 44669         return -1;
  2335. 44670   }
  2336. 44671   if (*set & (SIGBIT_0 << signo))
  2337. 44672         return 1;
  2338. 44673   return 0;
  2339. 44674 }
  2340. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2341. src/lib/posix/_sigsetjmp.c    
  2342. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2343. 44700 #include <lib.h>
  2344. 44701 #include <sys/sigcontext.h>
  2345. 44702 #include <setjmp.h>
  2346. 44703
  2347. 44704 PUBLIC void siglongjmp(env, val)
  2348. 44705 sigjmp_buf env;
  2349. 44706 int val;
  2350. 44707 {
  2351. 44708   if (env[0].__flags & SC_SIGCONTEXT)
  2352. 44709         longjmp(env, val);
  2353. 44710   else
  2354. 44711         _longjmp(env, val);
  2355. 44712 }
  2356. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2357. src/lib/posix/_sigsuspend.c    
  2358. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2359. 44800 #include <lib.h>
  2360. 44801 #define sigsuspend _sigsuspend
  2361. 44802 #include <signal.h>
  2362. 44803
  2363. 44804 PUBLIC int sigsuspend(set)
  2364. 44805 _CONST sigset_t *set;
  2365. 44806 {
  2366. 44807   message m;
  2367. 44808
  2368. 44809   m.m2_l1 = (long) *set;
  2369. 44810   return(_syscall(MM, SIGSUSPEND, &m));
  2370. 44811 }
  2371. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2372. src/lib/posix/_sleep.c    
  2373. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2374. 44900 /*  sleep(3)
  2375. 44901  *
  2376. 44902  *  Sleep(n) pauses for 'n' seconds by scheduling an alarm interrupt.
  2377. 44903  *
  2378. 44904  *  Changed to conform with POSIX      Terrence W. Holm      Oct. 1988
  2379. 44905  */
  2380. 44906
  2381. 44907 #include <lib.h>
  2382. 44908 #define sleep _sleep
  2383. 44909 #include <signal.h>
  2384. 44910 #include <unistd.h>
  2385. 44911
  2386. 44912 FORWARD _PROTOTYPE( void _alfun, (int signo) );
  2387. 44913
  2388. 44914 PRIVATE void _alfun(signo)
  2389. 44915 int signo;
  2390. 44916 {
  2391. 44917 /* Dummy signal handler used with sleep() below. */
  2392. 44918 }
  2393. 44920 PUBLIC unsigned sleep(secs)
  2394. 44921 unsigned secs;
  2395. 44922 {
  2396. 44923   unsigned current_secs;
  2397. 44924   unsigned remaining_secs;
  2398. 44925   struct sigaction act, oact;
  2399. 44926   sigset_t ss;
  2400. 44927
  2401. 44928   if (secs == 0) return(0);
  2402. 44929
  2403. 44930   current_secs = alarm(0);      /* is there currently an alarm?  */
  2404. 44931
  2405. 44932   if (current_secs == 0 || current_secs > secs) {
  2406. 44933         act.sa_flags = 0;
  2407. 44934         act.sa_mask = 0;
  2408. 44935         act.sa_handler = _alfun;
  2409. 44936         sigaction(SIGALRM, &act, &oact);
  2410. 44937
  2411. 44938         alarm(secs);
  2412. 44939         sigemptyset(&ss);
  2413. 44940         sigsuspend(&ss);
  2414. 44941         remaining_secs = alarm(0);
  2415. 44942
  2416. 44943         sigaction(SIGALRM, &oact, (struct sigaction *) NULL);
  2417. 44944
  2418. 44945         if (current_secs > secs)
  2419. 44946                 alarm(current_secs - (secs - remaining_secs));
  2420. 44947
  2421. 44948         return(remaining_secs);
  2422. 44949   }
  2423. 44950
  2424. 44951   /* Current_secs <= secs,  ie. alarm should occur before secs.  */
  2425. 44952
  2426. 44953   alarm(current_secs);
  2427. 44954   pause();
  2428. 44955   remaining_secs = alarm(0);
  2429. 44956
  2430. 44957   alarm(remaining_secs);
  2431. 44958
  2432. 44959   return(secs - (current_secs - remaining_secs));
  2433. 44960 }
  2434. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2435. src/lib/posix/_stat.c    
  2436. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2437. 45000 #include <lib.h>
  2438. 45001 #define stat    _stat
  2439. 45002 #include <sys/stat.h>
  2440. 45003 #include <string.h>
  2441. 45004
  2442. 45005 PUBLIC int stat(name, buffer)
  2443. 45006 _CONST char *name;
  2444. 45007 struct stat *buffer;
  2445. 45008 {
  2446. 45009   message m;
  2447. 45010
  2448. 45011   m.m1_i1 = strlen(name) + 1;
  2449. 45012   m.m1_p1 = (char *) name;
  2450. 45013   m.m1_p2 = (char *) buffer;
  2451. 45014   return(_syscall(FS, STAT, &m));
  2452. 45015 }
  2453. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2454. src/lib/posix/_stime.c    
  2455. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2456. 45100 #include <lib.h>
  2457. 45101 #define stime   _stime
  2458. 45102 #include <minix/minlib.h>
  2459. 45103 #include <time.h>
  2460. 45104
  2461. 45105 PUBLIC int stime(top)
  2462. 45106 long *top;
  2463. 45107 {
  2464. 45108   message m;
  2465. 45109
  2466. 45110   m.m2_l1 = *top;
  2467. 45111   return(_syscall(FS, STIME, &m));
  2468. 45112 }
  2469. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2470. src/lib/posix/_sync.c    
  2471. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2472. 45200 #include <lib.h>
  2473. 45201 #define sync    _sync
  2474. 45202 #include <unistd.h>
  2475. 45203
  2476. 45204 PUBLIC int sync()
  2477. 45205 {
  2478. 45206   message m;
  2479. 45207
  2480. 45208   return(_syscall(FS, SYNC, &m));
  2481. 45209 }
  2482. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2483. src/lib/posix/_tcdrain.c    
  2484. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2485. 45300 /*
  2486. 45301 posix/_tcdrain.c
  2487. 45302
  2488. 45303 Created:        July 26, 1994 by Philip Homburg
  2489. 45304 */
  2490. 45305
  2491. 45306 #define tcdrain _tcdrain
  2492. 45307 #define ioctl _ioctl
  2493. 45308 #include <termios.h>
  2494. 45309 #include <sys/ioctl.h>
  2495. 45310
  2496. 45311 int tcdrain(fd)
  2497. 45312 int fd;
  2498. 45313 {
  2499. 45314   return(ioctl(fd, TCDRAIN, (void *)0));
  2500. 45315 }
  2501. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2502. src/lib/posix/_tcflow.c    
  2503. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2504. 45400 /*
  2505. 45401 posix/_tcflow.c
  2506. 45402
  2507. 45403 Created:        June 8, 1993 by Philip Homburg
  2508. 45404 */
  2509. 45405
  2510. 45406 #define tcflow _tcflow
  2511. 45407 #define ioctl _ioctl
  2512. 45408 #include <termios.h>
  2513. 45409 #include <sys/ioctl.h>
  2514. 45410
  2515. 45411 int tcflow(fd, action)
  2516. 45412 int fd;
  2517. 45413 int action;
  2518. 45414 {
  2519. 45415   return(ioctl(fd, TCFLOW, &action));
  2520. 45416 }
  2521. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2522. src/lib/posix/_tcflush.c    
  2523. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2524. 45500 /*      tcflush() - flush buffered characters           Author: Kees J. Bot
  2525. 45501  *                                                              13 Jan 1994
  2526. 45502  */
  2527. 45503 #define tcflush _tcflush
  2528. 45504 #define ioctl _ioctl
  2529. 45505 #include <termios.h>
  2530. 45506 #include <sys/ioctl.h>
  2531. 45507
  2532. 45508 int tcflush(int fd, int queue_selector)
  2533. 45509 {
  2534. 45510   return(ioctl(fd, TCFLSH, &queue_selector));
  2535. 45511 }
  2536. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2537. src/lib/posix/_tcgetattr.c    
  2538. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2539. 45600 #define tcgetattr _tcgetattr
  2540. 45601 #define ioctl _ioctl
  2541. 45602 #include <sys/ioctl.h>
  2542. 45603 #include <errno.h>
  2543. 45604 #include <termios.h>
  2544. 45605
  2545. 45606 int tcgetattr(fd, termios_p)
  2546. 45607 int fd;
  2547. 45608 struct termios *termios_p;
  2548. 45609 {
  2549. 45610   return(ioctl(fd, TCGETS, termios_p));
  2550. 45611 }
  2551. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2552. src/lib/posix/_tcsendbreak.c    
  2553. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2554. 45700 /*      tcsendbreak() - send a break                    Author: Kees J. Bot
  2555. 45701  *                                                              13 Jan 1994
  2556. 45702  */
  2557. 45703 #define tcsendbreak _tcsendbreak
  2558. 45704 #define ioctl _ioctl
  2559. 45705 #include <termios.h>
  2560. 45706 #include <sys/ioctl.h>
  2561. 45707
  2562. 45708 int tcsendbreak(int fd, int duration)
  2563. 45709 {
  2564. 45710   return(ioctl(fd, TCSBRK, &duration));
  2565. 45711 }
  2566. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2567. src/lib/posix/_tcsetattr.c    
  2568. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2569. 45800 /*
  2570. 45801 posix/_tcsetattr.c
  2571. 45802
  2572. 45803 Created:        June 11, 1993 by Philip Homburg
  2573. 45804 */
  2574. 45805
  2575. 45806 #define tcsetattr _tcsetattr
  2576. 45807 #define ioctl _ioctl
  2577. 45808 #include <errno.h>
  2578. 45809 #include <termios.h>
  2579. 45810 #include <sys/ioctl.h>
  2580. 45811 #include <sys/types.h>
  2581. 45812
  2582. 45813 int tcsetattr(fd, opt_actions, termios_p)
  2583. 45814 int fd;
  2584. 45815 int opt_actions;
  2585. 45816 _CONST struct termios *termios_p;
  2586. 45817 {
  2587. 45818   int request;
  2588. 45819
  2589. 45820   switch(opt_actions)
  2590. 45821   {
  2591. 45822     case TCSANOW:       request = TCSETS;       break;
  2592. 45823     case TCSADRAIN:     request = TCSETSW;      break;
  2593. 45824     case TCSAFLUSH:     request = TCSETSF;      break;
  2594. 45825     default:            errno = EINVAL;         return(-1);
  2595. 45826   };
  2596. 45827   return(ioctl(fd, request, (void *) termios_p));
  2597. 45828 }
  2598. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2599. src/lib/posix/_time.c    
  2600. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2601. 45900 #include <lib.h>
  2602. 45901 #define time    _time
  2603. 45902 #include <time.h>
  2604. 45903
  2605. 45904 PUBLIC time_t time(tp)
  2606. 45905 time_t *tp;
  2607. 45906 {
  2608. 45907   message m;
  2609. 45908
  2610. 45909   if (_syscall(FS, TIME, &m) < 0) return( (time_t) -1);
  2611. 45910   if (tp != (time_t *) 0) *tp = m.m2_l1;
  2612. 45911   return(m.m2_l1);
  2613. 45912 }
  2614. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2615. src/lib/posix/_times.c    
  2616. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2617. 46000 #include <lib.h>
  2618. 46001 #define times   _times
  2619. 46002 #include <sys/times.h>
  2620. 46003 #include <time.h>
  2621. 46004
  2622. 46005 PUBLIC clock_t times(buf)
  2623. 46006 struct tms *buf;
  2624. 46007 {
  2625. 46008   message m;
  2626. 46009
  2627. 46010   m.m4_l5 = 0;                  /* return this if system is pre-1.6 */
  2628. 46011   if (_syscall(FS, TIMES, &m) < 0) return( (clock_t) -1);
  2629. 46012   buf->tms_utime = m.m4_l1;
  2630. 46013   buf->tms_stime = m.m4_l2;
  2631. 46014   buf->tms_cutime = m.m4_l3;
  2632. 46015   buf->tms_cstime = m.m4_l4;
  2633. 46016   return(m.m4_l5);
  2634. 46017 }
  2635. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2636. src/lib/posix/_umask.c    
  2637. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2638. 46100 #include <lib.h>
  2639. 46101 #define umask   _umask
  2640. 46102 #include <sys/stat.h>
  2641. 46103
  2642. 46104 PUBLIC mode_t umask(complmode)
  2643. 46105 Mode_t complmode;
  2644. 46106 {
  2645. 46107   message m;
  2646. 46108
  2647. 46109   m.m1_i1 = complmode;
  2648. 46110   return( (mode_t) _syscall(FS, UMASK, &m));
  2649. 46111 }
  2650. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2651. src/lib/posix/_umount.c    
  2652. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2653. 46200 #include <lib.h>
  2654. 46201 #define umount  _umount
  2655. 46202 #include <unistd.h>
  2656. 46203
  2657. 46204 PUBLIC int umount(name)
  2658. 46205 _CONST char *name;
  2659. 46206 {
  2660. 46207   message m;
  2661. 46208
  2662. 46209   _loadname(name, &m);
  2663. 46210   return(_syscall(FS, UMOUNT, &m));
  2664. 46211 }
  2665. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2666. src/lib/posix/_uname.c    
  2667. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2668. 46300 /*      uname() - get system info                       Author: Kees J. Bot
  2669. 46301  *                                                              7 Nov 1994
  2670. 46302  * Returns information about the Minix system.  Alas most
  2671. 46303  * of it is gathered at compile time, so machine is wrong, and
  2672. 46304  * release and version become wrong if not recompiled.
  2673. 46305  * More chip types and Minix versions need to be added.
  2674. 46306  */
  2675. 46307 #define uname   _uname
  2676. 46308 #define open    _open
  2677. 46309 #define read    _read
  2678. 46310 #define close   _close
  2679. 46311 #include <sys/types.h>
  2680. 46312 #include <sys/utsname.h>
  2681. 46313 #include <unistd.h>
  2682. 46314 #include <fcntl.h>
  2683. 46315 #include <string.h>
  2684. 46316 #include <errno.h>
  2685. 46317 #include <minix/config.h>
  2686. 46318 #include <minix/minlib.h>
  2687. 46319
  2688. 46320 int uname(name) struct utsname *name;
  2689. 46321 {
  2690. 46322   int hf, n, err;
  2691. 46323   char *nl;
  2692. 46324
  2693. 46325   /* Read the node name from /etc/hostname.file. */
  2694. 46326   if ((hf = open("/etc/hostname.file", O_RDONLY)) < 0) {
  2695. 46327         if (errno != ENOENT) return(-1);
  2696. 46328         strcpy(name->nodename, "noname");
  2697. 46329   } else {
  2698. 46330         n = read(hf, name->nodename, sizeof(name->nodename) - 1);
  2699. 46331         err = errno;
  2700. 46332         close(hf);
  2701. 46333         errno = err;
  2702. 46334         if (n < 0) return(-1);
  2703. 46335         name->nodename[n] = 0;
  2704. 46336         if ((nl = strchr(name->nodename, 'n')) != NULL) {
  2705. 46337                 memset(nl, 0, (name->nodename + sizeof(name->nodename)) - nl);
  2706. 46338         }
  2707. 46339   }
  2708. 46340
  2709. 46341   strcpy(name->sysname, "Minix");
  2710. 46342   strcpy(name->release, OS_RELEASE);
  2711. 46343   strcpy(name->version, OS_VERSION);
  2712. 46344 #if (CHIP == INTEL)
  2713. 46345   name->machine[0] = 'i';
  2714. 46346   strcpy(name->machine + 1, itoa(getprocessor()));
  2715. 46347 #if _WORD_SIZE == 4
  2716. 46348   strcpy(name->arch, "i386");
  2717. 46349 #else
  2718. 46350   strcpy(name->arch, "i86");
  2719. 46351 #endif
  2720. 46352 #endif
  2721. 46353   return(0);
  2722. 46354 }
  2723. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2724. src/lib/posix/_unlink.c    
  2725. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2726. 46400 #include <lib.h>
  2727. 46401 #define unlink  _unlink
  2728. 46402 #include <unistd.h>
  2729. 46403
  2730. 46404 PUBLIC int unlink(name)
  2731. 46405 _CONST char *name;
  2732. 46406 {
  2733. 46407   message m;
  2734. 46408
  2735. 46409   _loadname(name, &m);
  2736. 46410   return(_syscall(FS, UNLINK, &m));
  2737. 46411 }
  2738. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2739. src/lib/posix/_utime.c    
  2740. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2741. 46500 /* utime(2) for POSIX           Authors: Terrence W. Holm & Edwin L. Froese */
  2742. 46501
  2743. 46502 #include <lib.h>
  2744. 46503 #define utime   _utime
  2745. 46504 #include <string.h>
  2746. 46505 #include <utime.h>
  2747. 46506
  2748. 46507 PUBLIC int utime(name, timp)
  2749. 46508 _CONST char *name;
  2750. 46509 _CONST struct utimbuf *timp;
  2751. 46510 {
  2752. 46511   message m;
  2753. 46512
  2754. 46513   if (timp == NULL) {
  2755. 46514         m.m2_i1 = 0;            /* name size 0 means NULL `timp' */
  2756. 46515         m.m2_i2 = strlen(name) + 1;     /* actual size here */
  2757. 46516   } else {
  2758. 46517         m.m2_l1 = timp->actime;
  2759. 46518         m.m2_l2 = timp->modtime;
  2760. 46519         m.m2_i1 = strlen(name) + 1;
  2761. 46520   }
  2762. 46521   m.m2_p1 = (char *) name;
  2763. 46522   return(_syscall(FS, UTIME, &m));
  2764. 46523 }
  2765. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2766. src/lib/posix/_wait.c    
  2767. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2768. 46600 #include <lib.h>
  2769. 46601 #define wait    _wait
  2770. 46602 #include <sys/wait.h>
  2771. 46603
  2772. 46604 PUBLIC pid_t wait(status)
  2773. 46605 int *status;
  2774. 46606 {
  2775. 46607   message m;
  2776. 46608
  2777. 46609   if (_syscall(MM, WAIT, &m) < 0) return(-1);
  2778. 46610   if (status != 0) *status = m.m2_i1;
  2779. 46611   return(m.m_type);
  2780. 46612 }
  2781. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2782. src/lib/posix/_waitpid.c    
  2783. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2784. 46700 #include <lib.h>
  2785. 46701 #define waitpid _waitpid
  2786. 46702 #include <sys/wait.h>
  2787. 46703
  2788. 46704 PUBLIC pid_t waitpid(pid, status, options)
  2789. 46705 pid_t pid;
  2790. 46706 int *status;
  2791. 46707 int options;
  2792. 46708 {
  2793. 46709   message m;
  2794. 46710
  2795. 46711   m.m1_i1 = pid;
  2796. 46712   m.m1_i2 = options;
  2797. 46713   if (_syscall(MM, WAITPID, &m) < 0) return(-1);
  2798. 46714   if (status != 0) *status = m.m2_i1;
  2799. 46715   return m.m_type;
  2800. 46716 }
  2801. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2802. src/lib/posix/_write.c    
  2803. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2804. 46800 #include <lib.h>
  2805. 46801 #define write   _write
  2806. 46802 #include <unistd.h>
  2807. 46803
  2808. 46804 PUBLIC ssize_t write(fd, buffer, nbytes)
  2809. 46805 int fd;
  2810. 46806 _CONST void *buffer;
  2811. 46807 size_t nbytes;
  2812. 46808 {
  2813. 46809   message m;
  2814. 46810
  2815. 46811   m.m1_i1 = fd;
  2816. 46812   m.m1_i2 = nbytes;
  2817. 46813   m.m1_p1 = (char *) buffer;
  2818. 46814   return(_syscall(FS, WRITE, &m));
  2819. 46815 }
  2820. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2821. src/lib/stdio/loc_incl.h    
  2822. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2823. 46900 /*
  2824. 46901  * loc_incl.h - local include file for stdio library
  2825. 46902  */
  2826. 46903 /* $Header: loc_incl.h,v 1.5 91/06/10 17:07:18 ceriel Exp $ */
  2827. 46904
  2828. 46905 #include        <stdio.h>
  2829. 46906
  2830. 46907 #define io_testflag(p,x)        ((p)->_flags & (x))
  2831. 46908
  2832. 46909 #include        <stdarg.h>
  2833. 46910
  2834. 46911 #ifdef _ANSI
  2835. 46912 int _doprnt(const char *format, va_list ap, FILE *stream);
  2836. 46913 int _doscan(FILE * stream, const char *format, va_list ap);
  2837. 46914 char *_i_compute(unsigned long val, int base, char *s, int nrdigits);
  2838. 46915 char *_f_print(va_list *ap, int flags, char *s, char c, int precision);
  2839. 46916 void __cleanup(void);
  2840. 46917
  2841. 46918 FILE *popen(const char *command, const char *type);
  2842. 46919 FILE *fdopen(int fd, const char *mode);
  2843. 46920
  2844. 46921 #ifndef NOFLOAT
  2845. 46922 char *_ecvt(long double value, int ndigit, int *decpt, int *sign);
  2846. 46923 char *_fcvt(long double value, int ndigit, int *decpt, int *sign);
  2847. 46924 #endif  /* NOFLOAT */
  2848. 46925 #endif
  2849. 46926
  2850. 46927 #define FL_LJUST        0x0001          /* left-justify field */
  2851. 46928 #define FL_SIGN         0x0002          /* sign in signed conversions */
  2852. 46929 #define FL_SPACE        0x0004          /* space in signed conversions */
  2853. 46930 #define FL_ALT          0x0008          /* alternate form */
  2854. 46931 #define FL_ZEROFILL     0x0010          /* fill with zero's */
  2855. 46932 #define FL_SHORT        0x0020          /* optional h */
  2856. 46933 #define FL_LONG         0x0040          /* optional l */
  2857. 46934 #define FL_LONGDOUBLE   0x0080          /* optional L */
  2858. 46935 #define FL_WIDTHSPEC    0x0100          /* field width is specified */
  2859. 46936 #define FL_PRECSPEC     0x0200          /* precision is specified */
  2860. 46937 #define FL_SIGNEDCONV   0x0400          /* may contain a sign */
  2861. 46938 #define FL_NOASSIGN     0x0800          /* do not assign (in scanf) */
  2862. 46939 #define FL_NOMORE       0x1000          /* all flags collected */
  2863. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2864. src/lib/stdio/clearerr.c    
  2865. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2866. 47000 /*
  2867. 47001  * clearerr.c - clear error and end-of-file indicators of a stream
  2868. 47002  */
  2869. 47003 /* $Header: clearerr.c,v 1.2 91/01/03 14:23:54 ceriel Exp $ */
  2870. 47004
  2871. 47005 #include        <stdio.h>
  2872. 47006
  2873. 47007 void
  2874. 47008 (clearerr)(FILE *stream)
  2875. 47009 {
  2876. 47010         clearerr(stream);
  2877. 47011 }
  2878. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2879. src/lib/stdio/data.c    
  2880. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2881. 47100 /*
  2882. 47101  * data.c - this is the initialization for the standard streams
  2883. 47102  */
  2884. 47103 /* $Header: data.c,v 1.3 90/04/09 15:35:09 eck Exp $ */
  2885. 47104
  2886. 47105 #include        <stdio.h>
  2887. 47106
  2888. 47107 struct __iobuf __stdin = {
  2889. 47108         0, 0, _IOREAD, 0,
  2890. 47109         (unsigned char *)NULL, (unsigned char *)NULL, 
  2891. 47110 };
  2892. 47111
  2893. 47112 struct __iobuf __stdout = {
  2894. 47113         0, 1, _IOWRITE, 0,
  2895. 47114         (unsigned char *)NULL, (unsigned char *)NULL, 
  2896. 47115 };
  2897. 47116
  2898. 47117 struct __iobuf __stderr = {
  2899. 47118         0, 2, _IOWRITE | _IOLBF, 0,
  2900. 47119         (unsigned char *)NULL, (unsigned char *)NULL, 
  2901. 47120 };
  2902. 47121
  2903. 47122 FILE *__iotab[FOPEN_MAX] = {
  2904. 47123         &__stdin,
  2905. 47124         &__stdout,
  2906. 47125         &__stderr,
  2907. 47126         0
  2908. 47127 };
  2909. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2910. src/lib/stdio/doprnt.c    
  2911. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2912. 47200 /*
  2913. 47201  * doprnt.c - print formatted output
  2914. 47202  */
  2915. 47203 /* $Header: doprnt.c,v 1.8 91/06/10 17:06:53 ceriel Exp $ */
  2916. 47204
  2917. 47205 #include        <ctype.h>
  2918. 47206 #include        <stdio.h>
  2919. 47207 #include        <stdarg.h>
  2920. 47208 #include        <string.h>
  2921. 47209 #include        "loc_incl.h"
  2922. 47210
  2923. 47211 /* gnum() is used to get the width and precision fields of a format. */
  2924. 47212 static const char *
  2925. 47213 gnum(register const char *f, int *ip, va_list *app)
  2926. 47214 {
  2927. 47215         register int    i, c;
  2928. 47216
  2929. 47217         if (*f == '*') {
  2930. 47218                 *ip = va_arg((*app), int);
  2931. 47219                 f++;
  2932. 47220         } else {
  2933. 47221                 i = 0;
  2934. 47222                 while ((c = *f - '0') >= 0 && c <= 9) {
  2935. 47223                         i = i*10 + c;
  2936. 47224                         f++;
  2937. 47225                 }
  2938. 47226                 *ip = i;
  2939. 47227         }
  2940. 47228         return f;
  2941. 47229 }
  2942. 47231 #if     _EM_WSIZE == _EM_PSIZE
  2943. 47232 #define set_pointer(flags)                              /* nothing */
  2944. 47233 #elif   _EM_LSIZE == _EM_PSIZE
  2945. 47234 #define set_pointer(flags)      (flags |= FL_LONG)
  2946. 47235 #else
  2947. 47236 #error garbage pointer size
  2948. 47237 #define set_pointer(flags)              /* compilation might continue */
  2949. 47238 #endif
  2950. 47239
  2951. 47240 /* print an ordinal number */
  2952. 47241 static char *
  2953. 47242 o_print(va_list *ap, int flags, char *s, char c, int precision, int is_signed)
  2954. 47243 {
  2955. 47244         long signed_val;
  2956. 47245         unsigned long unsigned_val;
  2957. 47246         char *old_s = s;
  2958. 47247         int base;
  2959. 47248
  2960. 47249         switch (flags & (FL_SHORT | FL_LONG)) {
  2961. 47250         case FL_SHORT:
  2962. 47251                 if (is_signed) {
  2963. 47252                         signed_val = (short) va_arg(*ap, int);
  2964. 47253                 } else {
  2965. 47254                         unsigned_val = (unsigned short) va_arg(*ap, unsigned);
  2966. 47255                 }
  2967. 47256                 break;
  2968. 47257         case FL_LONG:
  2969. 47258                 if (is_signed) {
  2970. 47259                         signed_val = va_arg(*ap, long);
  2971. 47260                 } else {
  2972. 47261                         unsigned_val = va_arg(*ap, unsigned long);
  2973. 47262                 }
  2974. 47263                 break;
  2975. 47264         default:
  2976. 47265                 if (is_signed) {
  2977. 47266                         signed_val = va_arg(*ap, int);
  2978. 47267                 } else {
  2979. 47268                         unsigned_val = va_arg(*ap, unsigned int);
  2980. 47269                 }
  2981. 47270                 break;
  2982. 47271         }
  2983. 47272
  2984. 47273         if (is_signed) {
  2985. 47274                 if (signed_val < 0) {
  2986. 47275                         *s++ = '-';
  2987. 47276                         signed_val = -signed_val;
  2988. 47277                 } else if (flags & FL_SIGN) *s++ = '+';
  2989. 47278                 else if (flags & FL_SPACE) *s++ = ' ';
  2990. 47279                 unsigned_val = signed_val;
  2991. 47280         }
  2992. 47281         if ((flags & FL_ALT) && (c == 'o')) *s++ = '0';
  2993. 47282         if (!unsigned_val) {
  2994. 47283                  if (!precision)
  2995. 47284                         return s;
  2996. 47285         } else if (((flags & FL_ALT) && (c == 'x' || c == 'X'))
  2997. 47286                     || c == 'p') {
  2998. 47287                 *s++ = '0';
  2999. 47288                 *s++ = (c == 'X' ? 'X' : 'x');
  3000. 47289         }
  3001. 47290
  3002. 47291         switch (c) {
  3003. 47292         case 'b':       base = 2;       break;
  3004. 47293         case 'o':       base = 8;       break;
  3005. 47294         case 'd':
  3006. 47295         case 'i':
  3007. 47296         case 'u':       base = 10;      break;
  3008. 47297         case 'x':
  3009. 47298         case 'X':
  3010. 47299         case 'p':       base = 16;      break;
  3011. 47300         }
  3012. 47301
  3013. 47302         s = _i_compute(unsigned_val, base, s, precision);
  3014. 47303
  3015. 47304         if (c == 'X')
  3016. 47305                 while (old_s != s) {
  3017. 47306                         *old_s = toupper(*old_s);
  3018. 47307                         old_s++;
  3019. 47308                 }
  3020. 47309
  3021. 47310         return s;
  3022. 47311 }
  3023. 47313 int
  3024. 47314 _doprnt(register const char *fmt, va_list ap, FILE *stream)
  3025. 47315 {
  3026. 47316         register char   *s;
  3027. 47317         register int    j;
  3028. 47318         int             i, c, width, precision, zfill, flags, between_fill;
  3029. 47319         int             nrchars=0;
  3030. 47320         const char      *oldfmt;
  3031. 47321         char            *s1, buf[1025];
  3032. 47322
  3033. 47323         while (c = *fmt++) {
  3034. 47324                 if (c != '%') {
  3035. 47325 #ifdef  CPM
  3036. 47326                         if (c == 'n') {
  3037. 47327                                 if (putc('r', stream) == EOF)
  3038. 47328                                         return nrchars ? -nrchars : -1;
  3039. 47329                                 nrchars++;
  3040. 47330                         }
  3041. 47331 #endif
  3042. 47332                         if (putc(c, stream) == EOF)
  3043. 47333                                 return nrchars ? -nrchars : -1;
  3044. 47334                         nrchars++;
  3045. 47335                         continue;
  3046. 47336                 }
  3047. 47337                 flags = 0;
  3048. 47338                 do {
  3049. 47339                         switch(*fmt) {
  3050. 47340                         case '-':       flags |= FL_LJUST;      break;
  3051. 47341                         case '+':       flags |= FL_SIGN;       break;
  3052. 47342                         case ' ':       flags |= FL_SPACE;      break;
  3053. 47343                         case '#':       flags |= FL_ALT;        break;
  3054. 47344                         case '0':       flags |= FL_ZEROFILL;   break;
  3055. 47345                         default:        flags |= FL_NOMORE;     continue;
  3056. 47346                         }
  3057. 47347                         fmt++;
  3058. 47348                 } while(!(flags & FL_NOMORE));
  3059. 47349
  3060. 47350                 oldfmt = fmt;
  3061. 47351                 fmt = gnum(fmt, &width, &ap);
  3062. 47352                 if (fmt != oldfmt) flags |= FL_WIDTHSPEC;
  3063. 47353
  3064. 47354                 if (*fmt == '.') {
  3065. 47355                         fmt++; oldfmt = fmt;
  3066. 47356                         fmt = gnum(fmt, &precision, &ap);
  3067. 47357                         if (precision >= 0) flags |= FL_PRECSPEC;
  3068. 47358                 }
  3069. 47359
  3070. 47360                 if ((flags & FL_WIDTHSPEC) && width < 0) {
  3071. 47361                         width = -width;
  3072. 47362                         flags |= FL_LJUST;
  3073. 47363                 }
  3074. 47364                 if (!(flags & FL_WIDTHSPEC)) width = 0;
  3075. 47365
  3076. 47366                 if (flags & FL_SIGN) flags &= ~FL_SPACE;
  3077. 47367
  3078. 47368                 if (flags & FL_LJUST) flags &= ~FL_ZEROFILL;
  3079. 47369
  3080. 47370
  3081. 47371                 s = s1 = buf;
  3082. 47372
  3083. 47373                 switch (*fmt) {
  3084. 47374                 case 'h':       flags |= FL_SHORT; fmt++; break;
  3085. 47375                 case 'l':       flags |= FL_LONG; fmt++; break;
  3086. 47376                 case 'L':       flags |= FL_LONGDOUBLE; fmt++; break;
  3087. 47377                 }
  3088. 47378
  3089. 47379                 switch (c = *fmt++) {
  3090. 47380                 default:
  3091. 47381 #ifdef  CPM
  3092. 47382                         if (c == 'n') {
  3093. 47383                                 if (putc('r', stream) == EOF)
  3094. 47384                                         return nrchars ? -nrchars : -1;
  3095. 47385                                 nrchars++;
  3096. 47386                         }
  3097. 47387 #endif
  3098. 47388                         if (putc(c, stream) == EOF)
  3099. 47389                                 return nrchars ? -nrchars : -1;
  3100. 47390                         nrchars++;
  3101. 47391                         continue;
  3102. 47392                 case 'n':
  3103. 47393                         if (flags & FL_SHORT)
  3104. 47394                                 *va_arg(ap, short *) = (short) nrchars;
  3105. 47395                         else if (flags & FL_LONG)
  3106. 47396                                 *va_arg(ap, long *) = (long) nrchars;
  3107. 47397                         else
  3108. 47398                                 *va_arg(ap, int *) = (int) nrchars;
  3109. 47399                         continue;
  3110. 47400                 case 's':
  3111. 47401                         s1 = va_arg(ap, char *);
  3112. 47402                         if (s1 == NULL)
  3113. 47403                                 s1 = "(null)";
  3114. 47404                         s = s1;
  3115. 47405                         while (precision || !(flags & FL_PRECSPEC)) {
  3116. 47406                                 if (*s == '')
  3117. 47407                                         break;
  3118. 47408                                 s++;
  3119. 47409                                 precision--;
  3120. 47410                         }
  3121. 47411                         break;
  3122. 47412                 case 'p':
  3123. 47413                         set_pointer(flags);
  3124. 47414                         /* fallthrough */
  3125. 47415                 case 'b':
  3126. 47416                 case 'o':
  3127. 47417                 case 'u':
  3128. 47418                 case 'x':
  3129. 47419                 case 'X':
  3130. 47420                         if (!(flags & FL_PRECSPEC)) precision = 1;
  3131. 47421                         else if (c != 'p') flags &= ~FL_ZEROFILL;
  3132. 47422                         s = o_print(&ap, flags, s, c, precision, 0);
  3133. 47423                         break;
  3134. 47424                 case 'd':
  3135. 47425                 case 'i':
  3136. 47426                         flags |= FL_SIGNEDCONV;
  3137. 47427                         if (!(flags & FL_PRECSPEC)) precision = 1;
  3138. 47428                         else flags &= ~FL_ZEROFILL;
  3139. 47429                         s = o_print(&ap, flags, s, c, precision, 1);
  3140. 47430                         break;
  3141. 47431                 case 'c':
  3142. 47432                         *s++ = va_arg(ap, int);
  3143. 47433                         break;
  3144. 47434 #ifndef NOFLOAT
  3145. 47435                 case 'G':
  3146. 47436                 case 'g':
  3147. 47437                         if ((flags & FL_PRECSPEC) && (precision == 0))
  3148. 47438                                 precision = 1;
  3149. 47439                 case 'f':
  3150. 47440                 case 'E':
  3151. 47441                 case 'e':
  3152. 47442                         if (!(flags & FL_PRECSPEC)) 
  3153. 47443                                 precision = 6;
  3154. 47444
  3155. 47445                         if (precision >= sizeof(buf))
  3156. 47446                                 precision = sizeof(buf) - 1;
  3157. 47447
  3158. 47448                         flags |= FL_SIGNEDCONV;
  3159. 47449                         s = _f_print(&ap, flags, s, c, precision);
  3160. 47450                         break;
  3161. 47451 #endif  /* NOFLOAT */
  3162. 47452                 case 'r':
  3163. 47453                         ap = va_arg(ap, va_list);
  3164. 47454                         fmt = va_arg(ap, char *);
  3165. 47455                         continue;
  3166. 47456                 }
  3167. 47457                 zfill = ' ';
  3168. 47458                 if (flags & FL_ZEROFILL) zfill = '0';
  3169. 47459                 j = s - s1;
  3170. 47460
  3171. 47461                 /* between_fill is true under the following conditions:
  3172. 47462                  * 1- the fill character is '0'
  3173. 47463                  * and
  3174. 47464                  * 2a- the number is of the form 0x... or 0X...
  3175. 47465                  * or
  3176. 47466                  * 2b- the number contains a sign or space
  3177. 47467                  */
  3178. 47468                 between_fill = 0;
  3179. 47469                 if ((flags & FL_ZEROFILL)
  3180. 47470                     && (((c == 'x' || c == 'X') && (flags & FL_ALT))
  3181. 47471                         || (c == 'p')
  3182. 47472                         || ((flags & FL_SIGNEDCONV)
  3183. 47473                             && ( *s1 == '+' || *s1 == '-' || *s1 == ' '))))
  3184. 47474                         between_fill++;
  3185. 47475
  3186. 47476                 if ((i = width - j) > 0)
  3187. 47477                         if (!(flags & FL_LJUST)) {      /* right justify */
  3188. 47478                                 nrchars += i;
  3189. 47479                                 if (between_fill) {
  3190. 47480                                     if (flags & FL_SIGNEDCONV) {
  3191. 47481                                         j--; nrchars++;
  3192. 47482                                         if (putc(*s1++, stream) == EOF)
  3193. 47483                                                 return nrchars ? -nrchars : -1;
  3194. 47484                                     } else {
  3195. 47485                                         j -= 2; nrchars += 2;
  3196. 47486                                         if ((putc(*s1++, stream) == EOF)
  3197. 47487                                             || (putc(*s1++, stream) == EOF))
  3198. 47488                                                 return nrchars ? -nrchars : -1;
  3199. 47489                                     }
  3200. 47490                                 }
  3201. 47491                                 do {
  3202. 47492                                         if (putc(zfill, stream) == EOF)
  3203. 47493                                                 return nrchars ? -nrchars : -1;
  3204. 47494                                 } while (--i);
  3205. 47495                         }
  3206. 47496
  3207. 47497                 nrchars += j;
  3208. 47498                 while (--j >= 0) {
  3209. 47499                         if (putc(*s1++, stream) == EOF)
  3210. 47500                                 return nrchars ? -nrchars : -1;
  3211. 47501                 }
  3212. 47502
  3213. 47503                 if (i > 0) nrchars += i;
  3214. 47504                 while (--i >= 0)
  3215. 47505                         if (putc(zfill, stream) == EOF)
  3216. 47506                                 return nrchars ? -nrchars : -1;
  3217. 47507         }
  3218. 47508         return nrchars;
  3219. 47509 }
  3220. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3221. src/lib/stdio/doscan.c    
  3222. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3223. 47600 /*
  3224. 47601  * doscan.c - scan formatted input
  3225. 47602  */
  3226. 47603 /* $Header: doscan.c,v 1.9 91/03/26 18:41:47 ceriel Exp $ */
  3227. 47604
  3228. 47605 #include        <stdio.h>
  3229. 47606 #include        <stdlib.h>
  3230. 47607 #include        <ctype.h>
  3231. 47608 #include        <stdarg.h>
  3232. 47609 #include        "loc_incl.h"
  3233. 47610
  3234. 47611 #if     _EM_WSIZE == _EM_PSIZE
  3235. 47612 #define set_pointer(flags)                              /* nothing */
  3236. 47613 #elif   _EM_LSIZE == _EM_PSIZE
  3237. 47614 #define set_pointer(flags)      (flags |= FL_LONG)
  3238. 47615 #else
  3239. 47616 #error garbage pointer size
  3240. 47617 #define set_pointer(flags)              /* compilation might continue */
  3241. 47618 #endif
  3242. 47619
  3243. 47620 #define NUMLEN  512
  3244. 47621 #define NR_CHARS        256
  3245. 47622
  3246. 47623 static char     Xtable[NR_CHARS];
  3247. 47624 static char     inp_buf[NUMLEN];
  3248. 47625
  3249. 47626 /* Collect a number of characters which constitite an ordinal number.
  3250. 47627  * When the type is 'i', the base can be 8, 10, or 16, depending on the
  3251. 47628  * first 1 or 2 characters. This means that the base must be adjusted
  3252. 47629  * according to the format of the number. At the end of the function, base
  3253. 47630  * is then set to 0, so strtol() will get the right argument.
  3254. 47631  */
  3255. 47632 static char *
  3256. 47633 o_collect(register int c, register FILE *stream, char type,
  3257. 47634                         unsigned int width, int *basep)
  3258. 47635 {
  3259. 47636         register char *bufp = inp_buf;
  3260. 47637         register int base;
  3261. 47638
  3262. 47639         switch (type) {
  3263. 47640         case 'i':       /* i means octal, decimal or hexadecimal */
  3264. 47641         case 'p':
  3265. 47642         case 'x':
  3266. 47643         case 'X':       base = 16;      break;
  3267. 47644         case 'd':
  3268. 47645         case 'u':       base = 10;      break;
  3269. 47646         case 'o':       base = 8;       break;
  3270. 47647         case 'b':       base = 2;       break;
  3271. 47648         }
  3272. 47649
  3273. 47650         if (c == '-' || c == '+') {
  3274. 47651                 *bufp++ = c;