xref: /freebsd/usr.bin/perror/perror.c (revision 9a3009b8009f43f5d6d763c9e1e37ac9c5f8b358)
19a3009b8SGeorge V. Neville-Neil /*-
29a3009b8SGeorge V. Neville-Neil  * Copyright (c) 2009 Advanced Computing Technologies LLC
39a3009b8SGeorge V. Neville-Neil  * Written by: George V. Neville-Neil <gnn@FreeBSD.org>
49a3009b8SGeorge V. Neville-Neil  * All rights reserved.
59a3009b8SGeorge V. Neville-Neil  *
69a3009b8SGeorge V. Neville-Neil  * Redistribution and use in source and binary forms, with or without
79a3009b8SGeorge V. Neville-Neil  * modification, are permitted provided that the following conditions
89a3009b8SGeorge V. Neville-Neil  * are met:
99a3009b8SGeorge V. Neville-Neil  * 1. Redistributions of source code must retain the above copyright
109a3009b8SGeorge V. Neville-Neil  *    notice, this list of conditions and the following disclaimer.
119a3009b8SGeorge V. Neville-Neil  * 2. Redistributions in binary form must reproduce the above copyright
129a3009b8SGeorge V. Neville-Neil  *    notice, this list of conditions and the following disclaimer in the
139a3009b8SGeorge V. Neville-Neil  *    documentation and/or other materials provided with the distribution.
149a3009b8SGeorge V. Neville-Neil  *
159a3009b8SGeorge V. Neville-Neil  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
169a3009b8SGeorge V. Neville-Neil  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
179a3009b8SGeorge V. Neville-Neil  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
189a3009b8SGeorge V. Neville-Neil  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
199a3009b8SGeorge V. Neville-Neil  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
209a3009b8SGeorge V. Neville-Neil  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
219a3009b8SGeorge V. Neville-Neil  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
229a3009b8SGeorge V. Neville-Neil  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
239a3009b8SGeorge V. Neville-Neil  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
249a3009b8SGeorge V. Neville-Neil  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
259a3009b8SGeorge V. Neville-Neil  * SUCH DAMAGE.
269a3009b8SGeorge V. Neville-Neil  */
279a3009b8SGeorge V. Neville-Neil 
289a3009b8SGeorge V. Neville-Neil #include <sys/cdefs.h>
299a3009b8SGeorge V. Neville-Neil __FBSDID("$FreeBSD$");
309a3009b8SGeorge V. Neville-Neil 
319a3009b8SGeorge V. Neville-Neil #include <stdio.h>
329a3009b8SGeorge V. Neville-Neil #include <stdlib.h>
339a3009b8SGeorge V. Neville-Neil #include <string.h>
349a3009b8SGeorge V. Neville-Neil #include <sys/errno.h>
359a3009b8SGeorge V. Neville-Neil 
369a3009b8SGeorge V. Neville-Neil #define MAX_ERR 256
379a3009b8SGeorge V. Neville-Neil 
389a3009b8SGeorge V. Neville-Neil void usage()
399a3009b8SGeorge V. Neville-Neil {
409a3009b8SGeorge V. Neville-Neil 
419a3009b8SGeorge V. Neville-Neil 	printf("usage: perror number\n");
429a3009b8SGeorge V. Neville-Neil 	printf("number must be between 1 and %d\n", ELAST);
439a3009b8SGeorge V. Neville-Neil 	exit(1);
449a3009b8SGeorge V. Neville-Neil }
459a3009b8SGeorge V. Neville-Neil 
469a3009b8SGeorge V. Neville-Neil int main(int argc, char **argv)
479a3009b8SGeorge V. Neville-Neil {
489a3009b8SGeorge V. Neville-Neil 
499a3009b8SGeorge V. Neville-Neil 	char errstr[MAX_ERR];
509a3009b8SGeorge V. Neville-Neil 	char *cp;
519a3009b8SGeorge V. Neville-Neil 	int errnum;
529a3009b8SGeorge V. Neville-Neil 
539a3009b8SGeorge V. Neville-Neil 	if (argc != 2)
549a3009b8SGeorge V. Neville-Neil 		usage();
559a3009b8SGeorge V. Neville-Neil 
569a3009b8SGeorge V. Neville-Neil 	errnum = strtol(argv[1], &cp, 0);
579a3009b8SGeorge V. Neville-Neil 
589a3009b8SGeorge V. Neville-Neil 	if (((errnum == 0) && (errno == EINVAL)) || (*cp != '\0')) {
599a3009b8SGeorge V. Neville-Neil 		printf("Argument %s not a number.\n", argv[1]);
609a3009b8SGeorge V. Neville-Neil 		usage();
619a3009b8SGeorge V. Neville-Neil 	}
629a3009b8SGeorge V. Neville-Neil 
639a3009b8SGeorge V. Neville-Neil 	if ((errnum <=0) || (errnum > ELAST)) {
649a3009b8SGeorge V. Neville-Neil 		printf("Number %d out of range.\n", errnum);
659a3009b8SGeorge V. Neville-Neil 		usage();
669a3009b8SGeorge V. Neville-Neil 	}
679a3009b8SGeorge V. Neville-Neil 
689a3009b8SGeorge V. Neville-Neil 	if (strerror_r(errnum, errstr, sizeof(errstr)) < 0) {
699a3009b8SGeorge V. Neville-Neil 		printf("Could not find error number %d.\n", errnum);
709a3009b8SGeorge V. Neville-Neil 		usage();
719a3009b8SGeorge V. Neville-Neil 	}
729a3009b8SGeorge V. Neville-Neil 
739a3009b8SGeorge V. Neville-Neil 	printf("Error %d is \"%s\"\n", errnum, errstr);
749a3009b8SGeorge V. Neville-Neil 
759a3009b8SGeorge V. Neville-Neil 	exit(0);
769a3009b8SGeorge V. Neville-Neil }
77