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

操作系统开发

开发平台:

WINDOWS

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