|
|
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.