home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / std_unix / mod.std.unix.v3 < prev    next >
Internet Message Format  |  1987-06-30  |  105KB

  1. From jsq  Sun Nov  3 13:13:26 1985
  2. Path: ut-sally!std-unix
  3. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  4. Newsgroups: mod.std.unix
  5. Subject: mod.std.unix Volume 3
  6. Message-Id: <3351@ut-sally.UUCP>
  7. Date: 3 Nov 85 19:13:20 GMT
  8. Organization: IEEE/P1003 Portable Operating System Environment Committee
  9. Lines: 35
  10. Approved: jsq@ut-sally.UUCP
  11. Draft-9: mod.std.unix
  12.  
  13. As I gave a paper copy of volumes one and two of mod.std.unix to the
  14. P1003 chair at the Steering Group meeting in Dallas, it is convenient
  15. to start Volume 3, of which this is Number 1.  Friday was not the first
  16. time the committee had seen articles from the newsgroup, by the way,
  17. since several members follow it closely and I tend to directly forward
  18. specific articles of interest to the chair.  Your input is seen and
  19. taken into account.
  20.  
  21.  
  22. The USENET newsgroup mod.std.unix is for discussions of UNIX standards,
  23. particularly the IEEE P1003 draft standard.  It is also distributed
  24. in an ARPA Internet mailing list.  I'm the moderator, which mostly
  25. means I post what you send me.
  26.  
  27. Submissions-To:    ut-sally!std-unix    or std-unix@sally.UTEXAS.EDU
  28. Comments-To: ut-sally!std-unix-request    or std-unix-request@sally.UTEXAS.EDU
  29. UUCP-Routes: {ihnp4,seismo,harvard,gatech}!ut-sally!std-unix
  30.  
  31. Permission to post to the newsgroup is assumed for mail to std-unix.
  32. Permission to post is not assumed for mail to std-unix-request,
  33. unless explicitly granted in the mail.  Mail to my personal addresses
  34. will be treated like mail to std-unix-request if it obviously refers
  35. to the newsgroup.
  36.  
  37. Archives may be found on sally.UTEXAS.EDU.  The current volume may
  38. be retreived by anonymous ftp (login anonymous, password guest)
  39. as ~ftp/pub/mod.std.unix, while the previous volumes may be retrieved
  40. as ~ftp/pub/mod.std.unix.v1 and ~ftp/pub/mod.std.unix.v2.
  41.  
  42. Finally, remember that any remarks by any committee member (especially
  43. including me) in this newsgroup do not represent any position (including
  44. any draft, proposed or actual, of the standard) of the committee as a
  45. whole, unless explicitly stated otherwise in such remarks.
  46.  
  47. Volume-Number: Volume 3, Number 1
  48.  
  49. From jsq  Sun Nov  3 13:34:21 1985
  50. Path: ut-sally!std-unix
  51. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  52. Newsgroups: mod.std.unix
  53. Subject: public domain AT&T getopt source
  54. Message-Id: <3352@ut-sally.UUCP>
  55. Date: 3 Nov 85 19:34:15 GMT
  56. Organization: IEEE/P1003 Portable Operating System Environment Committee
  57. Lines: 91
  58. Approved: jsq@ut-sally.UUCP
  59. Draft-9: 1003.2.getopt
  60.  
  61. Here's something you've all been waiting for:  the AT&T public domain
  62. source for getopt(3).  It is the code which was given out at the 1985
  63. UNIFORUM conference in Dallas.  I obtained it by electronic mail
  64. directly from AT&T.  The people there assure me that it is indeed
  65. in the public domain.
  66.  
  67. There is no manual page.  That is because the one they gave out at
  68. UNIFORUM was slightly different from the current System V Release 2
  69. manual page.  The difference apparently involved a note about the
  70. famous rules 5 and 6, recommending using white space between an option
  71. and its first argument, and not grouping options that have arguments.
  72. Getopt itself is currently lenient about both of these things White
  73. space is allowed, but not mandatory, and the last option in a group can
  74. have an argument.  That particular version of the man page evidently
  75. has no official existence, and my source at AT&T did not send a copy.
  76. The current SVR2 man page reflects the actual behavor of this getopt.
  77. However, I am not about to post a copy of anything licensed by AT&T.
  78.  
  79. I will submit this source to Berkeley as a bug fix.
  80.  
  81. I, personally, make no claims or guarantees of any kind about the
  82. following source.  I did compile it to get some confidence that
  83. it arrived whole, but beyond that you're on your own.
  84.  
  85.  
  86. /*LINTLIBRARY*/
  87. #define NULL    0
  88. #define EOF    (-1)
  89. #define ERR(s, c)    if(opterr){\
  90.     extern int strlen(), write();\
  91.     char errbuf[2];\
  92.     errbuf[0] = c; errbuf[1] = '\n';\
  93.     (void) write(2, argv[0], (unsigned)strlen(argv[0]));\
  94.     (void) write(2, s, (unsigned)strlen(s));\
  95.     (void) write(2, errbuf, 2);}
  96.  
  97. extern int strcmp();
  98. extern char *strchr();
  99.  
  100. int    opterr = 1;
  101. int    optind = 1;
  102. int    optopt;
  103. char    *optarg;
  104.  
  105. int
  106. getopt(argc, argv, opts)
  107. int    argc;
  108. char    **argv, *opts;
  109. {
  110.     static int sp = 1;
  111.     register int c;
  112.     register char *cp;
  113.  
  114.     if(sp == 1)
  115.         if(optind >= argc ||
  116.            argv[optind][0] != '-' || argv[optind][1] == '\0')
  117.             return(EOF);
  118.         else if(strcmp(argv[optind], "--") == NULL) {
  119.             optind++;
  120.             return(EOF);
  121.         }
  122.     optopt = c = argv[optind][sp];
  123.     if(c == ':' || (cp=strchr(opts, c)) == NULL) {
  124.         ERR(": illegal option -- ", c);
  125.         if(argv[optind][++sp] == '\0') {
  126.             optind++;
  127.             sp = 1;
  128.         }
  129.         return('?');
  130.     }
  131.     if(*++cp == ':') {
  132.         if(argv[optind][sp+1] != '\0')
  133.             optarg = &argv[optind++][sp+1];
  134.         else if(++optind >= argc) {
  135.             ERR(": option requires an argument -- ", c);
  136.             sp = 1;
  137.             return('?');
  138.         } else
  139.             optarg = argv[optind++];
  140.         sp = 1;
  141.     } else {
  142.         if(argv[optind][++sp] == '\0') {
  143.             sp = 1;
  144.             optind++;
  145.         }
  146.         optarg = NULL;
  147.     }
  148.     return(c);
  149. }
  150.  
  151. Volume-Number: Volume 3, Number 2
  152.  
  153. From jsq  Sun Nov  3 16:43:52 1985
  154. Path: ut-sally!std-unix
  155. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  156. Newsgroups: mod.std.unix
  157. Subject: Comments on UNIX command option syntax
  158. Message-Id: <3355@ut-sally.UUCP>
  159. Date: 3 Nov 85 22:43:32 GMT
  160. Organization: IEEE/P1003 Portable Operating System Environment Committee
  161. Lines: 231
  162. Approved: jsq@ut-sally.UUCP
  163. Draft-9: 1003.2.getopt
  164.  
  165. [ I've picked this up from net.unix.  It explains what the rules 5 and 6 are,
  166. regarding getopt(3).  -mod ]
  167.  
  168. >From: perlman@wanginst.UUCP (Gary Perlman)
  169. Date: 30 Oct 85 18:03:01 GMT
  170.  
  171. I tried to post this to mod.std.unix, but it got bounced by the mailer.  Sigh.
  172. ------------------
  173.  
  174.                  Proposed Syntax Standard
  175.                  For UNIX* System Commands
  176.  
  177. RULE  1:  Command names must be between 2 and 9 characters.
  178.  
  179. RULE  2:  Command names must include lower case letters and
  180.           digits only.
  181.  
  182. RULE  3:  Option names must be a single character in length.
  183.  
  184. RULE  4:  All options must be delimited by ``-''.
  185.  
  186. RULE  5:  Options with no arguments may be grouped behind
  187.           one delimiter.
  188.  
  189. RULE  6:  The first option-argument following an option
  190.           must be preceded by white space.
  191.  
  192. RULE  7:  Option arguments cannot be optional.
  193.  
  194. RULE  8:  Groups of option-arguments following an option must be
  195.           separated by commas or separated by white space and quoted.
  196.  
  197. RULE  9:  All options precede operands on the command line.
  198.  
  199. RULE 10:  ``--'' may be used to delimit the end of the options.
  200.  
  201. RULE 11:  The order of options relative to one another
  202.           should not matter.
  203.  
  204. RULE 12:  The order of operands may matter and position-related
  205.           interpretations should be determined on a
  206.           command-specific basis.
  207.  
  208. RULE 13:  ``-'' preceded and followed by white space should be used
  209.           only to mean the standard input.
  210.  
  211.                                                   November 1983
  212. *UNIX is a trademark of AT&T Bell Laboratories
  213.  
  214. --------------------------------------------------------------------
  215.  
  216. The above  is a  direct quote  of the  quick reference  card
  217. handed out in  conjunction with  a talk at  the 1984  Winter
  218. Usenix conference by K. Hemenway & H. Armitage.  This set of
  219. rules is sometimes called the H&A standard.  Any proposal of
  220. a standard is  going to  cause controversy, and  this is  no
  221. exception.  Although I at first was opposed to the standard,
  222. I came to appreciate the thought that went into it.  In this
  223. commentary, I hope to convey that to you.
  224.  
  225. General comments: The H&A standard tries to maintain as much
  226. compatibility with  existing  programs while  improving  the
  227. consistency of  UNIX  command line  syntax.   This  is  much
  228. harder than designing  a command line  syntax from  scratch.
  229. It is important to understand the rationale behind the whole
  230. set of  conventions  before  making  judgements  about  them
  231. individually.
  232.  
  233. H&A recorded the  syntax for  all the commands  in UNIX  (at
  234. least System V UNIX).  They tried to come up with a standard
  235. that was  as  close to  most  of the  existing  commands  as
  236. possible.  Their analysis, summarized in their USENIX paper,
  237. but much better covered in an unavailable internal Bell Labs
  238. tech report, is an  excellent example of backing  statements
  239. with facts.  The most common example of an objection to  the
  240. standard is of the  form, "I don't like  RULE X. What  about
  241. the zz command?"  to which  H&A could  say, "That  exception
  242. happens in  only N  (few) commands."  Here are  my  comments
  243. about the rules.  They contain my reaction to the rules  and
  244. some of H&A's reasons for the rules.
  245.  
  246. I want to start by saying that this standard is much  better
  247. than no standard.   If  I know  that a  command follows  the
  248. standard, then there are no surprises about how options  are
  249. requested and that makes life easier  for me.  I don't  have
  250. to  worry  about  inconsistency,  and  that  overwhelms  the
  251. quirks of the standard.
  252.  
  253. RULE 1:
  254.           I see no reason for not allowing single  character
  255.           command names like e, f,  w, and S, but there  are
  256.           not many of  these.   There is  not much  mnemonic
  257.           value to  single  character commands,  nor  for  2
  258.           character commands, but there are a lot of those.
  259.  
  260. RULE 2:
  261.           The restriction to lower case letters only is  for
  262.           case insensitive systems.   One notable  exception
  263.           is a.out, but that is  not really a command  name.
  264.           Not allowing  special characters  like  underscore
  265.           simplifies the rules.
  266.  
  267. RULE 3:
  268.           Single  character  option   names  are  not   very
  269.           mnemonic, but  they are  necessary to  be able  to
  270.           bundle options.  They are also used in most of the
  271.           commands.     Their   lack   of   mnemonicity   is
  272.           compensated somewhat when on-line help is  readily
  273.           available, which unfortunately is not common.
  274.  
  275. RULE 4:
  276.           The convention of preceding options with - started
  277.           to distinguish  options  from file  names.    Some
  278.           commands that do not  take operands like files  or
  279.           expressions  do  not  require  the  -  sign.    My
  280.           experience is  that  this  is  an  extra  rule  to
  281.           explain to new  users that is  not worth saving  a
  282.           keystroke here and there.
  283.  
  284. RULE 5:
  285.           Bundling of options  was a rule  demanded by  UNIX
  286.           fans inside Bell Labs.  Once you accept this rule,
  287.           you can't  have  multiple character  options,  and
  288.           this is unfortunate.  Still,  I would not like  to
  289.           have to type: ls -l -t -r.
  290.  
  291. RULE 6:
  292.           Many programs  require  that  an  option  argument
  293.           immediately follow the option (e.g., cc -lm, nroff
  294.           -man) while  some require  a  space (e.g.,  cc  -o
  295.           pgm).  This is  one inconsistency that causes  the
  296.           most problems  for me, especially when  there  are
  297.           inconsistencies inside a command  (cf.  cc,  which
  298.           passes the  tightly  grouped  option-arguments  to
  299.           other  programs).     Rather   than  deciding   on
  300.           no-space, a space is required in the H&A standard.
  301.           This is to make sure that filename expansion works
  302.           properly.   For example,  if  the argument  to  an
  303.           option is a  file like  "extralongname", then  the
  304.           option -fextra*  would not  work, while  having  a
  305.           space in there would.   You could make the  syntax
  306.           "space-optional" but that  would require that  the
  307.           documentation cover more  than one  case, which  I
  308.           argue would make the syntax harder to learn.
  309.  
  310. RULE 7:
  311.           Because option  arguments must  be separated  from
  312.           options,  there  is  no  way  to  make  an  option
  313.           argument optional, except for the special case  of
  314.           at the end of a command line with no operands (but
  315.           I think  this  rare  exception would  be  hard  to
  316.           explain).   There  are  few  commands  that  allow
  317.           optional  option-arguments  (e.g.,  pr  -h),   and
  318.           supplying a  null argument  (ie.   "")  works  are
  319.           well.
  320.  
  321. RULE 8:
  322.           This rule does not allow for syntax like:
  323.               pgm -i file1 file2 file3 -o file4 file5
  324.           but this  is  not  very common.    Placing  quotes
  325.           around the files is not too bad.
  326.  
  327. RULE 9:
  328.           When options must  precede operands (e.g.,  files)
  329.           several practices  are  not  supported.    One  is
  330.           choosing a set  of options for  one file and  then
  331.           some options for another.  Instead of this, two or
  332.           more command lines are needed,  but this is not  a
  333.           serious penalty  for  most  commands,  and  not  a
  334.           common need.  The  second unsupported practice  is
  335.           that of thinking of  options after typing most  of
  336.           the  command   line;  if   options  must   precede
  337.           operands, then they must be inserted.  While  this
  338.           can be awkward  for some primitive  shells, it  is
  339.           best handled with  command line  editing, such  as
  340.           that in ksh.
  341.  
  342. RULE 10:
  343.           You really need -- to  delimit the end of  options
  344.           so that files or expressions that begin with - can
  345.           be processed.  The string  -- was used because  of
  346.           getopt's use.   This is not  a strong  motivation,
  347.           because at the time of the standard, only about 40
  348.           commands used getopt.  Still,  it seems as good  a
  349.           delimiter as any.
  350.  
  351.  
  352. RULE 11:
  353.           I do not know why the order of options should  not
  354.           matter.  It does matter  in commands like cc  (ie.
  355.           ld) that requires a special ordering to libraries.
  356.  
  357. RULE 12:
  358.           This rule says that the programmer can choose  any
  359.           meaning to what follows the options.  Makes  sense
  360.           to me.
  361.  
  362. RULE 13:
  363.           There is some tradition and a definite need to  be
  364.           able to insert the standard  input into a list  of
  365.           files.  The - has been used in a few commands, and
  366.           there were no likely contenders.
  367.  
  368. My impression is that  the H&A standard is  one we can  live
  369. with.   It is  not the  sort of  syntax that  someone  might
  370. design from scratch, but there  is a need for  compatibility
  371. with old  syntax, not  just for  user comfort,  but also  to
  372. avoid breaking  thousands  of shell  scripts  and  system(3)
  373. calls to UNIX command lines.  Yes, there is some more typing
  374. required, but I think it  is not a high  price to pay for  a
  375. set of conventions you can fit on a small card.  To get  all
  376. the  time-savers  we  like,   the  syntax  gets  much   more
  377. complicated, which  I  think  is  one  reason  for  the  bad
  378. reputation UNIX has earned.
  379.  
  380. What about existing commands?  Last I heard, the plan was to
  381. first work on the  easy cases, the  commands that were  very
  382. close to the standard.   Some commands would not be  changed
  383. but be replaced  by new  programs that would  phase out  the
  384. old.   Some  examples of commands  with extremely  difficult
  385. syntax are "pr" and "sort".  The "test" command is  finessed
  386. by saying  that  it does  not  use options,  but  a  special
  387. expression language.  The "find" command could be dealt with
  388. similarly.    The  "dd"  command,  with  name-value   format
  389. options, originally  designed as  a parody  of the  IBM  DD,
  390. would not change.
  391. -- 
  392. Gary Perlman  Wang Institute  Tyngsboro, MA 01879  (617) 649-9731
  393. UUCP: decvax!wanginst!perlman             CSNET: perlman@wanginst
  394.  
  395. Volume-Number: Volume 3, Number 3
  396.  
  397. From jsq  Wed Nov  6 18:14:28 1985
  398. Path: ut-sally!std-unix
  399. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  400. Newsgroups: mod.std.unix
  401. Subject: lost mail
  402. Message-Id: <3392@ut-sally.UUCP>
  403. Date: 7 Nov 85 00:14:13 GMT
  404. Organization: IEEE/P1003 Portable Operating System Environment Committee
  405. Lines: 5
  406. Approved: jsq@ut-sally.UUCP
  407. Draft-9: mod.std.unix
  408.  
  409. Someone mailed me a followup to the previous article.
  410. I'm afraid I managed to lose it during a fire drill this morning,
  411. and I don't remember who it was.  Could you please mail another copy?
  412.  
  413. Volume-Number: Volume 3, Number 4
  414.  
  415. From jsq  Fri Nov  8 20:38:33 1985
  416. Path: ut-sally!std-unix
  417. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  418. Newsgroups: mod.std.unix
  419. Subject: Is SIGILL omitted from the list of "hardware" signals for good reason?
  420. Message-Id: <3425@ut-sally.UUCP>
  421. Date: 9 Nov 85 02:38:27 GMT
  422. Organization: IEEE/P1003 Portable Operating System Environment Committee
  423. Lines: 53
  424. Approved: jsq@ut-sally.UUCP
  425. Draft-9: 3.3.1
  426.  
  427. This is the first of a series of articles consisting mostly of mail
  428. items from Robert Elz about P1003 Draft 4.  They have all been given to
  429. the appropriate section reviewers on the P1003 committee and will be
  430. taken into account during the Trial Use balloting process.  They are
  431. interspersed here with comments by Doug Gwyn (marked -Gwyn) which
  432. arrived by mail after Draft 5 was available but before the Dallas
  433. Steering Group meeting.  Comments from Don Kretsch (marked -Kretsch)
  434. were collected at the Dallas meeting.  I have added some more (marked
  435. -jsq) while preparing these articles for posting.  All the latter three
  436. people are members of the P1003 working group.  Don Kretsch is also a
  437. member of X3J11 and is the main liaison between the two committees.
  438.  
  439. The usual disclaimer applies:  nothing posted in this newsgroup
  440. by a committee member necessarily represents the official
  441. position of IEEE, P1003, or any other organization.
  442.  
  443. Submissions do not ordinarily sit around for a month before
  444. appearing in the newsgroup.  The original poster explicitly
  445. requested that responses be collected and posted with his originals.
  446.  
  447. The comments on the original remarks are not necessarily definitive,
  448. and the set of people who made them is pretty arbitrary.
  449. Further responses are solicited.
  450.  
  451. Date: 06 Oct 85 19:26:29 +1000 (Sun)
  452. Subject: Is SIGILL omitted from the list of "hardware" signals for good reason?
  453. >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  454.  
  455. In P1003/D4, section 3.3.2 (Signal Processing), there are several
  456. mentions to a list of distinguished signals, being
  457.  
  458.     SIGTRAP SIGIOT SIGEMT SIGFPE SIGBUS and SIGSEGV
  459.  
  460. These are the signals to which non-recoverable hardware errors
  461. should be mapped, the action taken upon return from a signal
  462. handler after one of these signals is undefined, and SIGABRT
  463. is to be mapped to one of these.
  464.  
  465. I note the absense of SIGILL from this list, and wonder why?
  466.  
  467. Was this deliberately omitted - in which case I object, as
  468. a SIGILL is quite likely the best choice for SIGABRT, and it
  469. certainly may be undefined what will happen upon return
  470. from a SIGILL signal handler.  Or is this a mere oversight?
  471.  
  472. [ SIGILL was added for Draft 5.  For some reason, Draft 5
  473. still does not permit SIGABRT to be defined as SIGILL; I
  474. don't understand why not.  I thought it was going to be
  475. allowed; only SIGFPE should be disallowed as SIGABRT. -Gwyn ]
  476.  
  477. Robert Elz        seismo!munnari!kre    kre%munnari.oz@seismo.css.gov
  478.  
  479. Volume-Number: Volume 3, Number 5
  480.  
  481. From jsq  Fri Nov  8 20:38:56 1985
  482. Path: ut-sally!std-unix
  483. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  484. Newsgroups: mod.std.unix
  485. Subject: The variable "errno".
  486. Message-Id: <3426@ut-sally.UUCP>
  487. Date: 9 Nov 85 02:38:51 GMT
  488. Organization: IEEE/P1003 Portable Operating System Environment Committee
  489. Lines: 51
  490. Approved: jsq@ut-sally.UUCP
  491. Draft-9: 2.5
  492.  
  493. Date: 06 Oct 85 19:19:53 +1000 (Sun)
  494. >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  495.  
  496. Section 2.3 of draft 4 [ Section 2.4 of Draft 5 -jsq ]
  497. of working group P1003 of (etc, etc of) IEEE states
  498.  
  499.     Errno is not changed on successful calls, ...
  500.  
  501. This is a stronger statement than I would like to see.  Again,
  502. my reason is that this introduces a distinction between the
  503. magic "system call" and the ordinary "library routine".
  504.  
  505. [ No, it removes a distinction between them.  It is really a
  506. misfeature that some library routines set errno when they
  507. have not failed. -Gwyn ]
  508.  
  509. Much better would simply be to state (as I believe the ANSI
  510. C working group's draft states - though I can't find my copy
  511. right now) that "errno is defined only after unsuccessful
  512. calls to routines where it is explicitly stated to be set".
  513.  
  514. That is, it is only meaningful to test errno after a function
  515. call that has returned an error indication, where that function
  516. has been documented to set errno to indicate the cause of the
  517. error.  That includes all system calls, and some library routines.
  518.  
  519. [ This is essentially what Draft 5 says about testing errno,
  520. although its wording is slightly confusing.  -Gwyn ]
  521.  
  522. [ Which is exactly the problem:  even if you already know what it was
  523. supposed to mean, you have to read it a few times to see if it really
  524. does.  This problem was mentioned by several people at the Steering
  525. Group meeting in Dallas.  However, that group was not authorized by the
  526. committee to make substantive changes to the actual draft.  But we did
  527. add a note in an Appendix explaining the problem, what the X3J11 draft
  528. currently says, and a proposed better wording.  This will appear in
  529. Draft 6, so that it can be taken into account during the Trial Use
  530. balloting.  I do not unfortunately have the text of that note, as I
  531. don't have Draft 6 yet.
  532.  
  533. Don Kretsch plans to propose the same wording as that of the D6
  534. appendix to X3J11 as a replacement for their current wording.
  535. -jsq ]
  536.  
  537. With the caveat on the use of "errno" in section 3.3.2.5 I
  538. wonder if perhaps its days are not numbered.  I would have
  539. to think what might replace it though.
  540.  
  541. Robert Elz        seismo!munnari!kre    kre%munnari.oz@seismo.css.gov
  542.  
  543. Volume-Number: Volume 3, Number 6
  544.  
  545. From jsq  Fri Nov  8 20:39:19 1985
  546. Path: ut-sally!std-unix
  547. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  548. Newsgroups: mod.std.unix
  549. Subject: CHILD_MAX as a constant - is it meaningful?
  550. Message-Id: <3427@ut-sally.UUCP>
  551. Date: 9 Nov 85 02:39:14 GMT
  552. Organization: IEEE/P1003 Portable Operating System Environment Committee
  553. Lines: 58
  554. Approved: jsq@ut-sally.UUCP
  555. Draft-9: 2.9
  556.  
  557. Date: 06 Oct 85 18:53:05 +1000 (Sun)
  558. >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  559.  
  560. Section 2.7 of P1003 draft 4 [ Section 2.8 of Draft 5 -jsq ]
  561. requires that implementations must define values of certain
  562. constants in <limits.h>.
  563.  
  564. One of the required constants is CHILD_MAX, the maximum number
  565. of offspring per userid.
  566.  
  567. This definition is a little to vague to be useable (it most likely
  568. intends to specify the maximum number of processes per userid, it may
  569. be debated whether the first process for a userid is an "offspring",
  570. it is also unlear whether this applies to "offspring" from some
  571. particular process - perhaps the maximum number of processes a user
  572. is permitted to run per login session?)
  573.  
  574. This can easily be fixed, but I have a more serious complaint:
  575.  
  576. Specifying per-userid limits as constants (that is, requiring
  577. an implementation to specify such a constant, and constraining
  578. it to a minimum value of that constant) does not seem to be
  579. an intelligent thing to do.
  580.  
  581. Ideally, per-userid limits are exactly that, set individually
  582. for individual users.  In an enviroment like this (again, mine)
  583. am I to set CHILD_MAX to the maximum number of processes that
  584. any user may may have running (which would be the same as PROC_MAX,
  585. as userid == 0 may run this many, and as such would be a meaningless
  586. value), or should I set it to the mininum value that any user
  587. will ever have for the maximum number of process permitted to be
  588. running (for some users, that will be 1 [aside: I can give
  589. entirely reasonable justifications for this limit - for some
  590. userids who do not represent humans], again making the constant useless.
  591. I could set it to an arbitrary approximate value - one that
  592. applies to many, or most, users, but that hardly seems satisfactory
  593. either.
  594.  
  595. So, I recommend doing away with this constant from <limits.h>,
  596. which is not to say that implementations may not impose such
  597. a limit, merely that attempting to specify the value of the
  598. limit as a system wide constant is not reasonable.
  599.  
  600. [ I think the justification for CHILD_MAX was that some
  601. implementations do have such a limit (for UIDs other than 0),
  602. and they wanted to guarantee a "minimum limit" of 4 offspring.
  603. Your argument against CHILD_MAX is a good one, though.
  604. For more general objections to <limits.h>, see farther on..
  605. -Gwyn ]
  606.  
  607. Robert Elz        seismo!munnari!kre    kre%munnari.oz@seismo.css.gov
  608.  
  609. [ Note that the X3J11 draft has the same problems as the P1003 draft,
  610. since they have many of the same constants defined, and where that is so,
  611. they have the same definitions (I think P1003 got them from X3J11).
  612. X3J11 has a copy of the original mail items through Don Kretsch.  -jsq ]
  613.  
  614. Volume-Number: Volume 3, Number 7
  615.  
  616. From jsq  Fri Nov  8 20:39:46 1985
  617. Path: ut-sally!std-unix
  618. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  619. Newsgroups: mod.std.unix
  620. Subject: fork(), EAGAIN, and CHILD_MAX
  621. Message-Id: <3428@ut-sally.UUCP>
  622. Date: 9 Nov 85 02:39:37 GMT
  623. Organization: IEEE/P1003 Portable Operating System Environment Committee
  624. Lines: 68
  625. Approved: jsq@ut-sally.UUCP
  626. Draft-9: 2.9 3.1.1
  627.  
  628. Date: 06 Oct 85 18:53:44 +1000 (Sun)
  629. >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  630.  
  631. In section 2.3 [ of Draft 4; Section 2.4 of Draft 5 -jsq ],
  632. EAGAIN is defined as "Resource temporarily unavailable".
  633. The third sentence of its description states...
  634.  
  635.     This is a temporary condition and later calls to the
  636.     same routine may complete normally.
  637.  
  638. It is not abundently clear whether this sentence qualifies only
  639. the preceding one (about read/write with O_NDELAY) or both of
  640. the earlier sentences (the first refers to fork).
  641.  
  642. [ This has been fixed in Draft 5 by moving the sentence to the
  643. beginning of the paragraph. -Gwyn ]
  644.  
  645. In section 3.1, and also in the the first sentence of the description
  646. referred to above, fork() is stated to return EAGAIN if either
  647. the system process table is full (PROC_MAX would be exceeded), or
  648. if the limit on the number of processes runnable by a single userid
  649. (CHILD_MAX) would be exceeded.
  650.  
  651. I submit that these conditions represent two distinct errors, which
  652. should not be lumped together - in most cases proper handling of a
  653. process table full is to wait a while, and try again (my exact
  654. interpretation of "Resource temporarily unavailable").  However,
  655. in most cases, this is a fruitless exercise if the user has exceeded
  656. the number of processes he is permitted - only killing one of the
  657. user's running processes will usually have much effect (it is
  658. possible that there are background processes, which may soon terminate,
  659. but this would seem to be the exception, rather than the rule).
  660. The process to kill when a fork fails because of the user having
  661. too many running processes is logically the parent process, the
  662. one attempting to fork().
  663.  
  664. [ Processes can terminate for other reasons, such as completion
  665. of their assigned tasks, in which case trying fork() again may
  666. eventually succeed.  The wording of the Draft ("may") seems to
  667. be such that the programmer is never guaranteed that the
  668. resource in question will ever become available. -Gwyn ]
  669.  
  670. [ For those of you who are not aware of it, the words "shall,"
  671. "should" and "may" are magic words with very specific meanings
  672. which are mandated by IEEE for standards of this kind.  See
  673. Section 1.2 of Draft 5 for the precise definitions.  This
  674. particular point about fork has been discussed in the committee
  675. before, and the word "may" was chosen carefully.  -jsq ]
  676.  
  677. So, I would suggest adding a new error code, I call it EPROCLIM
  678. (4.2 sites should find it already defined in their <errno.h> files!)
  679. and having fork() return this if the error is that the user's
  680. process limit is reached.
  681.  
  682. I know that this is incompatible with many (all, except mine)
  683. kernel implementations, however, I think that can easily be
  684. rectified by making it clear that EPROCLIM and EAGAIN may
  685. be the same value.
  686.  
  687. I think this is a suitable compromise that enables sensible
  688. forward growth, while not damaging backwards portability.
  689.  
  690. [ That is a sensible suggestion, but since it is not the way
  691. current systems work it may be hard to get a consensus on it. -Gwyn ]
  692.  
  693. Robert Elz        seismo!munnari!kre    kre%munnari.oz@seismo.css.gov
  694.  
  695. Volume-Number: Volume 3, Number 8
  696.  
  697. From jsq  Fri Nov  8 20:40:08 1985
  698. Path: ut-sally!std-unix
  699. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  700. Newsgroups: mod.std.unix
  701. Subject: Does EFAULT still make sense as an error return?
  702. Message-Id: <3429@ut-sally.UUCP>
  703. Date: 9 Nov 85 02:40:03 GMT
  704. Organization: IEEE/P1003 Portable Operating System Environment Committee
  705. Lines: 87
  706. Approved: jsq@ut-sally.UUCP
  707. Draft-9: EFAULT
  708.  
  709. Date: 06 Oct 85 18:54:15 +1000 (Sun)
  710. >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  711.  
  712. I notice that P1003 has gone to a lot of trouble (I refer to draft 4)
  713. to specift that EFAULT is a possible error return from every system
  714. call that takes a pointer as one of its arguments (or if there are
  715. any that were missed, I missed them too!)
  716.  
  717. I have yet to see an implementation that will actually return EFAULT
  718. in many of those instances - consider "time()", "wait()", and "pipe()".
  719.  
  720. [ System V Release 2 claims to return EFAULT in most of these
  721. cases, including time() and wait().  (I don't know if it really
  722. does.)  Clearly this is what one would want to have happen.
  723. If a signal occurred instead, and the user signal catcher
  724. returned normally, how would one then complete the system
  725. call?  Surely not by returning EINTR :-)  -Gwyn ]
  726.  
  727. In each of those, the system call definition specifies that a pointer
  728. to a data structure of one type or another is an argument.  However,
  729. all implementatins that I am aware of do not actually pass the pointer
  730. across the user/kernel interface, preferring rather the obtain the
  731. returned value via some system defined internal mechanism, and have the
  732. user interface routine actually store it in the data structure the
  733. user intended.
  734.  
  735. If such an implementation is required to return EFAULT rather than
  736. send a signal to the process, much extra work is going to be involved.
  737. Since (probably) all implementations are involved here, it seems to
  738. me that things should be relaxed here.
  739.  
  740. [ Agreed.  -Kretsch ]
  741.  
  742. [ Isn't u.u_error available for the copyout() code?  Setting it
  743. to EFAULT instead of posting a signal seems a trivial change.  -Gwyn ]
  744.  
  745. I would add the following sentence to the definition of EFAULT in
  746. section 2.3 [ of Draft 4; Section 2.4 of Draft 5 -jsq ]:
  747.  
  748.     This condition may generate a signal; the error is returned
  749.     if the signal is not generated, or is ignored.
  750.  
  751. [ I'm not sure this is the proper action.  This may cause currently
  752. working programs to break.  -Kretsch ]
  753.  
  754. This closely follows the wording of the similar condition with EPIPE,
  755. except that it allows implementations to decide in which cases they
  756. will send a signal, and in which cases they will return EFAULT.
  757.  
  758. [ This may turn out to be a good compromise solution.  -Gwyn ]
  759.  
  760. I would actually prefer if new kernel implementations could dispense
  761. with EFAULT entirely, and send a SIGSEGV instead (returning EFAULT
  762. only if the signal is ignored).
  763.  
  764. This would greatly help to blur the distinction between what is
  765. a "system call" and what is a "library routine".
  766.  
  767. It seems to me, that now the time has come when most of us no longer
  768. write code in assembler, this distinction is outdated.  To me,
  769. a "system call" and a "library routine" look just the same.
  770.  
  771. If the kernel sent a signal whenever it detected an illegal address
  772. in an argument provided by a user to a system call, then system
  773. calls would behave just like library routines, and it would be
  774. much easier for an implementation to choose how to implement
  775. any particular function.  For example, on some systems, it may
  776. be desirable to implement "uname()" as a library routine that reads
  777. a file - to allow the data returned to be easily changed by
  778. the site administrators.  This is not going to be easy to do
  779. if uname() is constrained to return EFAULT and not send a SIGSEGV.
  780.  
  781. [ Indeed, one of the silliest parts of emulating system calls
  782. with library routines (as in my System V emulation for 4.2BSD)
  783. is the attempt to return EFAULT instead of causing a SIGSEGV.
  784.  
  785. What you say is quite right, but it would be a significant change
  786. from the System V baseline so I suspect we would not arrive at a
  787. consensus in favor of the SIGSEGV approach.
  788.  
  789. Draft 5 Appendix A.7 specifically mentions problems with EFAULT
  790. and solicits suggestions for incorporation into the "final use"
  791. standard.  -Gwyn ]
  792.  
  793. Robert Elz        seismo!munnari!kre   kre%munnari.oz@seismo.css.gov
  794.  
  795. Volume-Number: Volume 3, Number 9
  796.  
  797. From jsq  Fri Nov  8 20:40:34 1985
  798. Path: ut-sally!std-unix
  799. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  800. Newsgroups: mod.std.unix
  801. Subject: OPEN_MAX and other constants - are they desireable?
  802. Message-Id: <3430@ut-sally.UUCP>
  803. Date: 9 Nov 85 02:40:27 GMT
  804. Organization: IEEE/P1003 Portable Operating System Environment Committee
  805. Lines: 100
  806. Approved: jsq@ut-sally.UUCP
  807. Draft-9: 2.9
  808.  
  809. Date: 06 Oct 85 18:36:07 +1000 (Sun)
  810. >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  811.  
  812. Section 2.7 of P1003 draft 4 [ Section 2.8 of Draft 5 -jsq ]
  813. requires that implementations must define values of certain
  814. constants in <limits.h>.
  815.  
  816. One of the required constants is OPEN_MAX, the maximum number
  817. of files that one process can have open at any given time.
  818.  
  819. The problem I see with this limit is quite different than
  820. that I perceive with CHILD_MAX (mentioned in a previous mail
  821. item), though the problems there could apply here as well,
  822. a per process limit is just a special case of a per user limit.
  823. Which is to say, that there is no guarantee that this limit
  824. will be a constant across users.
  825.  
  826. With OPEN_MAX though, there is another problem.  Defining this
  827. as a constant will lead application programs to reference it.
  828. (If these constants are not intended to be referenced, then that
  829. should be clearly stated, in which case I will wonder what the
  830. intention of them is).
  831.  
  832. [ I think they are intended to be referenced by C code
  833. (in most cases).  -Gwyn ]
  834.  
  835. The problem here, is that this makes binary compatability of
  836. application processes across system generations hard to
  837. achieve.  That is, generating a new binary kernel image
  838. may require recompiling large numbers of application programs,
  839. without any particularly good cause.
  840.  
  841. [ Agreed, but binary compatibility is not a goal of this standard.
  842. -Kretsch ]
  843.  
  844. [ Applications intended to be ported in binary form would
  845. have to restrict themselves to the minimum possible sizes
  846. for those things that can vary from system to system.
  847. This would entail a special <limits.h> on the development
  848. system.  Is this really a problem?  (Non-rhetorical question.)
  849. -Gwyn ]
  850.  
  851. This applies to many (if not almost all) of the constants defined in
  852. section 2.7 [ 2.8 of D5 -jsq ], I have singled OPEN_MAX out for
  853. attention, as it is one that I can see some implementations changing
  854. regularly.  Occasionally an application appears that really needs a
  855. large value for OPEN_MAX to be effecient.  If that application is
  856. important enough, a site may want to increase the limit.  As long as
  857. this means no more than a system generation, and reboot, it is a
  858. practicable task, however if all, or most of the user-mode binaries
  859. need to be rebuilt, it becomes close to impossible.
  860.  
  861. [ Seems to me only those critical binaries (/etc/init?)
  862. that wanted a huge OPEN_MAX would need to be rebuilt.  -Gwyn ]
  863.  
  864. I suggest deleting all of the constants, and instead specifying
  865. a library routine, which when handed a name defined in <limits.h>
  866. will return the associated constant.
  867.  
  868. [ A la getenv() - sounds reasonable to me.  X3J11 only deals with
  869. a single process mmodule so they haven't considered different
  870. values of these limits for different users/processes.  Maybe
  871. P1003 should!  -Kretsch ]
  872.  
  873. It may be that for various reasons a few of the limits really
  874. deserve to remain constants (the ones that specify characteristics
  875. of the hardware may be candisates), but most of these "constants"
  876. are really no more than transitory constants, and should not
  877. be wired in anywhere.
  878.  
  879. A simplistic implementation of the function would simply
  880. index an array by its argument, and return the number found.
  881. This results in building the constants into the binaries
  882. just as the current scheme - but it also discourages their
  883. use in places where constants are "required" by the C standards,
  884. making any application that does this non-portable to an
  885. implementation where these "constants" are true variables.
  886.  
  887. Other implementations may involve reading a file, or
  888. performing system calls.  The mechanism is not important.
  889.  
  890. [ Unfortunately, OPEN_MAX is one very likely candidate for
  891. use as a C integer constant (such as defining the size of
  892. an array of file status flags).
  893.  
  894. <limits.h> has been the subject of much debate, for the reasons
  895. you give and for others.  I think we really want to have minimum
  896. guaranteed limits on things, and really want to have C constants.
  897.  
  898. Attempting to change to a different mechanism at this point
  899. would probably delay balloting on the "trial use" standard.
  900. This seems like a good topic to bring up when critiquing the
  901. trial use standard, so that an acceptable solution could be
  902. built into the final use standard.  Perhaps feedback on this
  903. should be solicited in Appendix A.
  904. -Gwyn ]
  905.  
  906. Robert Elz        seismo!munnari!kre    kre%munnari.oz@seismo.css.gov
  907.  
  908. Volume-Number: Volume 3, Number 10
  909.  
  910. From jsq  Fri Nov  8 20:40:58 1985
  911. Path: ut-sally!std-unix
  912. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  913. Newsgroups: mod.std.unix
  914. Subject: P1003/D4 editorial comments
  915. Message-Id: <3431@ut-sally.UUCP>
  916. Date: 9 Nov 85 02:40:51 GMT
  917. Organization: IEEE/P1003 Portable Operating System Environment Committee
  918. Lines: 62
  919. Approved: jsq@ut-sally.UUCP
  920. Draft-9: 8.4
  921.  
  922. Date: 06 Oct 85 20:21:37 +1000 (Sun)
  923. >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  924.  
  925. Section 2.4 [ of Draft 4; Section 2.5 of Draft 5 -jsq ]
  926. terminates with a sentence that does not belong,
  927. there are no structures mentioned anywhere in this section.
  928.  
  929. [ I previously reported that this had been fixed by removing
  930. the sentence.  In fact the change Doug mentions below was done.  -jsq ]
  931.  
  932. [ This sentence was changed in Draft 5 to say that all TYPES
  933. defined in this file SHOULD have type names ending with _t.  -Gwyn ]
  934.  
  935. Several sections (eg: 3.3.2.6) indicate that longjmp is defined
  936. in the X3J11 C language standard.  It is also defined in
  937. section 6.  This seems to be one function that clearly belongs
  938. in the C standard, I would delete section 6 completely.
  939. (Currently it makes reference to "auto" and "register" "storage classes"
  940. none of which terms seem to be defined anywhere, or within the
  941. scope of this standard).  Deleting section 6 would also get rid
  942. of the most objectionable (and unnecessary) sentence...
  943.     However longjmp shall never cause setjmp
  944.     to return a value of 0.
  945. At best a caution that some implementations may not allow setjmp
  946. to return 0 when called from longjmp would be called for.
  947.  
  948. [ The offending section was removed for Draft 5.  -Gwyn ]
  949.  
  950. [ In general, anything which is C and not UNIX has been removed
  951. from P1003 and replaced with pointers to X3J11.  I posted a
  952. detailed synopsis of these sorts of changes a couple of months
  953. ago.  -jsq ]
  954.  
  955. Section 4.5.2 seems to be largely repeated in section 4.5.3.2.
  956. The former should probably simply be deleted.
  957.  
  958. [ Draft 5 has instead uniformly defined data structures like
  959. this at the beginning of subsections and omitted them from
  960. the individual routines.  It also has put #defined constants
  961. into tabular form instead of mock C code.  -Gwyn ]
  962.  
  963. Apart from minor glitches like these, I must complement the
  964. editors, it is obvious that much thought has gone into wording
  965. this draft in a manner that will result in just the results
  966. desired.  Congratulations.
  967.  
  968. [ Draft 5 appears at first reading to be substantially better
  969. organized than Draft 4 and also technically improved.  I
  970. have only a few relatively minor quibbles with it as it now
  971. stands, apart from the absence of a termio specification.
  972. -Gwyn ]
  973.  
  974. [ Termio was a topic of much discussion at the D.C. meeting.
  975. The former draft currently appears in an Appendix, with a pointer
  976. to it from the text of the draft, saying in effect that P1003
  977. intends to have such a section in the final draft, but it
  978. was not possible to agree on that particular section draft
  979. in time for Trial Use.  -jsq ]
  980.  
  981. Robert Elz        seismo!munnari!kre    kre%munnari.oz@seismo.css.gov
  982.  
  983. Volume-Number: Volume 3, Number 11
  984.  
  985. From jsq  Mon Nov 11 18:05:57 1985
  986. Path: ut-sally!std-unix
  987. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  988. Newsgroups: mod.std.unix
  989. Subject: Re: Is SIGILL omitted from the list of "hardware" signals for good reason?
  990. Message-Id: <3451@ut-sally.UUCP>
  991. Date: 12 Nov 85 00:05:51 GMT
  992. References: <3425@ut-sally.UUCP>
  993. Organization: IEEE/P1003 Portable Operating System Environment Committee
  994. Lines: 19
  995. Approved: jsq@ut-sally.UUCP
  996. Draft-9: 3.3.1
  997.  
  998. Date: Sun, 10 Nov 85 16:04:35 PST
  999. From: mordor!lll-crg!sun!guy (Guy Harris)
  1000.  
  1001. > Was this deliberately omitted - in which case I object, as
  1002. > a SIGILL is quite likely the best choice for SIGABRT...
  1003.  
  1004. Not necessarily; 4.xBSD happened to choose it for the VAX, because there's
  1005. no IOT instruction, but VAX S5's "abort" routine is a (portable!) piece of C
  1006. code which does
  1007.  
  1008.     kill(getpid(), SIGIOT);
  1009.  
  1010. (and also flushes all the Standard I/O buffers beforehand).  SIGIOT is
  1011. pretty useless except on PDP-11s; the S5 shell says "abort - core dumped"
  1012. rather than "IOT trap - core dumped" when a process gets a SIGIOT.
  1013.  
  1014. I think 4.xBSD should adopt S5's "abort" routine.
  1015.  
  1016. Volume-Number: Volume 3, Number 12
  1017.  
  1018. From jsq  Mon Nov 11 18:06:31 1985
  1019. Path: ut-sally!std-unix
  1020. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1021. Newsgroups: mod.std.unix
  1022. Subject: Re: OPEN_MAX and other constants - are they desireable?
  1023. Message-Id: <3452@ut-sally.UUCP>
  1024. Date: 12 Nov 85 00:06:24 GMT
  1025. References: <3430@ut-sally.UUCP>
  1026. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1027. Lines: 19
  1028. Approved: jsq@ut-sally.UUCP
  1029. Draft-9: 2.9
  1030.  
  1031. Date: Sun, 10 Nov 85 16:26:26 PST
  1032. From: mordor!lll-crg!sun!guy (Guy Harris)
  1033.  
  1034. > [ Seems to me only those critical binaries (/etc/init?)
  1035. > that wanted a huge OPEN_MAX would need to be rebuilt.  -Gwyn ]
  1036.  
  1037. Nope.  What about programs like shells which want to close every single open
  1038. file descriptor?  If OPEN_MAX were a compile-time constant, these programs
  1039. would have to be recompiled if you just bought Keg-O-Data's new DBMS which
  1040. requires 100 open file descriptors and reconfigured your kernel to up the
  1041. max-file-descriptors-per-process limit.
  1042.  
  1043. > I suggest deleting all of the constants, and instead specifying
  1044. > a library routine...
  1045.  
  1046. Yes, and *please* call the one for OPEN_MAX "getdtablesize", so 4.2 programs
  1047. won't have to change.
  1048.  
  1049. Volume-Number: Volume 3, Number 13
  1050.  
  1051. From jsq  Mon Nov 11 18:07:06 1985
  1052. Path: ut-sally!std-unix
  1053. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1054. Newsgroups: mod.std.unix
  1055. Subject: Re: OPEN_MAX and CHILD_MAX
  1056. Message-Id: <3453@ut-sally.UUCP>
  1057. Date: 12 Nov 85 00:06:57 GMT
  1058. References: <3428@ut-sally.UUCP>
  1059. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1060. Lines: 20
  1061. Approved: jsq@ut-sally.UUCP
  1062. Draft-9: 2.9
  1063.  
  1064. >From seismo!gatech!akgua!whuxlm!vilya!am Mon Nov 11 12:34:18 1985
  1065. Date: Mon, 11 Nov 85 11:40:54 est
  1066. Status: O
  1067.  
  1068. John,
  1069.     I believe that both OPEN_MAX and CHILD_MAX are useful as constants
  1070. available to the programmer to protect against running out of children
  1071. or files. Use of them in a non-controlled way will, of course, require
  1072. unnecessary re-compilations when system limits are changed. Let them be
  1073. in the standard and caveat emptor.
  1074.     Maybe there should be separate limits.h files, eg hardlimits.h
  1075. for things which will never (   :-)  ) change on a given system, such as
  1076. hardware limits (32-bit etc.) and a softlimits.h file which contains
  1077. current limits which change when system parameters are updated etc. This
  1078. will avoid many unnecessary recompilations when the program does not use
  1079. the softlimits. 
  1080.     Avi Malek (vilya!am    @ATT-Bell Labs, Parsippany NJ)
  1081. ---
  1082. Avi Malek @ATT Bell Labs Parsippany, NJ
  1083.  
  1084. Volume-Number: Volume 3, Number 14
  1085.  
  1086. From jsq  Mon Nov 11 18:07:36 1985
  1087. Path: ut-sally!std-unix
  1088. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1089. Newsgroups: mod.std.unix
  1090. Subject: Re: Does EFAULT still make sense as an error return?
  1091. Message-Id: <3454@ut-sally.UUCP>
  1092. Date: 12 Nov 85 00:07:30 GMT
  1093. References: <3429@ut-sally.UUCP>
  1094. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1095. Lines: 58
  1096. Approved: jsq@ut-sally.UUCP
  1097. Draft-9: EFAULT
  1098.  
  1099. Date: Sun, 10 Nov 85 16:19:03 PST
  1100. From: mordor!lll-crg!sun!guy (Guy Harris)
  1101.  
  1102. > [ System V Release 2 claims to return EFAULT in most of these
  1103. > cases, including time() and wait().  (I don't know if it really
  1104. > does.)  Clearly this is what one would want to have happen.
  1105. > If a signal occurred instead, and the user signal catcher
  1106. > returned normally, how would one then complete the system
  1107. > call?  Surely not by returning EINTR :-)  -Gwyn ]
  1108.  
  1109. Normally, one wouldn't *want* to complete the system call in this case; how
  1110. do you complete a call to "time" where the pointer points into some
  1111. nonexistent or non-writable location?  The only case where this would be
  1112. useful is in something like (aargh) the Bourne shell, where the signal
  1113. catcher would grow the data space to make that pointer valid.  This would
  1114. only work with 4.xBSD-style restartable system calls; the system call should
  1115. *not* be completed, but re-executed.
  1116.  
  1117. > [ Isn't u.u_error available for the copyout() code?  Setting it
  1118. > to EFAULT instead of posting a signal seems a trivial change.  -Gwyn ]
  1119.  
  1120. "copyout" isn't being used here; the copying of the data from the registers
  1121. it's usually returned in (for calls like "wait", "time", and "pipe") into
  1122. the location pointed to by the argument to the system call is done by
  1123. user-mode code, and it'd have to catch SIGSEGV in order to make the system
  1124. call return EFAULT in that particular case (oh yes, and in the cases of
  1125. "wait" and "pipe", you couldn't re-execute the call).
  1126.  
  1127. > I would add the following sentence to the definition of EFAULT in
  1128. > section 2.3 [ of Draft 4; Section 2.4 of Draft 5 -jsq ]:
  1129.  
  1130. >     This condition may generate a signal; the error is returned
  1131. >     if the signal is not generated, or is ignored.
  1132.  
  1133. > [ I'm not sure this is the proper action.  This may cause currently
  1134. > working programs to break.  -Kretsch ]
  1135.  
  1136. 1) The P1003 standard *already* breaks currently working programs; no UNIX
  1137. which is currently available returns -1 and sets "errno" to EAGAIN on
  1138. no-delay reads or writes - either it returns 0 (S3, S5) or returns -1 and
  1139. sets "errno" to EWOULDBLOCK.
  1140.  
  1141. 2) It's not clear that *reasonable* existing programs would be broken - what
  1142. can you do with an EFAULT except print an error message and exit?  Getting a
  1143. SIGSEGV would do both of the above, at least with a reasonable parent
  1144. process (like a shell), and would have the added advantage of giving you a
  1145. core dump so you can debug the problem more easily (if a system call gets
  1146. EFAULT, there is buggy code somewhere).
  1147.  
  1148. > I would actually prefer if new kernel implementations could dispense
  1149. > with EFAULT entirely, and send a SIGSEGV instead (returning EFAULT
  1150. > only if the signal is ignored).
  1151.  
  1152. YES.  V6 (!) did this; EFAULT was added subsequent to the release of V6, and
  1153. appeared in PWB/UNIX 1.0, V7, and its successors (4.xBSD, S3, S5, ...).  I
  1154. am at a loss to figure out why this was done.
  1155.  
  1156. Volume-Number: Volume 3, Number 15
  1157.  
  1158. From jsq  Tue Nov 12 21:36:10 1985
  1159. Path: ut-sally!std-unix
  1160. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1161. Newsgroups: mod.std.unix
  1162. Subject: EFAULT and limits
  1163. Message-Id: <3485@ut-sally.UUCP>
  1164. Date: 13 Nov 85 03:35:54 GMT
  1165. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1166. Lines: 30
  1167. Approved: jsq@ut-sally.UUCP
  1168. Draft-9: 2.9 EFAULT
  1169.  
  1170. Date:     Mon, 11 Nov 85 11:53:25 EST
  1171. From: Dan Franklin <dan@BBN-PROPHET.ARPA>
  1172.  
  1173. Re EFAULT from time(), etc.: The System V Interface Definition says (p. 136)
  1174. that "time will fail and its actions are undefined if tloc points to an
  1175. invalid address" as opposed to other system calls where the SVID explicitly
  1176. says they will return EFAULT.  So it seems that it would not be deviating too
  1177. much from AT&T's Unix line to permit some system calls to get SIGSEGV given
  1178. an invalid pointer.  It certainly seems the most sensible course to me.
  1179.  
  1180. I suspect that the discrepancy between the SVID and the SVr2 manual occurs
  1181. because the SVr2 code doesn't implement what the SVr2 manual says, and the
  1182. SVID makes SVr2's behavior legitimate.
  1183.  
  1184. Re limits: it really is much more sensible to determine the limits in a way
  1185. which permits a vendor to supply them at run time rather than compile time.
  1186. While I don't want to get into an argument over whether the standard ought to
  1187. address binary compatibility or not, it seems to me that it should certainly
  1188. not PRECLUDE a vendor from offering binary compatibility across changes in
  1189. some system "constants".  OPEN_MAX is a particularly good example of a
  1190. "constant" that is likely to change over the next few years; I know of several
  1191. database-producing groups that can't stand the limit of 20 open descriptors,
  1192. and it's not particularly wonderful for the project I'm on now, either.
  1193. It is true that this will mean that (e.g.) an array of flags will have to be
  1194. allocated dynamically rather than statically if it is to be done correctly;
  1195. I don't see this as a serious disadvantage.
  1196.  
  1197.     Dan Franklin
  1198.  
  1199. Volume-Number: Volume 3, Number 16
  1200.  
  1201. From jsq  Wed Nov 13 22:17:12 1985
  1202. Path: ut-sally!std-unix
  1203. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1204. Newsgroups: mod.std.unix
  1205. Subject: Re: OPEN_MAX and other constants - are they desireable?
  1206. Message-Id: <3505@ut-sally.UUCP>
  1207. Date: 14 Nov 85 04:17:05 GMT
  1208. References: <3430@ut-sally.UUCP>
  1209. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1210. Lines: 29
  1211. Approved: jsq@ut-sally.UUCP
  1212. Draft-9: 2.9
  1213.  
  1214. Date: Wed, 13 Nov 85 17:02:39 est
  1215. From: Kee Hinckley <harvard!wanginst!apollo!nazgul>
  1216.  
  1217. In article <3430@ut-sally.UUCP> you write:
  1218. > Date: 06 Oct 85 18:36:07 +1000 (Sun)
  1219. > >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  1220. ...
  1221. > I suggest deleting all of the constants, and instead specifying
  1222. > a library routine, which when handed a name defined in <limits.h>
  1223. > will return the associated constant.
  1224.  
  1225. One problem with this is that a piece of code may want to #if off of
  1226. particular constants.  For instance, if I discover that the amount
  1227. of memory I have is too small, and I don't have virtual memory then
  1228. I might want to use temporary files.  This could be all handled 
  1229. automatically by using #if's in the code if I could reference a
  1230. constant, but it would not work out nearly as well if I had to
  1231. make that kind of decision at runtime.  I tend to agree with the
  1232. other responses.  The problems that are introduced by limits.h
  1233. almost all relate to binary portability, and binary portability
  1234. is not a concern for the standard.
  1235.  
  1236.                                        Kee Hinckley
  1237.                                        User Environment
  1238.                                        Apollo Computer
  1239.                                        ...decvax!wanginst!apollo!nazgul
  1240.  
  1241. Volume-Number: Volume 3, Number 17
  1242.  
  1243. From jsq  Fri Nov 15 07:06:49 1985
  1244. Path: ut-sally!std-unix
  1245. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1246. Newsgroups: mod.std.unix
  1247. Subject: Re: limits
  1248. Message-Id: <3520@ut-sally.UUCP>
  1249. Date: 15 Nov 85 13:06:41 GMT
  1250. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1251. Lines: 22
  1252. Approved: jsq@ut-sally.UUCP
  1253. Draft-9: 2.9
  1254.  
  1255. >From seismo!philabs!flkvax!trwrb!desint!geoff (Geoff Kuenning)
  1256. Date: Thu, 14 Nov 85 23:47:29 GMT
  1257.  
  1258. I support the idea of making the limits available at run-time, but
  1259. let's not copy Berkeley's naming (getdlimit or whatever it is).  There
  1260. should be just *one* call that gets all the limits into a struct;
  1261. Berkeley compatability can be achieved with "wrapper" routines.
  1262.  
  1263. UniSoft has already done 90% of the work of this call by moving
  1264. everything that used to be in param.h into a structure named 'v'.  This
  1265. was done so that binary customers could patch NPROC et al easily, but a
  1266. system call that returned the contents of 'v' would be trivial to add.
  1267. Maybe we could get AT&T to buy the changes (they're extensive) from UniSoft.
  1268.  
  1269. [ 3B20 System V Release 2 has this, so maybe they did.
  1270. Personally, I don't like it.  -mod ] 
  1271. -- 
  1272.  
  1273.     Geoff Kuenning
  1274.     {hplabs,ihnp4}!trwrb!desint!geoff
  1275.  
  1276. Volume-Number: Volume 3, Number 18
  1277.  
  1278. From jsq  Fri Nov 15 07:10:25 1985
  1279. Path: ut-sally!std-unix
  1280. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1281. Newsgroups: mod.std.unix
  1282. Subject: Re: OPEN_MAX and other constants - are they desireable?
  1283. Message-Id: <3521@ut-sally.UUCP>
  1284. Date: 15 Nov 85 13:10:14 GMT
  1285. References: <3430@ut-sally.UUCP> <3505@ut-sally.UUCP>
  1286. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1287. Lines: 36
  1288. Approved: jsq@ut-sally.UUCP
  1289. Draft-9: 2.9
  1290.  
  1291. Date: Thu, 14 Nov 85 17:21:36 pst
  1292. From: saber!msc@ihnp4.uucp (Mark Callow)
  1293.  
  1294. > From: Kee Hinckley <harvard!wanginst!apollo!nazgul>
  1295. > In article <3430@ut-sally.UUCP> you write:
  1296. > > Date: 06 Oct 85 18:36:07 +1000 (Sun)
  1297. > > >From: Robert Elz <munnari!kre@seismo.CSS.GOV>
  1298. > ...
  1299. > > I suggest deleting all of the constants, and instead specifying
  1300. > > a library routine, which when handed a name defined in <limits.h>
  1301. > > will return the associated constant.
  1302. > > 
  1303. > One problem with this is that a piece of code may want to #if off of
  1304. > particular constants.  For instance, if I discover that the amount
  1305. > of memory I have is too small, and I don't have virtual memory then
  1306. > I might want to use temporary files.
  1307. You can do this just as well with an if statement at runtime.  Then
  1308. if someone decides to add more memory to their machine they don't
  1309. have to recompile their world to take advantage of it.
  1310.  
  1311. > ...but it would not work out nearly as well if I had to
  1312. > make that kind of decision at runtime.
  1313. Why not?  The penalty is a small increase in the size of the
  1314. binary.
  1315.  
  1316. limits.h and all similar kinds of wired-in constants are the pits.
  1317. What happens in a network environment?  Do your servers have one
  1318. copy of the program for each client configuration?  Of course not.
  1319. What does a computer manufacturer do?  Have a different software
  1320. release for each system configuration?  Of course not.  You
  1321. either end up in the least common denominator trap or you ignore
  1322. limits.h and implement the library function suggested by kre.
  1323.  
  1324. Volume-Number: Volume 3, Number 19
  1325.  
  1326. From jsq  Fri Nov 15 18:34:46 1985
  1327. Path: ut-sally!std-unix
  1328. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1329. Newsgroups: mod.std.unix
  1330. Subject: limits.h
  1331. Message-Id: <3529@ut-sally.UUCP>
  1332. Date: 16 Nov 85 00:34:39 GMT
  1333. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1334. Lines: 21
  1335. Approved: jsq@ut-sally.UUCP
  1336. Draft-9: 2.9
  1337.  
  1338. Date: Fri, 15 Nov 85 00:48:36 cst
  1339. From: allegra!jpl (John P. Linderman)
  1340.  
  1341. I agree that values like OPEN_MAX that may well vary among binary
  1342. compatible machines should be determinable at execution time.  It
  1343. makes a lot of sense to have a routine that would look them up in
  1344. the copy of limits.h on the runtime machine.  If the file were
  1345. missing (or otherwise unusable), default values could be compiled
  1346. in from the copy of limits.h on the compile-time machine.  This
  1347. would leave us with sensible defaults, even on a bare-bones machine,
  1348. and a high level of compatibility across binary compatible machines,
  1349. regardless of the machine a source was compiled on.
  1350.  
  1351. I don't imagine people will bury these lookups deep in nested loops,
  1352. so efficiency shouldn't be much of an issue.  A lookup that invoked
  1353. cpp would be easy to write and would guarantee compatibility with
  1354. compile-time lookups.
  1355.  
  1356. John P. Linderman  allegra!jpl
  1357.  
  1358. Volume-Number: Volume 3, Number 20
  1359.  
  1360. From jsq  Fri Nov 15 18:37:06 1985
  1361. Path: ut-sally!std-unix
  1362. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1363. Newsgroups: mod.std.unix
  1364. Subject: Re:  limits
  1365. Message-Id: <3530@ut-sally.UUCP>
  1366. Date: 16 Nov 85 00:37:00 GMT
  1367. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1368. Lines: 30
  1369. Approved: jsq@ut-sally.UUCP
  1370. Draft-9: 2.9
  1371.  
  1372. Date:     Fri, 15 Nov 85 11:10:55 EST
  1373. From: Dan Franklin <dan@BBN-PROPHET.ARPA>
  1374.  
  1375. > ... There
  1376. > should be just *one* call that gets all the limits into a struct;
  1377. > Berkeley compatability can be achieved with "wrapper" routines.
  1378.  
  1379. I agree that there should be one system call, but not this one.  This one means
  1380. that if a manufacturer wants to add a limit in a later version of the system
  1381. (either in response to a change to the standard, or to enhance his system) it's
  1382. once again necessary to recompile everything that might use the system call, in
  1383. order to be able to return the larger structure.  You can solve this problem by
  1384. defining the system call to take a pointer and a length, rather than just a
  1385. pointer; then the only time recompilation is necessary is if a limit is deleted
  1386. (and you want to reclaim the structure element).  But why should it be
  1387. necessary at all?
  1388.  
  1389. Instead of one system call which returns *everything*, there should be one
  1390. system call which takes a numeric index "naming" the limit to be returned.  An
  1391. index of 0 would return the total number of limits. Limits.h would give the
  1392. indices.
  1393.  
  1394. Letting the system call "know" what limit you're actually interested in also
  1395. permits (in theory) programs to be monitored (in the kernel) to see what limits
  1396. they are requesting, so that you can know ahead of time what programs would
  1397. benefit from changing what parameters.
  1398.  
  1399.     Dan
  1400.  
  1401. Volume-Number: Volume 3, Number 21
  1402.  
  1403. From jsq  Fri Nov 15 18:38:22 1985
  1404. Path: ut-sally!std-unix
  1405. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1406. Newsgroups: mod.std.unix
  1407. Subject: Limits that can stay in limits.h
  1408. Message-Id: <3531@ut-sally.UUCP>
  1409. Date: 16 Nov 85 00:38:17 GMT
  1410. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1411. Lines: 38
  1412. Approved: jsq@ut-sally.UUCP
  1413. Draft-9: 2.9
  1414.  
  1415. Date:     Fri, 15 Nov 85 11:49:49 EST
  1416. From: Dan Franklin <dan@BBN-PROPHET.ARPA>
  1417.  
  1418. While we're moving kernel-dependent values out of limits.h into a system call
  1419. where they belong, it seems only appropriate to list the limits which I believe
  1420. are appropriate for limits.h, and should stay there.
  1421.  
  1422.     {CHAR_BIT} Maximum number of bits in a datum of type char
  1423.     {CHAR_MAX} Maximum magnitude for a datum of type char
  1424.     {CHAR_MIN} Minimum magnitude for a datum of type char
  1425.     {INT_MAX}  (Same for ints)
  1426.     {INT_MIN}
  1427.     {LONG_MAX} (For longs)
  1428.     {LONG_MIN}
  1429.     {SHRT_MAX} (For shorts)
  1430.     {SHRT_MIN}
  1431.     {USI_MAX}  (For unsigned ints)
  1432.     {WORD_BIT} Number of bits in a word or datum of type int
  1433.  
  1434. These limits reflect the architecture of the CPU as viewed through the
  1435. compiler; they would change only if the CPU architecture or the compiler
  1436. changed.  They can safely be kept in limits.h because if the architecture
  1437. changed, recompilation would be necessary for other reasons besides getting the
  1438. value of the limit to be up-to-date; and if the compiler changed, recompilation
  1439. wouldn't be necessary because the operation of binaries is not affected by
  1440. changes to the compiler (except perhaps binaries that actually deal with
  1441. compiler output, like symbol tables and .o files and so on; again, such
  1442. binaries would need a lot more than just an up-to-date value or two).
  1443.  
  1444. It's also inappropriate (as well as unnecessary) for the kernel to return these
  1445. values, since they are not properties of the kernel like {PIPE_MAX}.
  1446.  
  1447. By the way, why aren't there USL_MAX, USC_MAX, and USS_MAX? (For unsigned
  1448. longs, chars, and shorts respectively.)
  1449.  
  1450.     Dan
  1451.  
  1452. Volume-Number: Volume 3, Number 22
  1453.  
  1454. From jsq  Fri Nov 15 18:43:19 1985
  1455. Path: ut-sally!std-unix
  1456. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1457. Newsgroups: mod.std.unix
  1458. Subject: Draft ambiguity
  1459. Message-Id: <3532@ut-sally.UUCP>
  1460. Date: 16 Nov 85 00:43:07 GMT
  1461. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1462. Lines: 18
  1463. Approved: jsq@ut-sally.UUCP
  1464. Draft-9: 2.9
  1465.  
  1466. Date:     Fri, 15 Nov 85 11:53:55 EST
  1467. From: Dan Franklin <dan@BBN-PROPHET.ARPA>
  1468.  
  1469. Some of the values in the column "Minimum value" are actually maximums rather
  1470. than minimums, and the draft should indicate this.  That is, for the minimums
  1471. CHAR_MIN, INT_MIN, LONG_MIN, and SHRT_MIN, the column gives the maximum
  1472. permissible value (as it should), not the minimum permissible.  Before I
  1473. realized this, I thought it was an error that the "minimum value" for CHAR_MIN
  1474. was 0 rather than -128.  One way to make this clearer would be to change the
  1475. column label "Minimum value" to "Minimum (Maximum) value" and put the values
  1476. which are actually "largest permissible minimums" rather than "smallest
  1477. permissible maximums" in parentheses.
  1478.  
  1479.     Dan
  1480.  
  1481. [ This comes up at every meeting.  Your method looks as good as any.  -mod ]
  1482.  
  1483. Volume-Number: Volume 3, Number 23
  1484.  
  1485. From jsq  Sat Nov 16 16:28:11 1985
  1486. Path: ut-sally!std-unix
  1487. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1488. Newsgroups: mod.std.unix
  1489. Subject: Re: limits.h
  1490. Message-Id: <3541@ut-sally.UUCP>
  1491. Date: 16 Nov 85 22:28:04 GMT
  1492. References: <3529@ut-sally.UUCP>
  1493. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1494. Lines: 466
  1495. Approved: jsq@ut-sally.UUCP
  1496. Draft-9: 2.9
  1497.  
  1498. [ Everybody talks about it, but this one did something about it.  -mod ]
  1499.  
  1500. Date: Sat, 16 Nov 85 15:11:46 est
  1501. From: seismo!hadron!jsdy (Joseph S. D. Yao)
  1502.  
  1503. Reading in limits on a per-machine basis is a good idea.
  1504. However, the idea of reading in a struct or using a numerical
  1505. ID for limits both constrain expandability.  I also have
  1506. problems with reading directly from limits.h.  Let's do it
  1507. from a file like /etc/limits.
  1508.  
  1509. By the way -- one person said that define'd limits were needed
  1510. for #if expressions in code.  What about if () expressions?  The
  1511. only case in which the former couldn't be handled by the latter is
  1512. in the case that you are really squeezed for core.  ("main memory"
  1513. to all you young whippersnappers.)
  1514.  
  1515. /* #include <local.h> */
  1516.  
  1517. /*********************************************************************\
  1518. **
  1519. ** limits -- read limits from the limits file.
  1520. **
  1521. ** Copyright and disclaimers:
  1522. **    This code is Copyright (c) 1985 by one or more of:
  1523. **        The author named below;
  1524. **        The author's institution named below;
  1525. **        (No institution paid for this code, so that's it).
  1526. **    Permission is hereby granted to use or copy this code, in
  1527. **    whole or in part, only under the conditions that this copyright
  1528. **    notice (including other portions of this header comment and
  1529. **    code herein referenced) are retained with all parts of this
  1530. **    code; that all changes or corrections to this code be fully
  1531. **    annotated in the code and notification of such be sent to
  1532. **    the author and authors institution; and that this code not
  1533. **    specifically be used for profit (although it may be included
  1534. **    to enhance a larger work which would otherwise have still
  1535. **    been used for profit).
  1536. **
  1537. ** Syntax:
  1538. **    setlimits(filename)
  1539. **      char *filename;
  1540. **    getlimit(name, buf, length)
  1541. **      char *name;    int buf[], length;
  1542. **    endlimits()
  1543. **
  1544. ** Description:
  1545. **    This is an implementation of the suggested code to read the
  1546. **    per-machine limits from a limits file.  It assumes a file of
  1547. **    the format:
  1548. **        limit-name    limit-value[, limit_value ... ]
  1549. **    e.g.:
  1550. **        char_bit    8
  1551. **        char_min    -128
  1552. **        char_max    128
  1553. **    etc.  Lines that start with '#' are assumed to be comment
  1554. **    lines.  Lines that start with white space are assumed to
  1555. **    be continuation lines.
  1556. **
  1557. **    Setlimits() returns SUCCESS if the file whose name is passed
  1558. **    is readable, FAILURE if not.  On a SUCCESS return, the file is
  1559. **    set but not opened.  A NULL argument returns to the original
  1560. **    file name.  Getlimit() returns FAILURE if no value, otherwise
  1561. **    the number of values available.  (May be > length.)
  1562. **    Endlimits() closes the limits file, if open.  No value is
  1563. **    returned.
  1564. **
  1565. #ifdef    SCCS
  1566. ** Last modifed %G% %U%.  Last retrieved %H% %T%.
  1567. #endif    SCCS
  1568. **
  1569. ** Author:
  1570. **    Joseph S. D. Yao
  1571. **    Engineering and Information Sciences Division
  1572. **    Hadron, Inc.
  1573. **    9990 Lee Highway
  1574. **    Fairfax VA   22030
  1575. **    (703) 359-6163
  1576. **
  1577. ** Routines:
  1578. **    int setlimits(filename)
  1579. **    int getlimit(name, buf, length)
  1580. **    void endlimits()
  1581. **    static int getnum(str)
  1582. **
  1583. ** Declared:
  1584. **    static char limfile[] = "/etc/limits"
  1585. **    static char *curlimfile = limfile
  1586. **    static FILE *limf = (FILE *) NULL
  1587. **
  1588. \*********************************************************************/
  1589.  
  1590. #ifndef    lint
  1591. # ifdef SCCS
  1592.   static char SCCS_id[] = "%W%";
  1593. #  else
  1594.   static char RCS_id[] =
  1595.     "@(#)$Header:$";
  1596. # endif    SCCS
  1597. #endif    lint
  1598.  
  1599. #include <stdio.h>
  1600. #include <ctype.h>
  1601. #ifdef    limits
  1602. # include <limits.h>
  1603. #endif    limits
  1604. #include <sys/types.h>
  1605.  
  1606. /* #include "std.h" */
  1607. #define TRUE    1
  1608. #define FALSE    0
  1609.  
  1610. #define SUCCESS    0
  1611. #define FAILURE    (-1)
  1612.  
  1613. #define NUL    '\0'
  1614.  
  1615. #define STDIN    0
  1616. #define STDOUT    1
  1617. #define STDERR    2
  1618.  
  1619. #define ROPEN    0
  1620. #define WOPEN    1
  1621. #define RWOPEN    2
  1622. #define XOPEN    3
  1623. #define RXOPEN    4
  1624. #define WXOPEN    5
  1625. #define RWXOPEN    6
  1626.  
  1627. #define READ    "r"
  1628. #define WRITE    "w"
  1629. #define APPEND    "a"
  1630. #define WREAD    "r+"
  1631. #define RWRITE    "w+"
  1632. #define RAPPEND    "a+"
  1633.  
  1634. #define F_ACC    00
  1635. #define X_ACC    01
  1636. #define W_ACC    02
  1637. #define R_ACC    04
  1638.  
  1639. #define ever        (;;)
  1640. #define until(x)    while (!(x))
  1641. #define unless(x)    if (!(x))
  1642.  
  1643. #define streq(a,b)    (strcmp(a, b) == 0)
  1644. #define strneq(a,b,n)    (strncmp(a, b, n) == 0)
  1645.  
  1646. typedef char bool;    /* Smallest data object */
  1647. typedef int boolean;    /* Function argument and return. */
  1648. /**/
  1649.  
  1650. #define NL    '\n'
  1651. #define COMMENT    '#'
  1652. #define COMMA    ','
  1653. #define PLUS    '+'
  1654. #define MINUS    '-'
  1655.  
  1656. static char limfile[] = "/etc/limits";
  1657. static char *curlimfile = limfile;
  1658.  
  1659. static FILE *limf = (FILE *) NULL;
  1660.  
  1661. /*
  1662. ** Setlimits() returns SUCCESS if the file whose name is passed
  1663. ** is readable, FAILURE if not.  On a SUCCESS return, the file is
  1664. ** set but not opened.  A NULL argument returns to the original
  1665. ** file name, whether or not the original file is readable.
  1666. ** Note that a non-NULL filename must not disappear (e.g., be
  1667. ** reclaimed on the stack, free'd, or written over) before it
  1668. ** is opened in getlimit()!
  1669. */
  1670. int setlimits(filename)
  1671.   char *filename;    /* NULL or the name of the new limits file. */
  1672. {
  1673.     void endlimits();
  1674.  
  1675.     /* If name is NULL, go to the original. */
  1676.     if (filename == (char *) NULL) {
  1677.         if (limf != NULL)
  1678.             endlimits();
  1679.         curlimfile = limfile;
  1680.         return(SUCCESS);
  1681.     }
  1682.  
  1683.     /* If new file can't be read, forget it. */
  1684.     if (access(filename, R_ACC) < 0)
  1685.         return(FAILURE);
  1686.  
  1687.     /* Close old open file. */
  1688.     if (limf != NULL)
  1689.         endlimits();
  1690.     /* And use new one. */
  1691.     curlimfile = filename;
  1692.     return(SUCCESS);
  1693. }
  1694.  
  1695. /*
  1696. ** Getlimit() returns FAILURE if no value, otherwise the number
  1697. ** of values available.  The number of values may be > 'length';
  1698. ** but the number stored into buf[] will never be.
  1699. ** Note that the result is always returned as a number of integers.
  1700. ** It is up to the calling program to put them together into longs,
  1701. ** complexes, etc. or decompose them into chars, bitfields, or
  1702. ** whatever.
  1703. **
  1704. ** The search starts from wherever it left off, which improves
  1705. ** performance if names are called in order from the file.
  1706. ** (Say, alphabetical order.)
  1707. */
  1708. int getlimit(name, buf, length)
  1709.   char *name;    /* Name of the limit wanted. */
  1710.   int buf[];    /* Pointer to the array of int's for these values. */
  1711.   int length;
  1712. {
  1713.     register char *cp;
  1714.     register int n;
  1715.     bool been_here;
  1716.     bool new_line;
  1717.     char inbuf[BUFSIZ];
  1718.     off_t current;
  1719.     extern char *index();
  1720.  
  1721.     /* If not open, open it. */
  1722.     if (limf == (FILE *) NULL)
  1723.         limf = fopen(curlimfile, READ);
  1724.  
  1725.     /* If still not open, kick it in. */
  1726.     if (limf == (FILE *) NULL)
  1727.         return(FAILURE);
  1728.  
  1729.     n = strlen(name);
  1730.     /* Find where we currently are in the file. */
  1731.     current = ftell(limf);
  1732.     /* Initialise boolean values. */
  1733.     new_line = TRUE;
  1734.     been_here = FALSE;
  1735.  
  1736.     /* Search, starting wherever we left off. */
  1737.     for ever {
  1738.         /* Get a line from the file */
  1739.         cp = fgets(inbuf, sizeof(inbuf), limf);
  1740.         if (cp != (char *) NULL) {
  1741.  
  1742.             /* If gotten, test: if start of line */
  1743.             if (new_line &&
  1744.                 /* and not a comment line */
  1745.                 *cp != COMMENT &&
  1746.                 /* and not a continuation line */
  1747.                 !isspace(*cp) &&
  1748.                 /* and the limit name is first */
  1749.                 strneq(cp, name, n) &&
  1750.                 /* followed by white space */
  1751.                 isspace(cp[n]))
  1752.                 break;    /* go handle it. */
  1753.  
  1754.             /* Check whether a NL terminated the read. */
  1755.             new_line = (index(cp, NL) != (char *) NULL);
  1756.         } else {
  1757.             /* If not gotten, re-cycle. */
  1758.  
  1759.             /*
  1760.             ** Make sure the file doesn't get changed
  1761.             ** and cause an infinite loop here.
  1762.             */
  1763.             if (been_here)
  1764.                 return(FAILURE);
  1765.             been_here = TRUE;
  1766.  
  1767.             /* Go back. */
  1768.             (void) fseek(limf, (off_t) 0L, 0);
  1769.             /* Well this starts a new line, no? */
  1770.             new_line = TRUE;
  1771.         }
  1772.  
  1773.         /* If we're where we started, we failed. */
  1774.         if (current == ftell(limf))
  1775.             return(FAILURE);
  1776.     }
  1777.  
  1778.     /*
  1779.     ** We only get here if we have a line in inbuf (or the start
  1780.     ** of one) that contains the limit name.  Skip over it and
  1781.     ** start passing values.
  1782.     */
  1783.     cp += n + 1;
  1784.     n = 0;
  1785.     /* Check whether a NL terminated the read. */
  1786.     new_line = (index(cp, NL) != (char *) NULL);
  1787.  
  1788.     /*
  1789.     ** Our value may be preceded by whitespace, and is ended
  1790.     ** by a comma or whitespace or comment or EOL.
  1791.     */
  1792.     for ever {
  1793.         /* Skip any initial white space. */
  1794.         while (isspace(*cp))
  1795.             ++cp;
  1796.  
  1797.         /* Check whether line is done. */
  1798.         if (*cp == COMMENT || *cp == NUL) {
  1799.             /* Save current position */
  1800.             current = ftell(limf);
  1801.             /* Get new line. */
  1802.             cp = fgets(inbuf, sizeof(inbuf), limf);
  1803.             /* If EOF, do it over again at loc 0. */
  1804.             if (cp == (char *) NULL) {
  1805.                 (void) fseek(limf, (off_t) 0L, 0);
  1806.                 current = (off_t) 0L;
  1807.                 cp = fgets(inbuf, sizeof(inbuf), limf);
  1808.                 /* There has to be data here. */
  1809.                 if (cp == (char *) NULL) {
  1810.                     /* "never happen" */
  1811.                     break;
  1812.                 }
  1813.             }
  1814.  
  1815.             /*
  1816.             ** If new line is start of line but no white
  1817.             ** space, go back to start of line and return.
  1818.             */
  1819.             if (!new_line || !isspace(*cp)) {
  1820.                 (void) fseek(limf, current, 0);
  1821.                 break;
  1822.             }
  1823.  
  1824.             /* Check whether a NL terminated the read. */
  1825.             new_line = (index(cp, NL) != (char *) NULL);
  1826.  
  1827.             continue;
  1828.         }
  1829.  
  1830.         /* If it can fit, store the present value. */
  1831.         if (n < length)
  1832.             buf[n] = getnum(cp);
  1833.  
  1834.         /* Count another value. */
  1835.         ++n;
  1836.  
  1837.         /*
  1838.         ** We want to break but not skip on space, COMMENT, and
  1839.         ** NUL.  We want to skip and break on COMMA.  We want
  1840.         ** just to skip over everything else.
  1841.         */
  1842.         while (!isspace(*cp) && *cp != COMMENT && *cp != NUL &&
  1843.                *cp++ != COMMA);
  1844.     }
  1845.  
  1846.     /* Return the number of values found. */
  1847.     return(n);
  1848. }
  1849.  
  1850. /*
  1851. ** Endlimits() closes the limits file, if open.  No value is
  1852. ** returned.
  1853. */
  1854. void endlimits()
  1855. {
  1856.     if (limf != (FILE *) NULL) {
  1857.         (void) fclose(limf);
  1858.         limf = (FILE *) NULL;
  1859.     }
  1860. }
  1861.  
  1862. /*
  1863. ** This routine converts strings to numbers of base specified
  1864. ** by 0x or 0 or no prefix.  Signs are allowed.  Atoi() isn't
  1865. ** used because it doesn't allow different bases, and for the
  1866. ** sake of consistency.
  1867. */
  1868. static int getnum(str)
  1869.   register char *str;
  1870. {
  1871.     register int base = 10;
  1872.     register int i = 0, digit;
  1873.     register int sign = 1;
  1874.  
  1875.     while (isspace(*str) || *str == PLUS || *str == MINUS) {
  1876.         if (*str == MINUS)
  1877.             sign = -sign;
  1878.         ++str;
  1879.     }
  1880.  
  1881.     if (*str == '0') {
  1882.         ++str;
  1883.         if (*str == 'x') {
  1884.             ++str;
  1885.             base = 16;
  1886.         } else
  1887.             base = 8;
  1888.     }
  1889.  
  1890.     /*
  1891.     ** As opposed to code that assumes contiguous digits and
  1892.     ** letters, the following will work even for (*shudder*)
  1893.     ** EBCDIC.  Heck, it'll work for TTS and Baudot!
  1894.     */
  1895.     for ever {
  1896.         digit = -1;
  1897.         switch (*str++) {
  1898.           case '0':    digit = 0; break;
  1899.           case '1':    digit = 1; break;
  1900.           case '2':    digit = 2; break;
  1901.           case '3':    digit = 3; break;
  1902.           case '4':    digit = 4; break;
  1903.           case '5':    digit = 5; break;
  1904.           case '6':    digit = 6; break;
  1905.           case '7':    digit = 7; break;
  1906.  
  1907.           case '8':    if (base > 8) digit = 8; break;
  1908.           case '9':    if (base > 9) digit = 9; break;
  1909.  
  1910.           case 'A':
  1911.           case 'a':
  1912.             if (base > 10)
  1913.                 digit = 10;
  1914.             break;
  1915.  
  1916.           case 'B':
  1917.           case 'b':
  1918.             if (base > 11)
  1919.                 digit = 11;
  1920.             break;
  1921.  
  1922.           case 'C':
  1923.           case 'c':
  1924.             if (base > 12)
  1925.                 digit = 12;
  1926.             break;
  1927.  
  1928.           case 'D':
  1929.           case 'd':
  1930.             if (base > 13)
  1931.                 digit = 13;
  1932.             break;
  1933.  
  1934.           case 'E':
  1935.           case 'e':
  1936.             if (base > 14)
  1937.                 digit = 14;
  1938.             break;
  1939.  
  1940.           case 'F':
  1941.           case 'f':
  1942.             if (base > 15)
  1943.                 digit = 15;
  1944.             break;
  1945.  
  1946.           default:    break;
  1947.         }
  1948.  
  1949.         if (digit < 0)
  1950.             break;
  1951.  
  1952.         i *= base;
  1953.         i += digit;
  1954.     }
  1955.  
  1956.     if (sign < 0)
  1957.         return(-i);
  1958.     return(i);
  1959. }
  1960.  
  1961.     Joe Yao        hadron!jsdy@seismo.{CSS.GOV,ARPA,UUCP}
  1962.  
  1963. Volume-Number: Volume 3, Number 24
  1964.  
  1965. From jsq  Tue Nov 19 16:04:21 1985
  1966. Path: ut-sally!std-unix
  1967. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1968. Newsgroups: mod.std.unix
  1969. Subject: Re: OPEN_MAX and other constants - are they desireable?
  1970. Message-Id: <3572@ut-sally.UUCP>
  1971. Date: 19 Nov 85 22:02:44 GMT
  1972. References: <3430@ut-sally.UUCP> <3505@ut-sally.UUCP>
  1973. Organization: IEEE/P1003 Portable Operating System Environment Committee
  1974. Lines: 13
  1975. Approved: jsq@ut-sally.UUCP
  1976. Draft-9: 2.9
  1977.  
  1978. Date: Mon, 18 Nov 85 11:13:43 pst
  1979. From: seismo!gatech!hplabs!sdcrdcf!scgvaxd!felix!peregrine!mike (Mike Wexler)
  1980.  
  1981. I have another argument against the desirability of these constants.  It does
  1982. not allow people to do implementations that don't have any limititations(other
  1983. than availability of resources)  It would be fairly easy to desing a system
  1984. that would allow you to have an "unlimited" number of files, by allocating
  1985. a new table when the current table gets full.
  1986.  
  1987. Mike Wexler
  1988. (trwrb|scgvaxd)!felix!peregrine!mike         (714)855-3923
  1989.  
  1990. Volume-Number: Volume 3, Number 25
  1991.  
  1992. From jsq  Tue Nov 19 16:40:24 1985
  1993. Path: ut-sally!std-unix
  1994. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  1995. Newsgroups: mod.std.unix
  1996. Subject: Draft ambiguity
  1997. Message-Id: <3573@ut-sally.UUCP>
  1998. Date: 19 Nov 85 22:38:31 GMT
  1999. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2000. Lines: 14
  2001. Approved: jsq@ut-sally.UUCP
  2002. Draft-9: 2.9
  2003.  
  2004. Date: Mon, 18 Nov 85 13:55:26 cst
  2005. From: ihnp4!uiucdcs!ccvaxa!preece@SEISMO.CSS.GOV (Scott Preece)
  2006.  
  2007. > [ This comes up at every meeting.  Your method looks as good as any.
  2008. > -mod ]
  2009. ----------
  2010. Will there be a "Guide for voters" describing some of the things
  2011. that "come up at every meeting"?
  2012.  
  2013. [ There will be numerous and voluminous appendices, many of which
  2014. will serve that purpose (though they don't use that phrase :-).
  2015. This newsgroup also serves that purpose to some extent.  -mod ]
  2016.  
  2017. Volume-Number: Volume 3, Number 26
  2018.  
  2019. From jsq  Tue Nov 19 17:46:58 1985
  2020. Path: ut-sally!std-unix
  2021. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2022. Newsgroups: mod.std.unix
  2023. Subject: limits
  2024. Message-Id: <3576@ut-sally.UUCP>
  2025. Date: 19 Nov 85 23:45:13 GMT
  2026. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2027. Lines: 39
  2028. Approved: jsq@ut-sally.UUCP
  2029. Draft-9: 2.9
  2030.  
  2031. Date: Mon, 18 Nov 85 13:28:03 cst
  2032. From: ihnp4!uiucdcs!ccvaxa!preece@SEISMO.CSS.GOV (Scott Preece)
  2033.  
  2034. > From: Dan Franklin <dan@BBN-PROPHET.ARPA>
  2035. > Instead of one system call which returns *everything*, there should be
  2036. > one system call which takes a numeric index "naming" the limit to be
  2037. > returned.  An index of 0 would return the total number of limits.
  2038. > Limits.h would give the indices.
  2039. ----------
  2040. I'd get rid of the numeric constants part of that, too.  Use a call
  2041. like getenv, supplying a name as an Ascii string.
  2042.  
  2043. But does this mean we would have to malloc space for anything that
  2044. was sized to a system limit (i.e., one could no longer say
  2045.     char buf[PATH_MAX]
  2046. but would have to do:
  2047.     char *buf;
  2048.     long bufsize;
  2049.     ...
  2050.     bufsize = getlimit("PATH_MAX");
  2051.     if (bufsize >= 0)
  2052.         buf = (char *)malloc(bufsize);
  2053.     else
  2054.         perror("bufalloc:");
  2055. at run time?
  2056.  
  2057. Nobody ever said programming had to be easy, but this could
  2058. get old pretty quickly...
  2059.  
  2060. [ If the limits are taken from <limits.h>, presumably a program could,
  2061. if the programmer so chose, #include that file and size arrays at
  2062. compile time.  -mod ]
  2063.  
  2064. __
  2065. scott preece
  2066. gould/csd urbana
  2067. ihnp4!uiucdcs!ccvaxa!preece
  2068.  
  2069. Volume-Number: Volume 3, Number 28
  2070.  
  2071. From jsq  Wed Nov 20 12:05:50 1985
  2072. Path: ut-sally!std-unix
  2073. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2074. Newsgroups: mod.std.unix
  2075. Subject: Re: OPEN_MAX and other constants - are they desireable?
  2076. Message-Id: <3591@ut-sally.UUCP>
  2077. Date: 20 Nov 85 18:05:30 GMT
  2078. References: <3521@ut-sally.UUCP>
  2079. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2080. Lines: 20
  2081. Approved: jsq@ut-sally.UUCP
  2082. Draft-9: 2.9
  2083.  
  2084. From: shell!graffiti!peter (Peter da Silva)
  2085. Date: Mon, 18 Nov 85 08:01:43 cst
  2086.  
  2087. > > ...but it would not work out nearly as well if I had to
  2088. > > make that kind of decision at runtime.
  2089. > Why not?  The penalty is a small increase in the size of the
  2090. > binary.
  2091.  
  2092. For certain architectures, for instance PDP-11 and 8086 small memory
  2093. model, that "small increase" may make the difference between having
  2094. the program run or not. There have been all too many programs posted
  2095. that are "just a little too big" for the PDP-11 to dismiss this
  2096. consideration.
  2097. --
  2098. Name: Peter da Silva
  2099. Graphic: `-_-'
  2100. UUCP: ...!shell!{graffiti,baylor}!peter
  2101. IAEF: ...!kitty!baylor!peter
  2102.  
  2103. Volume-Number: Volume 3, Number 29
  2104.  
  2105. From jsq  Wed Nov 20 12:14:52 1985
  2106. Path: ut-sally!std-unix
  2107. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2108. Newsgroups: mod.std.unix
  2109. Subject: Re: Draft ambiguity
  2110. Message-Id: <3592@ut-sally.UUCP>
  2111. Date: 20 Nov 85 18:14:44 GMT
  2112. References: <3532@ut-sally.UUCP>
  2113. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2114. Lines: 39
  2115. Approved: jsq@ut-sally.UUCP
  2116. Draft-9: 2.9
  2117.  
  2118. [ This is from a committee member who is more knowledgeable than I.
  2119. The usual disclaimers about not necessarily representing the official
  2120. position of IEEE, P1003, etc. apply.  -mod ]
  2121.  
  2122. From: athena!steved%tektronix.csnet@CSNET-RELAY.ARPA
  2123. Date: Tuesday, 19 Nov 85 10:27:06 PST
  2124.  
  2125. -----
  2126. John, 
  2127.  
  2128. In response to Dan Franklin's letter about changes in the standard concerning
  2129. the misleading (and sometimes contradictory) wording in the limits section.
  2130. In preparing draft 6, this section was cleaned up by the technical reviewers.
  2131.  
  2132. The body of the paragraph now says that the magnitude of the defined value 
  2133. must be greater than or equal to the magnitude of the value specified and
  2134. they must be of the same sign.  Also the column is simply labeled "Value".
  2135.  
  2136. This should clear up the ambiguity of the section.
  2137.  
  2138. On the question of these values being obtainable dynamically,  The intention
  2139. of this section is to present minimum magnitudes that the implementer can
  2140. be certain of having for a given implementation.  I.E. if the designer
  2141. makes sure that his application fits (so to speak) within these limits
  2142. it will work on any system.  I feel that the question of querying the values
  2143. at run time is really a different topic.  There really needs to be the two
  2144. classes of limits available. The limits file is not intended to represent
  2145. necessarily the current limit.  For example, PROC_MAX tells an application
  2146. programmer that he knows that there can be n processes existing simultaneously.
  2147. However, the o.s. implementer may have some dynamic allocation scheme where
  2148. the actual limit varies with say system load.  The goal of the standard is to
  2149. allow that kind of implementation.
  2150.  
  2151. The working committee will certainly accept and consider proposals for a 
  2152. routine that would provide the more esoteric program the ability to dynamically
  2153. determine what "current" limits are.  Clearly the case of the shell, wanting
  2154. to close all unused file descriptors is a good case for the routine.
  2155.  
  2156. Volume-Number: Volume 3, Number 30
  2157.  
  2158. From jsq  Thu Nov 21 07:22:47 1985
  2159. Path: ut-sally!std-unix
  2160. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2161. Newsgroups: mod.std.unix
  2162. Subject: Re: limits
  2163. Message-Id: <3597@ut-sally.UUCP>
  2164. Date: 21 Nov 85 13:22:37 GMT
  2165. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2166. Lines: 25
  2167. Approved: jsq@ut-sally.UUCP
  2168. Draft-9: 2.9
  2169.  
  2170. Date: Sun, 17 Nov 85 16:28:42 PST
  2171. From: seismo!sun!gorodish!guy (Guy Harris)
  2172.  
  2173. > I support the idea of making the limits available at run-time, but
  2174. > let's not copy Berkeley's naming (getdlimit or whatever it is).  There
  2175. > should be just *one* call that gets all the limits into a struct;
  2176. > Berkeley compatability can be achieved with "wrapper" routines.
  2177.  
  2178. I wanted to make sure nobody introduced a routine to get the size of
  2179. the descriptor table with the same semantics as 4.2BSD's, but with a
  2180. different name.
  2181.  
  2182. > UniSoft has already done 90% of the work of this call by moving
  2183. > everything that used to be in param.h into a structure named 'v'.  This
  2184. > was done so that binary customers could patch NPROC et al easily, but a
  2185. > system call that returned the contents of 'v' would be trivial to add.
  2186. > Maybe we could get AT&T to buy the changes (they're extensive) from UniSoft.
  2187.  
  2188. You've got it backwards here.  The PWB/UNIX group at AT&T invented
  2189. the "v" structure; a lot of PWB/UNIX stuff, including the "v"
  2190. structure, made it into UNIX/TS 1.0 and subsequent releases from the
  2191. USG/USDL including S3 and S5.  UniSoft already bought that code from
  2192. AT&T, so there's no need to get AT&T to buy it back.
  2193.  
  2194. Volume-Number: Volume 3, Number 31
  2195.  
  2196. From jsq  Thu Nov 21 07:28:26 1985
  2197. Path: ut-sally!std-unix
  2198. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2199. Newsgroups: mod.std.unix
  2200. Subject: Re: limits
  2201. Message-Id: <3598@ut-sally.UUCP>
  2202. Date: 21 Nov 85 13:28:19 GMT
  2203. References: <3575@ut-sally.UUCP>
  2204. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2205. Lines: 82
  2206. Approved: jsq@ut-sally.UUCP
  2207. Draft-9: 2.9
  2208.  
  2209. Date: Wed, 20 Nov 85 13:47:00 est
  2210. From: seismo!cbpavo.cbosgd.ATT.UUCP!mark (Mark Horton)
  2211.  
  2212. After looking at the cc -E / sed approach to reading limits.h, I
  2213. wanted to pass along a couple of other ideas.  (There are lots of
  2214. UNIX systems out there that don't have C compilers on line, in
  2215. particular, both Xenix and the AT&T 3B2 come without them until
  2216. you add them in, and they take up enough cash and disk space that
  2217. I'll bet many non-hackers won't install them.)
  2218.  
  2219. One idea is to do what netnews does to figure out the system name.
  2220. I'll enclose the code at the end (the code is public domain)
  2221. but basically it opens /usr/include/whoami.h and looks for a line
  2222.     #define sysname "whatever"
  2223. and extracts the "whatever".  It uses scanf, but hard code could be
  2224. written to make this a bit faster and more robust.  It does depend
  2225. on the full path name /usr/include/file.h, and it does expect the
  2226. #define to be in a reasonably standard format, but these aren't
  2227. overly cumbersome restrictions, are they?  (Dare we assume that
  2228. /usr/include will be there on all systems, even those without
  2229. compilers?)
  2230.  
  2231. Another idea is a bit more complex, but solves the "two copies of
  2232. the information" problem while still keeping a non-C file like
  2233. the proposed /etc/limits.  The idea is to keep a single copy in
  2234. /etc/limits, and use the obvious subroutine to get the values for
  2235. user code (which then has to malloc things.)  But the kernel has
  2236. to know these numbers too, and it's not exactly reasonable for the
  2237. kernel to go opening up a user file.  Perhaps a user program can be
  2238. written that will read the file, and download it into the kernel
  2239. with some kind of (system dependent) magic, such as poking in /dev/kmem,
  2240. or a special ioctl, or whatever.  Then the kernel can malloc the
  2241. appropriate data structures for the appropriate sizes.
  2242.  
  2243. This second idea has a chicken-and-egg problem, in that the data
  2244. structures better be allocated EARLY, and the obvious place to do
  2245. the downloading is /etc/rc, which is awfully late for such things.
  2246. One possibility is for /etc/init to do this before it does much of
  2247. anything else, although this is still probably too late (after all,
  2248. it has to open the file, and this means the file table has to exist.
  2249. Also, it's a process, so the process table must exist.)  One possibility
  2250. for handling this is for the kernel to have a very small set of minimal
  2251. tables to use until the real numbers come in, at which time it swings
  2252. a new pointer to the new tables.  (This is getting pretty ugly, isn't it?)
  2253.  
  2254. A third possibility is for the kernel to use the limits.h file, but
  2255. for /etc/rc to run a program that reads the values, translates them
  2256. into an easily parsed format (possibly binary), and puts these values
  2257. into /etc/limits.  Then the hard work is done only once per boot.
  2258. This might make it hard to write programs like fsck that run single
  2259. user, however.
  2260.  
  2261.     Mark
  2262.  
  2263. #define HDRFILE "/usr/include/whoami.h"
  2264.  
  2265. uname(uptr)
  2266. struct utsname *uptr;
  2267. {
  2268.         char buf[BUFSIZ];
  2269.         FILE *fd;
  2270.          
  2271.         fd = fopen(HDRFILE, "r");
  2272.         if (fd == NULL) {
  2273.                 fprintf(stderr, "Cannot open %s\n", HDRFILE);
  2274.                 exit(1);
  2275.         }
  2276.          
  2277.         for (;;) {      /* each line in the file */
  2278.                 if (fgets(buf, sizeof buf, fd) == NULL) {
  2279.                         fprintf(stderr, "no sysname in %s\n", HDRFILE);
  2280.                         fclose(fd);
  2281.                         exit(2);
  2282.                 }
  2283.                 if (sscanf(buf, "#define sysname \"%[^\"]\"", uptr->nodename) == 1) {
  2284.                         fclose(fd);
  2285.                         return;
  2286.                 }
  2287.         }
  2288. }
  2289.  
  2290. Volume-Number: Volume 3, Number 32
  2291.  
  2292. From jsq  Thu Nov 21 07:33:24 1985
  2293. Path: ut-sally!std-unix
  2294. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2295. Newsgroups: mod.std.unix
  2296. Subject: duplicate articles
  2297. Message-Id: <3599@ut-sally.UUCP>
  2298. Date: 21 Nov 85 13:33:15 GMT
  2299. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2300. Lines: 11
  2301. Approved: jsq@ut-sally.UUCP
  2302. Draft-9: mod.std.unix
  2303.  
  2304. There is a USENET host called bty which is reposting all articles of
  2305. mod.std.unix and getting them all wrong, i.e., the From, Organization,
  2306. and especially the Message-ID headers are incorrect.  The latter header
  2307. is what the news software uses to detect duplicates, so lots of people
  2308. are seeing two copies of all articles in this newsgroup.
  2309.  
  2310. My attempts to contact bty or their feed, infopro, by mail have failed.
  2311. Evidently someone there is reading this newsgroup.  Whoever you are,
  2312. please fix this!
  2313.  
  2314. Volume-Number: Volume 3, Number 33
  2315.  
  2316. From jsq  Fri Nov 22 11:21:46 1985
  2317. Path: ut-sally!std-unix
  2318. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2319. Newsgroups: mod.std.unix
  2320. Subject: Re: limits
  2321. Message-Id: <3624@ut-sally.UUCP>
  2322. Date: 22 Nov 85 17:21:39 GMT
  2323. References: <3575@ut-sally.UUCP> <3598@ut-sally.UUCP>
  2324. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2325. Lines: 318
  2326. Approved: jsq@ut-sally.UUCP
  2327. Draft-9: 2.9
  2328.  
  2329. Date: Fri, 22 Nov 85 04:15:24 est
  2330. From: seismo!hadron!jsdy (Joseph S. D. Yao)
  2331.  
  2332. One person suggested that having separate <limits.h> and
  2333. /etc/limits files might lead to inconsistency.  True.  But
  2334. it was a deliberate (and, i apologise, unspoken) design
  2335. decision that reading limits.h implied knowing too much
  2336. about the machine -- such as how long are longs, what byte
  2337. order are ints vs longs vs ... (not to mention floats,
  2338. which I completely ignore below, and which I shouldn't!),
  2339. and so forth.  Reading a separate file gives me the freedom
  2340. to read an n-ary list of ints, formatted God Alone knows
  2341. how, which I can convert at my leisure to whatever I want.
  2342.  
  2343. Nevertheless, we aim to please, and I made the minor mods
  2344. to limits.c to make limits2.c, designed to read a single
  2345. int or long int from a define line.  As I said, I completely
  2346. ignored floats, which in a working program is unforgivable.
  2347. But the person who wants to read in floats may send me
  2348. (readable!) code to do so PORTABLY.
  2349.  
  2350. The following is a compressed context diff.
  2351.  
  2352. *** limits.c    Sat Nov 16 15:08:15 1985
  2353. --- limits2.c    Fri Nov 22 00:00:00 1985
  2354. ***************
  2355. *** 66,73
  2356.   **    void endlimits()
  2357. ! **    static int getnum(str)
  2358.   **
  2359.   ** Declared:
  2360. ! **    static char limfile[] = "/etc/limits"
  2361. ! **    static char *curlimfile = limfile
  2362. ! **    static FILE *limf = (FILE *) NULL
  2363.   **
  2364. --- 66,75 -----
  2365.   **    void endlimits()
  2366. ! **    static int getnum(str, buf, n)
  2367. ! **    static int getnbits()
  2368.   **
  2369.   ** Declared:
  2370. ! **    static char defn[]    = "#define"
  2371. ! **    static char limfile[]    = "/etc/limits"
  2372. ! **    static char *curlimfile    = limfile
  2373. ! **    static FILE *limf    = (FILE *) NULL
  2374.   **
  2375. ***************
  2376. *** 136,138
  2377.   #define NL    '\n'
  2378. ! #define COMMENT    '#'
  2379.   #define COMMA    ','
  2380. --- 138,141 -----
  2381.   #define NL    '\n'
  2382. ! #define COMM1    '/'
  2383. ! #define COMM2    '*'
  2384.   #define COMMA    ','
  2385. ***************
  2386. *** 141,145
  2387.   
  2388. ! static char limfile[] = "/etc/limits";
  2389. ! static char *curlimfile = limfile;
  2390.   
  2391. ! static FILE *limf = (FILE *) NULL;
  2392.   
  2393. --- 144,158 -----
  2394.   
  2395. + #ifdef    EBUG
  2396. + #define WDPLG    2
  2397. + #  else
  2398. + #define WDPLG    (sizeof(long int)/sizeof(int))
  2399. + #endif    EBUG
  2400. + typedef char byte;    /* Very small signed value */
  2401. + static char defn[]    = "#define";
  2402. ! static char limfile[]    = "/etc/limits";
  2403. ! static char *curlimfile    = limfile;
  2404.   
  2405. ! static FILE *limf    = (FILE *) NULL;
  2406.   
  2407. ***************
  2408. *** 200,201
  2409.       register int n;
  2410.       bool been_here;
  2411. --- 212,214 -----
  2412.       register int n;
  2413. +     register int defnlen = strlen(defn);
  2414.       bool been_here;
  2415. ***************
  2416. *** 204,205
  2417.       off_t current;
  2418.       extern char *index();
  2419. --- 213,219 -----
  2420.       off_t current;
  2421. +     int getnum();
  2422.       extern char *index();
  2423. ***************
  2424. *** 225,240
  2425.               if (new_line &&
  2426. !                 /* and not a comment line */
  2427. !                 *cp != COMMENT &&
  2428. !                 /* and not a continuation line */
  2429. !                 !isspace(*cp) &&
  2430. !                 /* and the limit name is first */
  2431. !                 strneq(cp, name, n) &&
  2432. !                 /* followed by white space */
  2433. !                 isspace(cp[n]))
  2434. !                 break;    /* go handle it. */
  2435.   
  2436.               /* Check whether a NL terminated the read. */
  2437. --- 243,259 -----
  2438.               if (new_line &&
  2439. !                 /* and starts with "#define" */
  2440. !                 strneq(cp, defn, defnlen)) {
  2441.   
  2442. +                 /* Skip over defn */
  2443. +                 cp += defnlen;
  2444. +                 while (isspace(*cp))
  2445. +                     ++cp;
  2446. +                 /* If the limit name is first */
  2447. +                 if (strneq(cp, name, n) &&
  2448. +                     /* followed by white space */
  2449. +                     isspace(cp[n]))
  2450. +                     break;    /* go handle it. */
  2451. +             }
  2452.               /* Check whether a NL terminated the read. */
  2453. ***************
  2454. *** 269,334
  2455.       cp += n + 1;
  2456. -     n = 0;
  2457. -     /* Check whether a NL terminated the read. */
  2458. -     new_line = (index(cp, NL) != (char *) NULL);
  2459.   
  2460.       /*
  2461. !     ** Our value may be preceded by whitespace, and is ended
  2462. !     ** by a comma or whitespace or comment or EOL.
  2463.       */
  2464.       for ever {
  2465. !         /* Skip any initial white space. */
  2466. !         while (isspace(*cp))
  2467.               ++cp;
  2468. !         /* Check whether line is done. */
  2469. !         if (*cp == COMMENT || *cp == NUL) {
  2470. !             /* Save current position */
  2471. !             current = ftell(limf);
  2472. !             /* Get new line. */
  2473. !             cp = fgets(inbuf, sizeof(inbuf), limf);
  2474. !             /* If EOF, do it over again at loc 0. */
  2475. !             if (cp == (char *) NULL) {
  2476. !                 (void) fseek(limf, (off_t) 0L, 0);
  2477. !                 current = (off_t) 0L;
  2478. !                 cp = fgets(inbuf, sizeof(inbuf), limf);
  2479. !                 /* There has to be data here. */
  2480. !                 if (cp == (char *) NULL) {
  2481. !                     /* "never happen" */
  2482. !                     break;
  2483. !                 }
  2484. !             }
  2485. !             /*
  2486. !             ** If new line is start of line but no white
  2487. !             ** space, go back to start of line and return.
  2488. !             */
  2489. !             if (!new_line || !isspace(*cp)) {
  2490. !                 (void) fseek(limf, current, 0);
  2491. !                 break;
  2492. !             }
  2493. !             /* Check whether a NL terminated the read. */
  2494. !             new_line = (index(cp, NL) != (char *) NULL);
  2495. !             continue;
  2496. !         }
  2497. !         /* If it can fit, store the present value. */
  2498. !         if (n < length)
  2499. !             buf[n] = getnum(cp);
  2500. !         /* Count another value. */
  2501. !         ++n;
  2502. !         /*
  2503. !         ** We want to break but not skip on space, COMMENT, and
  2504. !         ** NUL.  We want to skip and break on COMMA.  We want
  2505. !         ** just to skip over everything else.
  2506. !         */
  2507. !         while (!isspace(*cp) && *cp != COMMENT && *cp != NUL &&
  2508. !                *cp++ != COMMA);
  2509.       }
  2510.   
  2511. !     /* Return the number of values found. */
  2512. !     return(n);
  2513.   }
  2514. --- 288,312 -----
  2515.       cp += n + 1;
  2516.   
  2517.       /*
  2518. !     ** Our value may be preceded by whitespace, or a comment.
  2519.       */
  2520.       for ever {
  2521. !         if (isspace(*cp))
  2522.               ++cp;
  2523. !           else if (*cp == COMM1 && cp[1] == COMM2) {
  2524. !             cp += 2;
  2525. !             while (*cp != NUL) {
  2526. !                 if (*cp++ != COMM2)
  2527. !                     continue;
  2528. !                 if (*cp == COMM1) {
  2529. !                     ++cp;
  2530. !                     break;
  2531. !                 }
  2532. !             }
  2533. !         } else
  2534. !             break;
  2535.       }
  2536.   
  2537. !     /* Return the size (number of ints) of values found. */
  2538. !     return(getnum(cp, buf, length));
  2539.   }
  2540. ***************
  2541. *** 351,361
  2542.   ** used because it doesn't allow different bases, and for the
  2543. ! ** sake of consistency.
  2544.   */
  2545. ! static int getnum(str)
  2546. !   register char *str;
  2547.   {
  2548.       register int base = 10;
  2549. !     register int i = 0, digit;
  2550. !     register int sign = 1;
  2551.   
  2552.       while (isspace(*str) || *str == PLUS || *str == MINUS) {
  2553. --- 329,351 -----
  2554.   ** used because it doesn't allow different bases, and for the
  2555. ! ** sake of consistency.  Postfix 'L' or 'l' indicates long.
  2556. ! **
  2557. ! ** As long as we're reading in only one (variably sized) value,
  2558. ! ** we'll also take on the task of storing it.
  2559.   */
  2560. ! static int getnum(str, buf, n)
  2561. !   register char *str;        /* String containing number */
  2562. !   int *buf;            /* Address of int storage array */
  2563. !   int n;            /* Length of storage array */
  2564.   {
  2565.       register int base = 10;
  2566. !     register int j, digit;
  2567. !     register long int i = 0;
  2568. !     byte sign = 1;
  2569. !     bool is_long = FALSE; 
  2570. !     static int nbits = 0;
  2571.   
  2572. +     /* If no room to store, don't bother. */
  2573. +     if (n <= 0)
  2574. +         return(0);
  2575.       while (isspace(*str) || *str == PLUS || *str == MINUS) {
  2576. ***************
  2577. *** 430,432
  2578.               break;
  2579.   
  2580.             default:    break;
  2581. --- 420,427 -----
  2582.               break;
  2583.   
  2584. +           case 'L':    /* Not a digit -- "long" indicator. */
  2585. +           case 'l':
  2586. +             is_long = TRUE;
  2587. +             break;
  2588.             default:    break;
  2589. ***************
  2590. *** 442,445
  2591.       if (sign < 0)
  2592. !         return(-i);
  2593. !     return(i);
  2594.   }
  2595. --- 433,470 -----
  2596.       if (sign < 0)
  2597. !         i = -i;
  2598. !     buf[0] = i;
  2599. !     if (!is_long)        /* Value wasn't really long. */
  2600. !         return(1);
  2601. !     if (nbits == 0)        /* Figure out #bits/int */
  2602. !         nbits = getnbits();
  2603. !     if (n > WDPLG)        /* Return only long, at most. */
  2604. !         n = WDPLG;
  2605. !     for (j = 1; j < n; j++) {
  2606. !         i >>= nbits;
  2607. !         *++buf = i;
  2608. !     }
  2609. !     return(n);
  2610. ! }
  2611. ! static int getnbits()
  2612. ! {
  2613. !     register int i, n;
  2614. ! #ifdef    EBUG
  2615. !     return(16);
  2616. ! #endif    EBUG
  2617. !     n = 0;
  2618. !     for (i = 1; i != 0; i <<= 1)
  2619. !         ++n;
  2620. !     return(n);
  2621.   }
  2622.  
  2623.     Joe Yao        hadron!jsdy@seismo.{CSS.GOV,ARPA,UUCP}
  2624.  
  2625. Volume-Number: Volume 3, Number 34
  2626.  
  2627. From jsq  Fri Nov 22 11:26:51 1985
  2628. Path: ut-sally!std-unix
  2629. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2630. Newsgroups: mod.std.unix
  2631. Subject: limits ltd.
  2632. Message-Id: <3625@ut-sally.UUCP>
  2633. Date: 22 Nov 85 17:26:40 GMT
  2634. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2635. Lines: 23
  2636. Approved: jsq@ut-sally.UUCP
  2637. Draft-9: 2.9
  2638.  
  2639. Date: Fri, 22 Nov 85 08:58:04 cst
  2640. From: allegra!jpl (John P. Linderman)
  2641.  
  2642. It is possible to combine several of the proposed solutions to
  2643. run time lookup of symbolic constants.  For example, one might
  2644. do the following to establish the values V1 ... Vn as defined
  2645. in file H.h:
  2646.  
  2647. 1)  Attempt the cc -E lookup in H.h.
  2648. 2)  If any (or all) values remain undefined, try the table lookup
  2649.     in /etc/H.
  2650. 3)  If the user has specified environment variable H-Vi, use that
  2651.     instead of any lookup value.
  2652. 4)  Return the values.
  2653.  
  2654. Shuffle the precedence as you see fit.  You can arrange for /etc/H to
  2655. override the values in H.h.  You can ignore what's in the environment.
  2656. Perhaps we can agree on what makes the most sense, and then somebody
  2657. can crank out a routine for public use.
  2658.  
  2659. John P. Linderman  allegra!jpl
  2660.  
  2661. Volume-Number: Volume 3, Number 35
  2662.  
  2663. From jsq  Fri Nov 22 11:31:06 1985
  2664. Path: ut-sally!std-unix
  2665. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2666. Newsgroups: mod.std.unix
  2667. Subject: Re: duplicate articles
  2668. Message-Id: <3626@ut-sally.UUCP>
  2669. Date: 22 Nov 85 17:30:38 GMT
  2670. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2671. Lines: 5
  2672. Approved: jsq@ut-sally.UUCP
  2673. Draft-9: mod.std.unix
  2674.  
  2675. The problem of duplicate articles in mod.std.unix seems to be fixed:
  2676. it was a new site which got confused during installation.  So unless
  2677. you see any duplicates which were *posted* later than today, ignore them.
  2678.  
  2679. Volume-Number: Volume 3, Number 36
  2680.  
  2681. From jsq  Fri Nov 22 19:57:52 1985
  2682. Path: ut-sally!std-unix
  2683. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2684. Newsgroups: mod.std.unix
  2685. Subject: Re:  limits
  2686. Message-Id: <3634@ut-sally.UUCP>
  2687. Date: 23 Nov 85 01:57:46 GMT
  2688. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2689. Lines: 29
  2690. Approved: jsq@ut-sally.UUCP
  2691. Draft-9: 2.9
  2692.  
  2693. Date:     Thu, 21 Nov 85 10:43:08 EST
  2694. From: Dan Franklin <dan@BBN-PROPHET.ARPA>
  2695.  
  2696. Mark Horton's message on ways of getting kernel-determined limits out
  2697. of files implies, to me, that the only reasonable way to get such limits
  2698. at runtime is through a kernel system call.  It solves all of the problems
  2699. Mark outlined at the cost of a few bytes of data space.
  2700.  
  2701. It's not clear that we need to describe the implementation at such a low
  2702. level, though.  All we really need is to standardize the interface through
  2703. which the information is maintained.  The choice of using a file or a system
  2704. call (in fact both might be appropriate, for different limits) is up to the
  2705. implementation.
  2706.  
  2707. (Mark's message also left me with the uneasy feeling that I might have missed
  2708. an issue or two, as I don't remember seeing anything on "cc -E | sed" before.
  2709. Have I?)
  2710.  
  2711. [ No, you haven't.  We've been having mailer problems associated with flaky
  2712. nameservers here and elsewhere, plus BBN sometimes forgets how to talk to us,
  2713. and the reverse.  I'll send you the ones you've missed.
  2714.  
  2715. Free trial offer, open to anyone:  the Volume-Number line tacked onto the
  2716. end is so you can check to see if there are any gaps in what you've received.
  2717. Send me a list of ones you didn't get and I'll send them to you again.  -mod ]
  2718.  
  2719.     Dan Franklin
  2720.  
  2721. Volume-Number: Volume 3, Number 37
  2722.  
  2723. From jsq  Fri Nov 22 20:11:32 1985
  2724. Path: ut-sally!std-unix
  2725. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2726. Newsgroups: mod.std.unix
  2727. Subject: Re:  OPEN_MAX and other constants - are they desireable?
  2728. Message-Id: <3635@ut-sally.UUCP>
  2729. Date: 23 Nov 85 02:11:26 GMT
  2730. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2731. Lines: 21
  2732. Approved: jsq@ut-sally.UUCP
  2733. Draft-9: 2.9
  2734.  
  2735. Date:     Tue, 19 Nov 85 20:57:51 EST
  2736. From: Dan Franklin <dan@BBN-PROPHET.ARPA>
  2737.  
  2738. > I have another argument against the desirability of these constants.  It does
  2739. > not allow people to do implementations that don't have any limitations (other
  2740. > than availability of resources).  It would be fairly easy to design a system
  2741. > that would allow you to have an "unlimited" number of files, by allocating
  2742. > a new table when the current table gets full.
  2743.  
  2744. Even given such a system, I think it would still be desirable to place SOME
  2745. limit on the number of open files per process to limit the consequences of
  2746. error.  A runaway program could conceivably open an unlimited number of files
  2747. and use up the common resources (and also make it difficult to kill the
  2748. process).  Limiting a process to 500 or so open files seems like a good idea
  2749. (just like most systems put some huge, but definite, limit on the size of a
  2750. user's stack).  This arbitrary limit would be the one that the limit facility
  2751. would return.
  2752.  
  2753.     Dan Franklin
  2754.  
  2755. Volume-Number: Volume 3, Number 38
  2756.  
  2757. From jsq  Fri Nov 22 20:17:04 1985
  2758. Path: ut-sally!std-unix
  2759. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2760. Newsgroups: mod.std.unix
  2761. Subject: Re: Draft ambiguity
  2762. Message-Id: <3636@ut-sally.UUCP>
  2763. Date: 23 Nov 85 02:16:55 GMT
  2764. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2765. Lines: 25
  2766. Approved: jsq@ut-sally.UUCP
  2767. Draft-9: 2.9
  2768.  
  2769. Date: Fri, 22 Nov 85 09:34:32 cst
  2770. From: ihnp4!uiucdcs!ccvaxa!preece@SEISMO.CSS.GOV (Scott Preece)
  2771.  
  2772. > From: athena!steved%tektronix.csnet@CSNET-RELAY.ARPA
  2773. > The limits file is not intended to represent necessarily the current
  2774. > limit.  For example, PROC_MAX tells an application programmer that he
  2775. > knows that there can be n processes existing simultaneously.  However,
  2776. > the o.s. implementer may have some dynamic allocation scheme where the
  2777. > actual limit varies with say system load.  The goal of the standard is
  2778. > to allow that kind of implementation.
  2779. ----------
  2780. There are a lot of error definitions in the draft that specifically
  2781. say that specific, named system limits have been exceeded.  For
  2782. instance, the fork error code mention PROC_MAX and CHILD_MAX.
  2783. If the limit is, in fact, dynamic or otherwise differs from the
  2784. named constant, you are causing confusion...
  2785.  
  2786. [ Yes, it's hard to find non-confusing language to describe this.  -mod ]
  2787.  
  2788. -- 
  2789. scott preece
  2790. gould/csd - urbana
  2791. ihnp4!uiucdcs!ccvaxa!preece
  2792.  
  2793. Volume-Number: Volume 3, Number 39
  2794.  
  2795. From jsq  Fri Nov 22 20:29:27 1985
  2796. From: Moderator, John Quarterman <std-unix@ut-sally.UUCP>
  2797. Subject: ;login article on P1003
  2798. Message-Id: <3637@ut-sally.UUCP>
  2799. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2800. Approved: jsq@ut-sally.UUCP
  2801. Date: 23 Nov 85 02:29:11 GMT
  2802. Draft-9: Access.;login:
  2803.  
  2804. There's an article in the latest ;login: (USENIX Association Newsletter:
  2805. Volume 10, Number 4, October/November 1985) about IEEE P1003.  It's a
  2806. condensation of some things you've seen in this newsgroup.  Might be
  2807. of interest, might not.
  2808.  
  2809. Volume-Number: Volume 3, Number 40
  2810.  
  2811. From news@IM4U.UTEXAS.EDU  Mon Nov 25 17:49:26 1985
  2812. From: John.Quarterman@IM4U.UTEXAS.EDU,
  2813.         Moderator <std-unix%ut-sally.UUCP@IM4U.UTEXAS.EDU>
  2814. Newsgroups: mod.std.unix
  2815. Subject: Re: public domain AT&T getopt source
  2816. Message-Id: <3648@ut-sally.UUCP>
  2817. References: <3352@ut-sally.UUCP>
  2818. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2819. Date: 25 Nov 85 23:13:10 GMT
  2820. Draft-9: 1003.2.getopt
  2821.  
  2822. A couple of days after I posted the getopt source, I finally got
  2823. the copy I had ordered from the AT&T toolchest.  They are identical,
  2824. except that the one from the toolchest has the following prepended:
  2825.  
  2826. 1,14d0
  2827. < /*
  2828. <  *      Copyright (c) 1984, 1985 AT&T
  2829. <  *      All Rights Reserved
  2830. <  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE 
  2831. <  *      CODE OF AT&T.
  2832. <  *      The copyright notice above does not 
  2833. <  *      evidence any actual or intended
  2834. <  *      publication of such source code.
  2835. <  */
  2836. < #ident    "@(#)getopt.c    1.9"
  2837. < /*    3.0 SID #    1.2    */
  2838.  
  2839. AT&T appear to be of two minds about this, since the copy I got
  2840. directly by mail from them did not have any such notice, and this is in
  2841. fact the same code which *was* published at the Dallas Uniforum, and
  2842. made public domain, to boot.  Since the copy I posted was not the
  2843. toolchest one, and had no such notice, I guess the notice is irrelevant.
  2844.  
  2845. Now to send them a check for $1.80 for the toolchest transmission fee....
  2846.  
  2847. Volume-Number: Volume 3, Number 41
  2848.  
  2849. From jsq  Tue Nov 26 12:25:18 1985
  2850. Path: ut-sally!std-unix
  2851. From: std-unix@ut-sally.UUCP (John Quarterman, Moderator)
  2852. Newsgroups: mod.std.unix
  2853. Subject: Re: Draft ambiguity
  2854. Message-Id: <3652@ut-sally.UUCP>
  2855. Date: 26 Nov 85 18:25:04 GMT
  2856. References: <3636@ut-sally.UUCP>
  2857. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2858. Lines: 16
  2859. Approved: jsq@ut-sally.UUCP
  2860. Draft-9: 2.9
  2861.  
  2862. Date: Mon, 25 Nov 85 11:35:46 pst
  2863. From: saber!msc@ihnp4.uucp (Mark Callow)
  2864.  
  2865. >  [discussion by steved@athena and Scott Preece on limits.h, dynamic
  2866. >  limits and error message definitions in the draft (deleted for brevity)]
  2867. > [ Yes, it's hard to find non-confusing language to describe this.  -mod ]
  2868. ------------
  2869. "Non-confusing language" is only hard to find when the idea that you are
  2870. describing is confused.
  2871.  
  2872. [ Draft 6 is now available (see announcement in next article).
  2873. Suggest you look at the current wording in it, and propose new wording
  2874. which describes the appropriate ideas in non-confusing language.  -mod ]
  2875.  
  2876. Volume-Number: Volume 3, Number 42
  2877.  
  2878. From jsq  Wed Nov 27 16:04:32 1985
  2879. Path: ut-sally!std-unix
  2880. From: std-unix@ut-sally.UUCP (Moderator, John Quarterman)
  2881. Newsgroups: mod.std.unix
  2882. Subject: Re: limits ltd.
  2883. Message-Id: <3664@ut-sally.UUCP>
  2884. Date: 27 Nov 85 22:04:23 GMT
  2885. References: <3625@ut-sally.UUCP>
  2886. Organization: IEEE/P1003 Portable Operating System Environment Committee
  2887. Lines: 25
  2888. Approved: jsq@sally.UUCP
  2889. Draft-9: 2.9
  2890.  
  2891. From: geoff@desint.uucp (Geoff Kuenning)
  2892. Date: Tue, 26 Nov 85 21:31:36 pst
  2893. Status: O
  2894.  
  2895. In article <3625@ut-sally.UUCP> allegra!jpl (John P. Linderman) writes:
  2896.  
  2897. >3)  If the user has specified environment variable H-Vi, use that
  2898. >    instead of any lookup value.
  2899.  
  2900. Have you every typed "show *" on VMS (or whatever the syntax is;  I'm
  2901. glad to say I've forgotten)?  You will get a list of literally
  2902. *hundreds* of environment variables, most of which are absolutely
  2903. necessary for the system to work properly.  The result is you can never
  2904. find anything.
  2905.  
  2906. It is *not* a good idea to cavalierly add variables to the environment.
  2907. In the first place, it increases the cost of forking *and* exec-ing,
  2908. in the second place every program has to provide for the variable, and
  2909. in the third place it makes the user's life more difficult.  I'm already
  2910. harassed enough by the size of my environment, thank you.
  2911. -- 
  2912.  
  2913.     Geoff Kuenning
  2914.     {hplabs,ihnp4}!trwrb!desint!geoff
  2915.  
  2916. Volume-Number: Volume 3, Number 43
  2917.  
  2918.