|
|
1.1 ! root 1: /* nopen.c */ ! 2: ! 3: /* Network open functions (nopen and fnopen) */ ! 4: ! 5: /* $Id: nopen.c,v 1.19 2006/01/13 08:48:25 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include "sbbs.h" ! 39: #include "crc32.h" ! 40: ! 41: /****************************************************************************/ ! 42: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ ! 43: /* number of times if the attempted file is already open or denying access */ ! 44: /* for some other reason. All files are opened in BINARY mode. */ ! 45: /****************************************************************************/ ! 46: int nopen(const char* str, int access) ! 47: { ! 48: int file,share,count=0; ! 49: ! 50: if(access&O_DENYNONE) { ! 51: share=SH_DENYNO; ! 52: access&=~O_DENYNONE; ! 53: } ! 54: else if((access&~(O_TEXT|O_BINARY))==O_RDONLY) ! 55: share=SH_DENYWR; ! 56: else ! 57: share=SH_DENYRW; ! 58: ! 59: #if !defined(__unix__) /* Basically, a no-op on Unix anyway */ ! 60: if(!(access&O_TEXT)) ! 61: access|=O_BINARY; ! 62: #endif ! 63: while(((file=sopen(str,access,share,S_IREAD|S_IWRITE))==-1) ! 64: && (errno==EACCES || errno==EAGAIN || errno==EDEADLOCK) && count++<LOOP_NOPEN) ! 65: if(count) ! 66: mswait(100); ! 67: return(file); ! 68: } ! 69: /****************************************************************************/ ! 70: /* This function performs an nopen, but returns a file stream with a buffer */ ! 71: /* allocated. */ ! 72: /****************************************************************************/ ! 73: FILE* fnopen(int* fd, const char* str, int access) ! 74: { ! 75: char mode[128]; ! 76: int file; ! 77: FILE * stream; ! 78: ! 79: if((file=nopen(str,access))==-1) ! 80: return(NULL); ! 81: ! 82: if(fd!=NULL) ! 83: *fd=file; ! 84: ! 85: if(access&O_APPEND) { ! 86: if((access&O_RDWR)==O_RDWR) ! 87: strcpy(mode,"a+"); ! 88: else ! 89: strcpy(mode,"a"); ! 90: } else if(access&(O_TRUNC|O_WRONLY)) { ! 91: if((access&O_RDWR)==O_RDWR) ! 92: strcpy(mode,"w+"); ! 93: else ! 94: strcpy(mode,"w"); ! 95: } else { ! 96: if((access&O_RDWR)==O_RDWR) ! 97: strcpy(mode,"r+"); ! 98: else ! 99: strcpy(mode,"r"); ! 100: } ! 101: stream=fdopen(file,mode); ! 102: if(stream==NULL) { ! 103: close(file); ! 104: return(NULL); ! 105: } ! 106: setvbuf(stream,NULL,_IOFBF,FNOPEN_BUF_SIZE); ! 107: return(stream); ! 108: } ! 109: ! 110: BOOL ftouch(const char* fname) ! 111: { ! 112: int file; ! 113: ! 114: if((file=nopen(fname,O_WRONLY|O_CREAT))<0) ! 115: return(FALSE); ! 116: close(file); ! 117: ! 118: return(TRUE); ! 119: } ! 120: ! 121: BOOL fmutex(const char* fname, const char* text, long max_age) ! 122: { ! 123: int file; ! 124: long t; ! 125: #if !defined(NO_SOCKET_SUPPORT) ! 126: char hostname[128]; ! 127: if(text==NULL && gethostname(hostname,sizeof(hostname))==0) ! 128: text=hostname; ! 129: #endif ! 130: ! 131: if(max_age && (t=fdate(fname)) >= 0 && (time(NULL)-t) > max_age) { ! 132: if(remove(fname)!=0) ! 133: return(FALSE); ! 134: } ! 135: if((file=open(fname,O_CREAT|O_WRONLY|O_EXCL,S_IREAD|S_IWRITE))<0) ! 136: return(FALSE); ! 137: if(text!=NULL) ! 138: write(file,text,strlen(text)); ! 139: close(file); ! 140: return(TRUE); ! 141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.