/* * Program used to convert password database from digital unix to * shadow format. * * wildcat */ #include #include #include int convert (char **); int main (int argc, char **argv) { FILE *fsrc, *fdst; char *line = NULL; size_t len = 0; if (argc < 3) { printf("Syntax error, use %s \n", argv[0]); exit(0); } if (!(fsrc = fopen(argv[1], "r"))) { printf("Cannot open %s.\n", argv[1]); } if (!(fdst = fopen(argv[2], "w"))) { printf("Cannor create %s.\n", argv[2]); } while (getline (&line, &len, fsrc) > 0) { if (*line == ':' || *(line+1) == ':') { free (line); len=0; continue; } if (convert(&line) > 0) fprintf(fdst, "%s\n", line); free(line); len = 0; } fclose(fsrc); fclose(fdst); return 1; } int convert (char **line) { char *tmp; char *login; char *pass; size_t len; if (( tmp = strstr(*line, "u_name"))) { tmp += (strlen("u_name")) + 1; len = ((strchr(tmp, ':')) - tmp ); login = (char *) malloc (len + 1 ); strncpy(login, tmp, len); *(login + len) = '\0'; if ((tmp = strstr(*line, "u_pwd"))) { tmp += (strlen("u_pwd")) + 1; len = ((strchr(tmp, ':')) - tmp ); pass = (char *) malloc (len + 1 ); strncpy(pass, tmp, len); *(pass + len) = '\0'; free (*line); *line = (char *) malloc(strlen(login) + strlen(pass) + 2 ); sprintf(*line, "%s:%s", login, pass); free(login); free(pass); return 1; } free(login); } return -1; }