This is d_lib.c in view mode; [Download] [Up]
/* * Routines to manipulate the dialing directory file pcomm.dial_dir */ #include <stdio.h> #include "dial_dir.h" #include "param.h" /* * Read the dialing directory. Returns a pointer to a static area * containing the DIAL_DIR structure. All of the entries are created * regardless of the number of physical entries in the file. Element * number zero is reserved for the "manual" entry. All errors are fatal. */ struct DIAL_DIR * read_dir(extra) char *extra; { extern char *null_ptr; FILE *fp, *my_fopen(); int i, line, oops; char *str_dup(), buf[200], *temp_token, *str, *str_tok(), token[20]; char message[80], *sep, *findfile(); static struct DIAL_DIR d; void error_win(); if ((d.d_path = findfile(extra, "pcomm.dial_dir")) == NULL) error_win(1, "Support file \"pcomm.dial_dir\" is missing", "or no read permission"); if (!(fp = my_fopen(d.d_path, "r"))) { sprintf(buf, "\"%s\" for read", d.d_path); error_win(1, "Can't open dialing directory file", buf); } sep = ";;---;;\n"; line = 0; oops = 0; while (fgets(buf, 200, fp) != NULL) { line++; if (line > NUM_DIR) break; /* get the token */ if (!(temp_token = str_tok(buf, '='))) { sprintf(message, "is missing a token at line %d", line); oops++; break; } /* * Parse the rest of the line. This is similar to using * the "real" strtok() function, but this version returns * a pointer to NULL if the token is missing. Note the use * of the array of field separators. */ for (i=0; i<8; i++) { if (!(str = str_tok((char *) NULL, sep[i]))) { sprintf(message, "is missing a parameter at line %d", line); oops++; break; } switch (i) { case 0: d.name[line] = str_dup(str); break; case 1: d.number[line] = str_dup(str); break; case 2: d.baud[line] = atoi(str); break; case 3: d.parity[line] = *str; break; case 4: d.dbits[line] = atoi(str); break; case 5: d.sbits[line] = atoi(str); break; case 6: d.duplex[line] = *str; break; case 7: d.script[line] = str_dup(str); break; } } if (oops) break; /* sanity checking */ sprintf(token, "DIR_%d", line); if (strcmp(temp_token, token)) { sprintf(message, "is corrupted at line %d", line); oops++; break; } } fclose(fp); if (oops) { sprintf(buf, "Dialing directory file \"%s\"", d.d_path); error_win(1, buf, message); } d.d_entries = line; /* if empty database */ if (!line) { sprintf(buf, "Dialing directory file \"%s\"", d.d_path); error_win(0, buf, "has no data"); } /* fill in the rest with defaults */ for (i=line+1; i<=NUM_DIR; i++) { d.name[i] = null_ptr; d.number[i] = null_ptr; d.baud[i] = param->d_baud; d.parity[i] = param->d_parity; d.dbits[i] = param->d_dbits; d.sbits[i] = param->d_sbits; d.duplex[i] = *param->d_duplex; d.script[i] = null_ptr; } /* create an empty "manual" entry */ d.name[0] = null_ptr; d.number[0] = null_ptr; d.baud[0] = param->d_baud; d.parity[0] = param->d_parity; d.dbits[0] = param->d_dbits; d.sbits[0] = param->d_sbits; d.duplex[0] = *param->d_duplex; d.script[0] = null_ptr; /* create an empty queue */ for (i=0; i<NUM_QUEUE; i++) { d.q_ld[i] = '\0'; d.q_num[i] = -1; } /* the start up d_cur is 0 */ d.d_cur = 0; return(&d); } /* * Update a dialing directory entry. Update only the one entry asked for, * not the entire image in memory. If the new entry is beyond the end of * the physical file, then fill in the holes, and update "dir->d_entries". * A non-zero return code means a non-fatal error. */ int up_dir(entry) int entry; { FILE *fp_in, *fp_out, *my_fopen(); int i; char *temp[NUM_DIR+1], buf[200], *str_dup(), *str_rep(); void error_win(), free_ptr(); /* open for read */ if (!(fp_in = my_fopen(dir->d_path, "r"))) { sprintf(buf, "\"%s\" for read", dir->d_path); error_win(1, "Can't open dialing directory file", buf); } /* read in a temporary version */ i = 0; while (fgets(buf, 200, fp_in) != NULL) temp[++i] = str_dup(buf); fclose(fp_in); /* alter only 1 entry */ sprintf(buf, "DIR_%d=%s;%s;%d-%c-%d-%d;%c;%s\n", entry, dir->name[entry], dir->number[entry], dir->baud[entry], dir->parity[entry], dir->dbits[entry], dir->sbits[entry], dir->duplex[entry], dir->script[entry]); if (entry <= dir->d_entries) temp[entry] = str_rep(temp[entry], buf); else temp[entry] = str_dup(buf); /* fill in holes if beyond end */ if (entry > dir->d_entries+1) { for (i=dir->d_entries+1; i<entry; i++) { sprintf(buf, "DIR_%d=;;%d-%c-%d-%d;%c;\n", i, param->d_baud, param->d_parity, param->d_dbits, param->d_sbits, *param->d_duplex); temp[i] = str_dup(buf); } } /* update "dir->d_entries" */ if (entry > dir->d_entries) dir->d_entries = entry; /* open for write */ if (!(fp_out = my_fopen(dir->d_path, "w"))) { for (i=1; i<=dir->d_entries; i++) free_ptr(temp[i]); sprintf(buf, "\"%s\"", dir->d_path); error_win(0, "No write permission on dialing directory file", buf); return(1); } /* put it back */ for (i=1; i<=dir->d_entries; i++) { fputs(temp[i], fp_out); free_ptr(temp[i]); } fclose(fp_out); return(0); } /* * Delete a range of dialing directory entries. Actually, just copies * default (empty) entries in place of deleted entries. However, it will * shrink the file if deletions occur at the physical EOF. A non-zero * return code means a non-fatal error. */ int del_dir(first, last) int first, last; { FILE *fp_in, *fp_out, *my_fopen(); int i; char *temp[NUM_DIR+1], buf[200], *str_dup(), *str_rep(); void error_win(), free_ptr(); /* sanity checking */ if (first > dir->d_entries) return(0); if (last > dir->d_entries) last = dir->d_entries; /* open for read */ if (!(fp_in = my_fopen(dir->d_path, "r"))) { sprintf(buf, "\"%s\" for read", dir->d_path); error_win(1, "Can't open dialing directory file", buf); } /* read in a temporary version */ i = 0; while (fgets(buf, 200, fp_in) != NULL) temp[++i] = str_dup(buf); fclose(fp_in); /* delete the range of values */ for (i=first; i<=last; i++) { sprintf(buf, "DIR_%d=;;%d-%c-%d-%d;%c;\n", i, param->d_baud, param->d_parity, param->d_dbits, param->d_sbits, *param->d_duplex); temp[i] = str_rep(temp[i], buf); } /* shrink the file? */ if (last >= dir->d_entries) { for (i=first; i<=last; i++) free_ptr(temp[i]); dir->d_entries = first-1; } /* open for write */ if (!(fp_out = my_fopen(dir->d_path, "w"))) { for (i=1; i<=dir->d_entries; i++) free_ptr(temp[i]); sprintf(buf, "\"%s\"", dir->d_path); error_win(0, "No write permission on dialing directory file", buf); return(1); } /* put it all back */ for (i=1; i<=dir->d_entries; i++) { fputs(temp[i], fp_out); free_ptr(temp[i]); } fclose(fp_out); return(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.