aboutsummaryrefslogtreecommitdiff
path: root/crypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypt.c')
-rw-r--r--crypt.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/crypt.c b/crypt.c
index 29c4794..5e13fbd 100644
--- a/crypt.c
+++ b/crypt.c
@@ -1,36 +1,40 @@
#include "crypt.h"
-/*
- * Main function
- */
int main (int argc, char **argv)
{
- /* The hash we will produce, hopefully */
- char *hash = NULL;
-
- /* Option character */
+ char *hash, *key, *salt;
int opt;
- /* Iterate through any options */
while ((opt = getopt(argc, argv, "h")) != -1) {
switch (opt) {
- case 'h':
+ case 'h': /* Help */
usage(stdout, EXIT_SUCCESS);
break;
- case '?':
+ case '?': /* Unknown option */
usage(stderr, EXIT_FAILURE);
break;
- default:
+ default: /* Shouldn't happen */
abort();
}
}
- /* If we don't have three arguments left now, bail */
+ /*
+ * If we don't have three arguments left after processing the options,
+ * exit with usage information and error status
+ */
if (argc != 3)
usage(stderr, EXIT_FAILURE);
- /* All seems well, build the hash and print it */
- hash = crypt(argv[1], argv[2]);
+ key = argv[1];
+ salt = argv[2];
+
+ /*
+ * Create the hash, but exit immediately with the system error string
+ * if it returns a null pointer (error condition)
+ */
+ if (!(hash = crypt(key, salt)))
+ error(strerror(errno));
+
puts(hash);
exit(EXIT_SUCCESS);
}
@@ -42,3 +46,11 @@ void usage(FILE *stream, int status) {
fputs("USAGE: crypt [-h | KEY SALT]\n", stream);
exit(status);
}
+
+/*
+ * Exit with error error message
+ */
+void error(char *message) {
+ fprintf(stderr, "%s\n", message);
+ exit(EXIT_FAILURE);
+}