Annotation of sbbs/sbbs2/uti/uti.c, revision 1.1

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);
        !           222: sprintf(str,"%02u/%02u/%02u %02u:%02u:%02u    Exiting (%d)\r\n\r\n"
        !           223:        ,date.da_mon,date.da_day,date.da_year-1900
        !           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 \""
        !           285:        ,tm->tm_mon+1,tm->tm_mday,tm->tm_year
        !           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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.