Thread: [digraphanalysis-cvs] digraphanalysis/src gpg2digraph.1, gpg2digraph.c, gpg2dot.1, gpg2dot.c, Makefi
Status: Planning
Brought to you by:
jbreker
|
From: Jeff B. <jb...@us...> - 2005-07-05 00:42:27
|
Update of /cvsroot/digraphanalysis/digraphanalysis/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6985/src Modified Files: Makefile.am Added Files: gpg2digraph.1 gpg2digraph.c gpg2dot.1 gpg2dot.c Log Message: Moved files around. --- NEW FILE: gpg2dot.1 --- --- NEW FILE: gpg2dot.c --- /* $Id: gpg2dot.c,v 1.1 2005/07/05 00:42:11 jbreker Exp $ * * Copyright (C) 2005 Jeff Breker <jb...@sy...> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sysexits.h> #include <unistd.h> char *do_pub(void); void do_sig(char *); char *do_uid(char *); unsigned int encode(char *); void func001(unsigned int); char *get_fingerprint(); char *get_keyid(); char *get_name(); /* Handle a sig line. */ void do_sig(char *keyid_p) { char c, *keyid_s, *name; func001(4); keyid_s = get_keyid(); func001(5); name = get_name(); if (strcmp(name, "[User ID not found]") != 0) { fprintf(stdout, "\"%s\" -> \"%s\";\n", keyid_s, keyid_p); while (((c = fgetc(stdin)) != '\n') && (feof(stdin) == 0)) if(ferror(stdin)) exit(EX_IOERR); } free(keyid_s); free(name); return; } /* Handle a pub line. */ char * do_pub() { char c, *keyid, *name; func001(4); keyid = get_keyid(); func001(5); name = get_name(); fprintf(stdout, "\"%s\" [label=\"%s\"];\n", keyid, name); while (((c = fgetc(stdin)) != '\n') && (feof(stdin) == 0)) if (ferror(stdin)) exit(EX_IOERR); free(name); return keyid; } /* Handle a uid line. */ char * do_uid(char *keyid_p) { char c, *keyid, *name; func001(7); keyid = get_fingerprint() + 24; func001(2); name = get_name(); /* fprintf(stdout, "\"%s\" = \"%s\";\n", keyid_p, keyid); */ while (((c = fgetc(stdin)) != '\n') && (feof(stdin) == 0)) if (ferror(stdin)) exit(EX_IOERR); free(name); return keyid_p; } unsigned int encode(char *string) { return (tolower(toascii((*string))) * 1000000) + (tolower(toascii(*(string + 1))) * 1000) + (tolower(toascii(*(string + 2)))); } /* Advances over 'n' colons. */ void func001(unsigned int n) { char c; unsigned int i; i = 0; while (i < n) if ((c = fgetc(stdin)) == ':') ++i; else if(feof(stdin) || ferror(stdin)) exit(EX_IOERR); return; } /* Obtain the fingerprint from stdin. */ char * get_fingerprint() { char c, *fingerprint; unsigned int i; fingerprint = malloc(41); for (i = 0; i < 40; ++i) { c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); c = toupper(c); if (!isxdigit(c)) exit(EX_DATAERR); *(fingerprint + i) = (char) c; } *(fingerprint + 40) = '\0'; return fingerprint; } /* Obtain the keyid from stdin. */ char * get_keyid() { char c, *keyid; unsigned int i; keyid = malloc(17); for (i = 0; i < 16; ++i) { c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); c = toupper(c); if (!isxdigit(c)) exit(EX_DATAERR); *(keyid + i) = (char) c; } *(keyid + 16) = '\0'; return keyid; } /* Obtain the name from stdin. */ char * get_name() { char c, *name; int tmppipe[2]; unsigned int i; i = 1; pipe(tmppipe); c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); while (c != ':') { ++i; if (i == 0) exit(EX_OSERR); /* String is too long. */ write(tmppipe[1], &c, 1); c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); } if ((name = malloc(i)) == NULL) exit(EX_OSERR); /* Cannot allocate the memory. */ read(tmppipe[0], name, i - 1); close(tmppipe[0]); close(tmppipe[1]); *(name + i - 1) = '\0'; return name; } /* Converts 'gpg --list-sigs --with-colons' output into a dot graph. */ int main(int argc, char **argv) { int break_while; char *keyid_p, *type; break_while = 0; type = malloc(4); fprintf(stdout, "digraph gpg2dot {\n"); while (feof(stdin) == 0) { fgets(type, 4, stdin); if (feof(stdin) || ferror(stdin)) break; switch (encode(type)) { case (112117098): /* pub */ keyid_p = do_pub(); while (feof(stdin) == 0) { fgets(type, 4, stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); switch (encode(type)) { case (112117098): /* pub */ keyid_p = do_pub(); break; case (115105103): /* sig */ do_sig(keyid_p); break; case (117105100): /* uid */ keyid_p = do_uid(keyid_p); break; default: break_while = 1; break; } if(break_while) { break_while = 0; break; } } break; case (117105100): /* uid */ keyid_p = do_uid(keyid_p); while (feof(stdin) == 0) { fgets(type, 4, stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); switch (encode(type)) { case (112117098): /* pub */ keyid_p = do_pub(); break; case (115105103): /* sig */ do_sig(keyid_p); break; case (117105100): /* uid */ keyid_p = do_uid(keyid_p); break; default: break_while = 1; break; } if(break_while) { break_while = 0; break; } } default: break; } } fprintf(stdout, "}\n"); return 0; } --- NEW FILE: gpg2digraph.c --- /* $Id: gpg2digraph.c,v 1.1 2005/07/05 00:42:11 jbreker Exp $ * * Copyright (C) 2005 Jeff Breker <jb...@sy...> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sysexits.h> #include <unistd.h> char *do_pub(void); void do_sig(char *); char *do_uid(char *); unsigned int encode(char *); void func001(unsigned int); char *get_fingerprint(); char *get_keyid(); char *get_name(); /* Handle a sig line. */ void do_sig(char *keyid_p) { char c, *keyid_s, *name; func001(4); keyid_s = get_keyid(); func001(5); name = get_name(); if (strcmp(name, "[User ID not found]") != 0) fprintf(stdout, "e:%u:%s:%u:%s\n", strlen(keyid_p), keyid_p, strlen(keyid_s), keyid_s); while (((c = fgetc(stdin)) != '\n') && (feof(stdin) == 0)) if(ferror(stdin)) exit(EX_IOERR); free(keyid_s); free(name); return; } /* Handle a pub line. Note: this should output only an a line, with this in mind * a lines will be renamed to n lines (dont do this until digraphanalysis * compiles cleanly handling the alias + node lists. */ char * do_pub() { char c, *keyid, *name; func001(4); keyid = get_keyid(); func001(5); name = get_name(); fprintf(stdout, "n:%u:%s:%u:%s:%u:%s\n", strlen(keyid), keyid, strlen(keyid), keyid, strlen(name), name); while (((c = fgetc(stdin)) != '\n') && (feof(stdin) == 0)) if (ferror(stdin)) exit(EX_IOERR); free(name); return keyid; } /* Handle a uid line. */ char * do_uid(char *keyid_p) { char c, *keyid, *name; func001(7); keyid = get_fingerprint() + 24; func001(2); name = get_name(); fprintf(stdout, "n:%u:%s:%u:%s:%u:%s\n", strlen(keyid_p), keyid_p, strlen(keyid), keyid, strlen(name), name); while (((c = fgetc(stdin)) != '\n') && (feof(stdin) == 0)) if (ferror(stdin)) exit(EX_IOERR); free(name); return keyid; } unsigned int encode(char *string) { return (tolower(toascii((*string))) * 1000000) + (tolower(toascii(*(string + 1))) * 1000) + (tolower(toascii(*(string + 2)))); } /* Advances over 'n' colons. */ void func001(unsigned int n) { char c; unsigned int i; i = 0; while (i < n) if ((c = fgetc(stdin)) == ':') ++i; else if(feof(stdin) || ferror(stdin)) exit(EX_IOERR); return; } /* Obtain the fingerprint from stdin. */ char * get_fingerprint() { char c, *fingerprint; unsigned int i; fingerprint = malloc(41); for (i = 0; i < 40; ++i) { c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); c = toupper(c); if (!isxdigit(c)) exit(EX_DATAERR); *(fingerprint + i) = (char) c; } *(fingerprint + 40) = '\0'; return fingerprint; } /* Obtain the keyid from stdin. */ char * get_keyid() { char c, *keyid; unsigned int i; keyid = malloc(17); for (i = 0; i < 16; ++i) { c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); c = toupper(c); if (!isxdigit(c)) exit(EX_DATAERR); *(keyid + i) = (char) c; } *(keyid + 16) = '\0'; return keyid; } /* Obtain the name from stdin. */ char * get_name() { char c, *name; int tmppipe[2]; unsigned int i; i = 1; pipe(tmppipe); c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); while (c != ':') { ++i; if (i == 0) exit(EX_OSERR); /* String is too long. */ write(tmppipe[1], &c, 1); c = fgetc(stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); } if ((name = malloc(i)) == NULL) exit(EX_OSERR); /* Cannot allocate the memory. */ read(tmppipe[0], name, i - 1); close(tmppipe[0]); close(tmppipe[1]); *(name + i - 1) = '\0'; return name; } /* Converts 'gpg --list-sigs --with-colons' output into digraph-analysis input. */ int main(int argc, char **argv) { int break_while; char *keyid_p, *type; break_while = 0; type = malloc(4); while (feof(stdin) == 0) { fgets(type, 4, stdin); if (feof(stdin) || ferror(stdin)) break; switch (encode(type)) { case (112117098): /* pub */ keyid_p = do_pub(); while (feof(stdin) == 0) { fgets(type, 4, stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); switch (encode(type)) { case (112117098): /* pub */ keyid_p = do_pub(); break; case (115105103): /* sig */ do_sig(keyid_p); break; case (117105100): /* uid */ do_uid(keyid_p); break; default: break_while = 1; break; } if(break_while) { break_while = 0; break; } } break; case (117105100): /* uid */ do_uid(keyid_p); while (feof(stdin) == 0) { fgets(type, 4, stdin); if (feof(stdin) || ferror(stdin)) exit(EX_IOERR); switch (encode(type)) { case (112117098): /* pub */ keyid_p = do_pub(); break; case (115105103): /* sig */ do_sig(keyid_p); break; case (117105100): /* uid */ do_uid(keyid_p); break; default: break_while = 1; break; } if(break_while) { break_while = 0; break; } } default: break; } } return 0; } Index: Makefile.am =================================================================== RCS file: /cvsroot/digraphanalysis/digraphanalysis/src/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Makefile.am 3 Jun 2005 00:22:11 -0000 1.1 --- Makefile.am 5 Jul 2005 00:42:10 -0000 1.2 *************** *** 1,2 **** ! bin_PROGRAMS = digraphanalysis digraphanalysis_SOURCES = alias.c analysis.c graph.c input.c list.c main.c node.c output.c --- 1,5 ---- ! bin_PROGRAMS = digraphanalysis gpg2digraph gpg2dot ! digraphanalysis_SOURCES = alias.c analysis.c graph.c input.c list.c main.c node.c output.c + gpg2digraph_SOURCES = gpg2digraph.c + gpg2dot_SOURCES = gpg2dot.c --- NEW FILE: gpg2digraph.1 --- |