On 06/14/2010 09:26 AM, Thomas Lange wrote:
On Tue, 01 Jun 2010 20:03:00 -0500, Rob<[email protected]>  said:
     >  Patch attached.  This patch is for the newly modified ainsl(1) command
     >  which returns 0 if the LINE/PATTERN was found in the file (revision 
5797).
Hi Rob,

where is exit code 2 or 13 set in ainsl? I cannot find this in the code.

The codes 2 and 13 were determined by manual testing. In several places ainsl calls the perl "die" function. "die" exits with the current value of $! (errno). If $! is 0 , exits with the value of ($?>> 8) (backtick `command` status). If ($?>> 8) is 0 , exits with 255.

Exit code 2 (no such file or directory) comes from line 126:

   -f $filename || die "ainsl: target file $filename does not exist.\n";

The "-f" test will set the errno to 2 (no such file or directory), which is then returned by "die". This happens if "autocreate" is not enabled.

Exit code 13 (permission denied) comes from line 141:

   open (INFILE, ">>$filename") or die "ainsl: can't open $filename for
   writing. $!";

This "die" returns 13 if the permissions prohibit writing. This "open" statement could also return 30, "Read-only file system", if the target fs is read-only.

I also noticed a possible not detected error. That is the "print" and "close" at the end of the ainsl source. If for some reason the target file system is full, the error returned by print or, more probably "close" would be ignored. This would return the exit code 28 - No space left on device. My recommendation would be to add "die" statements to the last 2 lines of the file:

   print INFILE $line,"\n" || die "ainsl: cannot print to file
   $filename: $!";
   close(INFILE) or die "ainsl: error saving file $filename: $!";


On a full file system, the above "close" will return 28, "No space left on device". I think that should also be listed in EXIT CODES (if we add a check for the close return value in ainsl source). So maybe the document would say:

   .TP
   .B 13
   Permissions do not allow writing to FILE and LINE/PATTERN was not
   found in file.
   .TP
   .B 28
   FILE cannot written because the filesystem has no space and
   LINE/PATTERN was not found in file.
   .TP
   .B 30
   FILE cannot written because the filesystem is read-only and
   LINE/PATTERN was not found in file.

Or, we could be simple and say only that any non-zero means that ainsl failed to verify or add PATTERN in FILE. Alternative:

   .TP
   .B non-zero
   Either FILE does not exist or FILE does not contain PATTERN/LINE and
   cannot be written.  A diagnostic message will be printed on stderr
   which explains the details.


In all cases, it seems a good idea to check the return code of the final print and close statements.

Thank you,
Rob

+.SH EXIT CODES
+.TP
+.B 0
+Success: Either FILE contains the LINE/PATTERN or LINE was appended to FILE.
+.TP
+.B 2
+FILE does not exist and the autocreate option (-a) is not present.
+.TP
+.B 13
+FILE cannot be opened for writing and LINE/PATTERN was not found in file.
+

Antwort per Email an