|
|
1.1 root 1: #line 1 "UTI.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /* Shared routines for most of the UTI driver programs */
6:
7: #include "sbbs.h"
8: #include "uti.h"
9:
10: #define bputs lputs
11: #define bprintf lprintf
12:
13: int logfile;
14: char scrnbuf[4000],tmp[256];
15: struct text_info txtinfo;
16:
17: /****************************************************************************/
18: /* Performs printf() through local assembly routines */
19: /* Called from everywhere */
20: /****************************************************************************/
21: int lprintf(char *fmat, ...) {
22: char sbuf[256];
23: int chcount;
24:
25: chcount=vsprintf(sbuf,fmat,_va_ptr);
26: lputs(sbuf);
27: return(chcount);
28: }
29:
30: long lputs(char far *str)
31: {
32: char tmp[256];
33: int i,j,k;
34:
35: j=strlen(str);
36: for(i=k=0;i<j;i++) /* remove CRs */
37: if(str[i]==CR && str[i+1]==LF)
38: continue;
39: else
40: tmp[k++]=str[i];
41: tmp[k]=0;
42: return(fputs(tmp,stdout));
43: }
44:
45: /****************************************************************************/
46: /* Truncates white-space chars off end of 'str' and terminates at first tab */
47: /****************************************************************************/
48: void truncsp(char *str)
49: {
50: char c;
51:
52: str[strcspn(str,"\t")]=0;
53: c=strlen(str);
54: while(c && str[c-1]<=SP) c--;
55: str[c]=0;
56: }
57:
58: /****************************************************************************/
59: /* Puts a backslash on path strings */
60: /****************************************************************************/
61: void backslash(char *str)
62: {
63: int i;
64:
65: i=strlen(str);
66: if(i && str[i-1]!='\\') {
67: str[i]='\\'; str[i+1]=0; }
68: }
69:
70:
71: /****************************************************************************/
72: /* Converts an ASCII Hex string into an ulong */
73: /****************************************************************************/
74: ulong ahtoul(char *str)
75: {
76: ulong l,val=0;
77:
78: while((l=(*str++)|0x20)!=0x20)
79: val=(l&0xf)+(l>>6&1)*9+val*16;
80: return(val);
81: }
82:
83: /****************************************************************************/
84: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */
85: /* number of times if the attempted file is already open or denying access */
86: /* for some other reason. All files are opened in BINARY mode. */
87: /****************************************************************************/
88: int nopen(char *str, int access)
89: {
90: char logstr[256];
91: int file,share,count=0;
92:
93: if(access==O_RDONLY) share=O_DENYWRITE;
94: else share=O_DENYALL;
95: while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1)
96: && errno==EACCES && count++<LOOP_NOPEN);
97: if(count>(LOOP_NOPEN/2))
98: lprintf("NOPEN COLLISION - File: %s Count: %d"
99: ,str,count);
100: if(file==-1 && errno==EACCES)
101: lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7");
102: return(file);
103: }
104:
105: /****************************************************************************/
106: /* This function performs an nopen, but returns a file stream with a buffer */
107: /* allocated. */
108: /****************************************************************************/
109: FILE *fnopen(int *file, char *str, int access)
110: {
111: char mode[128];
112: FILE *stream;
113:
114: if(((*file)=nopen(str,access))==-1)
115: return(NULL);
116:
117: if(access&O_APPEND) {
118: if(access&O_RDONLY)
119: strcpy(mode,"a+");
120: else
121: strcpy(mode,"a"); }
122: else {
123: if(access&O_WRONLY)
124: strcpy(mode,"r+");
125: else
126: strcpy(mode,"r"); }
127: stream=fdopen((*file),mode);
128: if(stream==NULL) {
129: close(*file);
130: return(NULL); }
131: setvbuf(stream,NULL,_IOFBF,16*1024);
132: return(stream);
133: }
134:
135:
136: /****************************************************************************/
137: /* Returns the length of the file in 'filespec' */
138: /****************************************************************************/
139: long flength(char *filespec)
140: {
141: struct ffblk f;
142:
143: if(findfirst(filespec,&f,0)==NULL)
144: return(f.ff_fsize);
145: return(-1L);
146: }
147:
148:
149: /****************************************************************************/
150: /* Error handling routine. Prints to local and remote screens the error */
151: /* information, function, action, object and access and then attempts to */
152: /* write the error information into the file ERROR.LOG and NODE.LOG */
153: /****************************************************************************/
154: void errormsg(int line, char *source, char action, char *object, ulong access)
155: {
156: char str[512];
157: char actstr[256];
158:
159: switch(action) {
160: case ERR_OPEN:
161: strcpy(actstr,"opening");
162: break;
163: case ERR_CLOSE:
164: strcpy(actstr,"closeing");
165: break;
166: case ERR_FDOPEN:
167: strcpy(actstr,"fdopen");
168: break;
169: case ERR_READ:
170: strcpy(actstr,"reading");
171: break;
172: case ERR_WRITE:
173: strcpy(actstr,"writing");
174: break;
175: case ERR_REMOVE:
176: strcpy(actstr,"removing");
177: break;
178: case ERR_ALLOC:
179: strcpy(actstr,"allocating memory");
180: break;
181: case ERR_CHK:
182: strcpy(actstr,"checking");
183: break;
184: case ERR_LEN:
185: strcpy(actstr,"checking length");
186: break;
187: case ERR_EXEC:
188: strcpy(actstr,"executing");
189: break;
190: default:
191: strcpy(actstr,"UNKNOWN"); }
192: lprintf("\7\r\nERROR - file: %s",source);
193: lprintf("\7\r\n line: %u",line);
194: lprintf("\7\r\n action: %s",actstr); /* tell user about error */
195: lprintf("\7\r\n object: %s",object);
196: lprintf("\7\r\n access: %lu (%lxh)",access,access);
197: lputs("\r\n\r\n<Hit any key>");
198: getch();
199: lputs("\r\n");
200: }
201:
202:
203: void allocfail(uint size)
204: {
205: lprintf("\7Error allocating %u bytes of memory.\r\n",size);
206: exit(1);
207: }
208:
209: void bail(int code)
210: {
211: char str[256];
212: time_t t;
213: struct time curtime;
214: struct date date;
215:
216: if(!code) {
217: puttext(1,1,80,25,scrnbuf); /* restore screen if no error */
218: textattr(txtinfo.attribute);
219: gotoxy(txtinfo.curx,txtinfo.cury); }
220: t=time(NULL);
221: unixtodos(t,&date,&curtime);
1.1.1.2 ! root 222: sprintf(str,"%02u/%02u/%u %02u:%02u:%02u Exiting (%d)\r\n\r\n"
! 223: ,date.da_mon,date.da_day,date.da_year
1.1 root 224: ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec
225: ,code);
226: write(logfile,str,strlen(str));
227: exit(code);
228: }
229:
230: int getsubnum(char *code)
231: {
232: int i;
233:
234: for(i=0;i<total_subs;i++) {
235: // printf("%s vs %s\n",code,sub[i]->code);
236: if(!stricmp(code,sub[i]->code))
237: return(i); }
238: return(-1);
239: }
240:
241: void uti_init(char *name, int argc, char **argv)
242: {
243: char str[256],*p;
244: int i;
245: read_cfg_text_t txt;
246: time_t t;
247: struct tm *tm;
248:
249: setvbuf(stdout,NULL,_IONBF,0);
250: putenv("TZ=UTC0");
251:
252: txt.openerr="\7\r\nError opening %s for read.\r\n";
253: txt.reading="\r\nReading %s...";
254: txt.readit="\rRead %s ";
255: txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n";
256: txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n";
257:
258: p=getenv("SBBSNODE");
259: if(p==NULL) {
260: printf("\7\nSBBSNODE environment variable not set.\n");
261: exit(1); }
262: strcpy(node_dir,p);
263:
264: strupr(node_dir);
265:
266: if(node_dir[strlen(node_dir)-1]!='\\')
267: strcat(node_dir,"\\");
268:
269: read_node_cfg(txt);
270: if(ctrl_dir[0]=='.') { /* Relative path */
271: strcpy(str,ctrl_dir);
272: sprintf(ctrl_dir,"%s%s",node_dir,str); }
273: read_main_cfg(txt);
274: if(data_dir[0]=='.') { /* Relative path */
275: strcpy(str,data_dir);
276: sprintf(data_dir,"%s%s",node_dir,str); }
277: read_msgs_cfg(txt);
278: sprintf(str,"%sUTI.LOG",data_dir);
279: if((logfile=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
280: printf("\7\nCan't open %s\n",str);
281: exit(-1); }
282: t=time(NULL);
283: tm=gmtime(&t);
284: sprintf(str,"%02u/%02u/%02u %02u:%02u:%02u %-8s %s \""
1.1.1.2 ! root 285: ,tm->tm_mon+1,tm->tm_mday,TM_YEAR(tm->tm_year)
1.1 root 286: ,tm->tm_hour,tm->tm_min,tm->tm_sec
287: ,name,VER);
288: printf("\n\n");
289: for(i=1;i<argc;i++) {
290: if(i>1)
291: strcat(str," ");
292: strcat(str,argv[i]);
293: printf("%s ",argv[i]); }
294: strcat(str,"\"");
295: write(logfile,str,strlen(str));
296: write(logfile,"\r\n",2);
297: printf("\n\nWorking...");
298: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.