|
|
1.1 root 1: /* nopen.c */
2:
3: /* Network open functions (nopen and fnopen) */
4:
5: /* $Id: nopen.c,v 1.15 2004/12/24 07:53:52 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 2004 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: else if(access==O_RDONLY) share=SH_DENYWR;
54: else share=SH_DENYRW;
55: if(!(access&O_TEXT))
56: access|=O_BINARY;
57: while(((file=sopen(str,access,share,S_IREAD|S_IWRITE))==-1)
58: && (errno==EACCES || errno==EAGAIN || errno==EDEADLOCK) && count++<LOOP_NOPEN)
59: if(count)
60: mswait(100);
61: return(file);
62: }
63: /****************************************************************************/
64: /* This function performs an nopen, but returns a file stream with a buffer */
65: /* allocated. */
66: /****************************************************************************/
67: FILE* fnopen(int* fd, const char* str, int access)
68: {
69: char mode[128];
70: int file;
71: FILE * stream;
72:
73: if((file=nopen(str,access))==-1)
74: return(NULL);
75:
76: if(fd!=NULL)
77: *fd=file;
78:
79: if(access&O_APPEND) {
80: if((access&O_RDWR)==O_RDWR)
81: strcpy(mode,"a+");
82: else
83: strcpy(mode,"a");
84: } else if(access&(O_TRUNC|O_WRONLY)) {
85: if((access&O_RDWR)==O_RDWR)
86: strcpy(mode,"w+");
87: else
88: strcpy(mode,"w");
89: } else {
90: if((access&O_RDWR)==O_RDWR)
91: strcpy(mode,"r+");
92: else
93: strcpy(mode,"r");
94: }
95: stream=fdopen(file,mode);
96: if(stream==NULL) {
97: close(file);
98: return(NULL);
99: }
100: setvbuf(stream,NULL,_IOFBF,FNOPEN_BUF_SIZE);
101: return(stream);
102: }
103:
104: BOOL ftouch(const char* fname)
105: {
106: int file;
107:
108: if((file=nopen(fname,O_WRONLY|O_CREAT))<0)
109: return(FALSE);
110: close(file);
111:
112: return(TRUE);
113: }
114:
115: BOOL fmutex(const char* fname, const char* text)
116: {
117: int file;
118: #if !defined(NO_SOCKET_SUPPORT)
119: char hostname[128];
120: if(text==NULL && gethostname(hostname,sizeof(hostname))==0)
121: text=hostname;
122: #endif
123:
124: if((file=open(fname,O_CREAT|O_WRONLY|O_EXCL,S_IREAD|S_IWRITE))<0)
125: return(FALSE);
126: if(text!=NULL)
127: write(file,text,strlen(text));
128: close(file);
129: return(TRUE);
130: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.