|
|
1.1 ! root 1: /* hosts.c - handles lists of uucp hosts. ! 2: * part of uucheck ! 3: */ ! 4: ! 5: #include <stdio.h> ! 6: #include "checkperms.h" ! 7: ! 8: struct hostname_struct { ! 9: char *hostname; ! 10: struct hostname_struct *next_hostname; ! 11: }; ! 12: ! 13: typedef struct hostname_struct hostname_type; ! 14: ! 15: static hostname_type *first_hostname = (hostname_type *) NULL; ! 16: ! 17: char * ! 18: first_host(command) ! 19: char *command; ! 20: { ! 21: FILE *fp; ! 22: hostname_type *current_hostname; /* Linked list walker. */ ! 23: ! 24: /* Here is where we open Permissions and L.sys and extract a list ! 25: * of all the hosts we might talk to. This list will be walked ! 26: * through by "next_host()". ! 27: */ ! 28: ! 29: if ((fp = popen(command, "r")) == NULL) { ! 30: FATAL("Can not create list of host names.\n", NULL); ! 31: } /* if can not open pipe to uuname */ ! 32: ! 33: /* Read all the output of uuname into out linked list. */ ! 34: ! 35: if (fgets(bigbuf, MAX_NAME + 1, fp) != NULL) { ! 36: bigbuf[strlen(bigbuf) - 1 ] = (char) NULL; /* Wipe out trailing nl. */ ! 37: /* Make space for the first entry. */ ! 38: first_hostname = (hostname_type *) malloc(sizeof(hostname_type)); ! 39: /* Move up to the new entry. */ ! 40: current_hostname = first_hostname; ! 41: /* Copy the first hostname into the list. */ ! 42: copy_str(¤t_hostname->hostname, bigbuf); ! 43: current_hostname->next_hostname = (hostname_type *) NULL; ! 44: } /* if (fgets(bigbuf, MAX_NAME + 1, fp) != NULL) */ ! 45: ! 46: while (fgets(bigbuf, MAX_NAME + 1, fp) != NULL) { ! 47: bigbuf[strlen(bigbuf) - 1] = (char) NULL; /* Wipe out trailing nl. */ ! 48: /* Make space for the next entry. */ ! 49: current_hostname->next_hostname = ! 50: (hostname_type *) malloc(sizeof(hostname_type)); ! 51: /* Move up to the new entry. */ ! 52: current_hostname = current_hostname->next_hostname; ! 53: /* Copy the next hostname into the list. */ ! 54: copy_str(¤t_hostname->hostname, bigbuf); ! 55: current_hostname->next_hostname = (hostname_type *) NULL; ! 56: } /* while (fgets(bigbuf, MAX_NAME + 1, fp) != NULL) */ ! 57: ! 58: /* Is this list only one entry long? */ ! 59: if (first_hostname->next_hostname != NULL ) { ! 60: last_host = FALSE; ! 61: } else { ! 62: last_host = TRUE; ! 63: } ! 64: return(first_hostname->hostname); ! 65: } /* first_host() */ ! 66: ! 67: /* Destructively return the next host to be processed. */ ! 68: char * ! 69: next_host() ! 70: { ! 71: hostname_type *tmp; ! 72: ! 73: if ( first_hostname != NULL ) { ! 74: free(first_hostname->hostname); /* Throw away the last name. */ ! 75: tmp=first_hostname; ! 76: first_hostname = first_hostname->next_hostname; ! 77: free(tmp); /* Throw away the structure it was stored in. */ ! 78: if (first_hostname->next_hostname == (hostname_type *) NULL) { ! 79: last_host = TRUE; /* About to return the last host in the list. */ ! 80: } /* if this is the last host */ ! 81: return(first_hostname->hostname); ! 82: } else { ! 83: return(NULL); ! 84: } /* if fist_hostname != NULL (no hosts left) */ ! 85: FATAL("Unreachable statement in next_host() reached.\n", NULL); ! 86: } /* next_host() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.