Hi,

I did some research on different operating systems regarding checksumming and
found that solaris had a nice option called "digest -l" which prints the
available algorithms and exits.  I wrote this functionality into cksum(1) 
that you can have if you want it.  Patch follows.

-peter


? cksum.1-orig
? cksum.patch
? md5.c-orig
Index: cksum.1
===================================================================
RCS file: /cvs/src/bin/md5/cksum.1,v
retrieving revision 1.19
diff -u -r1.19 cksum.1
--- cksum.1     8 Feb 2009 17:15:09 -0000       1.19
+++ cksum.1     11 May 2009 08:07:36 -0000
@@ -42,7 +42,7 @@
 .Sh SYNOPSIS
 .Nm cksum
 .Bk -words
-.Op Fl bpqrtx
+.Op Fl blpqrtx
 .Op Fl a Ar algorithms
 .Op Fl c Op Ar checklist ...
 .Op Fl o Ar 1 | 2
@@ -162,6 +162,8 @@
 option may not be used in conjunction with more than a single
 .Fl a
 option.
+.It Fl l
+outputs the algorithms available and exits.
 .It Fl o Ar 1 | 2
 Use historic algorithms instead of the (superior) default one
 (see below).
Index: md5.c
===================================================================
RCS file: /cvs/src/bin/md5/md5.c,v
retrieving revision 1.50
diff -u -r1.50 md5.c
--- md5.c       6 Sep 2008 12:01:34 -0000       1.50
+++ md5.c       11 May 2009 08:07:36 -0000
@@ -201,6 +201,7 @@
 void usage(void) __attribute__((__noreturn__));
 
 extern char *__progname;
+extern int errno;
 int qflag = 0;
 
 int
@@ -210,14 +211,14 @@
        struct hash_list hl;
        size_t len;
        char *cp, *input_string;
-       int fl, error, base64;
+       int fl, error, base64, i;
        int bflag, cflag, pflag, rflag, tflag, xflag;
 
        static const char *optstr[5] = {
                "bcpqrs:tx",
                "bcpqrs:tx",
                "bcpqrs:tx",
-               "a:bco:pqrs:tx",
+               "a:bco:lpqrs:tx",
                "a:bco:pqrs:tx"
        };
 
@@ -315,6 +316,20 @@
                        if (hftmp == TAILQ_END(&hl))
                                hash_insert(&hl, hf, 0);
                        break;
+               case 'l':
+                       for (hf = functions; hf->name != NULL; hf++) {
+                               len = strlen(hf->name);
+                               if ((cp = calloc(1, len + 1)) == NULL) 
+                                       errx(1, "malloc: %s", strerror(errno));
+                               
+                               for (i = 0; i < len; i++) {
+                                       cp[i] = tolower(*(hf->name + i));
+                               }       
+
+                               printf("%s\n", cp);
+                               free(cp);
+                       }
+                       exit(0);
                case 'p':
                        pflag = 1;
                        break;

Reply via email to