aboutsummaryrefslogtreecommitdiff
path: root/crypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypt.c')
-rw-r--r--crypt.c91
1 files changed, 51 insertions, 40 deletions
diff --git a/crypt.c b/crypt.c
index 54b90ce..5e13fbd 100644
--- a/crypt.c
+++ b/crypt.c
@@ -1,45 +1,56 @@
#include "crypt.h"
-/*
- * Main function
- */
int main (int argc, char **argv)
{
- /* The hash we will produce, hopefully */
- char *hash = NULL;
-
- /* Assume user doesn't want help */
- int help = 0;
-
- /* Iterate through any options */
- int o;
- while ((o = getopt(argc, argv, OPTSTRING)) != -1) {
- switch (o) {
- case 'h':
- help = 1;
- break;
- case '?':
- fprintf(stderr, "Unknown option\n");
- break;
- default:
- abort();
- }
- }
-
- /* If help was asked, give it */
- if (help) {
- fprintf(stdout, "%s\n", USAGE);
- exit(EXIT_SUCCESS);
- }
-
- /* If we don't have three arguments, bail */
- if (argc != 3) {
- fprintf(stderr, "%s\n", USAGE);
- exit(EXIT_FAILURE);
- }
-
- /* All seems well, build the hash and print it */
- hash = crypt(argv[1], argv[2]);
- fprintf(stdout, "%s\n", hash);
- exit(EXIT_SUCCESS);
+ char *hash, *key, *salt;
+ int opt;
+
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case 'h': /* Help */
+ usage(stdout, EXIT_SUCCESS);
+ break;
+ case '?': /* Unknown option */
+ usage(stderr, EXIT_FAILURE);
+ break;
+ default: /* Shouldn't happen */
+ abort();
+ }
+ }
+
+ /*
+ * 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);
+
+ 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);
+}
+
+/*
+ * Show usage to given stream, and exit with given code
+ */
+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);
}