This commit was manufactured by cvs2svn to create tag
[Samba/gbeck.git] / source / smbwrapper / shared.c
blob2ee019b2dcb356a18decdb5476fc3fd98018e63b
1 /*
2 Unix SMB/Netbios implementation.
3 Version 2.0
4 SMB wrapper functions - shared variables
5 Copyright (C) Andrew Tridgell 1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "includes.h"
24 extern int DEBUGLEVEL;
26 static int shared_fd;
27 static char *variables;
28 static int shared_size;
30 /*****************************************************
31 setup the shared area
32 *******************************************************/
33 void smbw_setup_shared(void)
35 int fd;
36 pstring s, name;
38 slprintf(s,sizeof(s)-1, "%s/smbw.XXXXXX",tmpdir());
40 fstrcpy(name,(char *)mktemp(s));
42 /* note zero permissions! don't change this */
43 fd = open(name,O_RDWR|O_CREAT|O_TRUNC|O_EXCL,0);
44 if (fd == -1) goto failed;
45 unlink(name);
47 shared_fd = set_maxfiles(SMBW_MAX_OPEN);
49 while (shared_fd && dup2(fd, shared_fd) != shared_fd) shared_fd--;
51 if (shared_fd == 0) goto failed;
53 close(fd);
55 DEBUG(4,("created shared_fd=%d\n", shared_fd));
57 slprintf(s,sizeof(s)-1,"%d", shared_fd);
59 smbw_setenv("SMBW_HANDLE", s);
61 return;
63 failed:
64 perror("Failed to setup shared variable area ");
65 exit(1);
68 static int locked;
70 /*****************************************************
71 lock the shared variable area
72 *******************************************************/
73 static void lockit(void)
75 if (shared_fd == 0) {
76 char *p = getenv("SMBW_HANDLE");
77 if (!p) {
78 DEBUG(0,("ERROR: can't get smbw shared handle\n"));
79 exit(1);
81 shared_fd = atoi(p);
83 if (locked==0 &&
84 fcntl_lock(shared_fd,SMB_F_SETLKW,0,1,F_WRLCK)==False) {
85 DEBUG(0,("ERROR: can't get smbw shared lock\n"));
86 exit(1);
88 locked++;
91 /*****************************************************
92 unlock the shared variable area
93 *******************************************************/
94 static void unlockit(void)
96 locked--;
97 if (locked == 0) {
98 fcntl_lock(shared_fd,SMB_F_SETLK,0,1,F_UNLCK);
103 /*****************************************************
104 get a variable from the shared area
105 *******************************************************/
106 char *smbw_getshared(const char *name)
108 int i;
109 struct stat st;
111 lockit();
113 /* maybe the area has changed */
114 if (fstat(shared_fd, &st)) goto failed;
116 if (st.st_size != shared_size) {
117 variables = (char *)Realloc(variables, st.st_size);
118 if (!variables) goto failed;
119 shared_size = st.st_size;
120 lseek(shared_fd, 0, SEEK_SET);
121 if (read(shared_fd, variables, shared_size) != shared_size) {
122 goto failed;
126 unlockit();
128 i=0;
129 while (i < shared_size) {
130 char *n, *v;
131 int l1, l2;
133 l1 = SVAL(&variables[i], 0);
134 l2 = SVAL(&variables[i], 2);
136 n = &variables[i+4];
137 v = &variables[i+4+l1];
138 i += 4+l1+l2;
140 if (strcmp(name,n)) {
141 continue;
143 return v;
146 return NULL;
148 failed:
149 DEBUG(0,("smbw: shared variables corrupt (%s)\n", strerror(errno)));
150 exit(1);
151 return NULL;
156 /*****************************************************
157 set a variable in the shared area
158 *******************************************************/
159 void smbw_setshared(const char *name, const char *val)
161 int l1, l2;
163 /* we don't allow variable overwrite */
164 if (smbw_getshared(name)) return;
166 lockit();
168 l1 = strlen(name)+1;
169 l2 = strlen(val)+1;
171 variables = (char *)Realloc(variables, shared_size + l1+l2+4);
173 if (!variables) {
174 DEBUG(0,("out of memory in smbw_setshared\n"));
175 exit(1);
178 SSVAL(&variables[shared_size], 0, l1);
179 SSVAL(&variables[shared_size], 2, l2);
181 pstrcpy(&variables[shared_size] + 4, name);
182 pstrcpy(&variables[shared_size] + 4 + l1, val);
184 shared_size += l1+l2+4;
186 lseek(shared_fd, 0, SEEK_SET);
187 if (write(shared_fd, variables, shared_size) != shared_size) {
188 DEBUG(0,("smbw_setshared failed (%s)\n", strerror(errno)));
189 exit(1);
192 unlockit();
196 /*****************************************************************
197 set an env variable - some systems don't have this
198 *****************************************************************/
199 int smbw_setenv(const char *name, const char *value)
201 pstring s;
202 char *p;
203 int ret = -1;
205 slprintf(s,sizeof(s)-1,"%s=%s", name, value);
207 p = strdup(s);
209 if (p) ret = putenv(p);
211 return ret;
214 /*****************************************************************
215 return true if the passed fd is the SMBW_HANDLE
216 *****************************************************************/
217 int smbw_shared_fd(int fd)
219 return (shared_fd && shared_fd == fd);