2 Unix SMB/Netbios implementation.
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.
24 extern int DEBUGLEVEL;
27 static char *variables;
28 static int shared_size;
30 /*****************************************************
32 *******************************************************/
33 void smbw_setup_shared(void)
38 slprintf(s,sizeof(s)-1, "%s/msg.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;
46 shared_fd = set_maxfiles(SMBW_MAX_OPEN);
48 while (shared_fd && dup2(fd, shared_fd) != shared_fd) shared_fd--;
50 if (shared_fd == 0) goto failed;
54 DEBUG(4,("created shared_fd=%d\n", shared_fd));
56 slprintf(s,sizeof(s)-1,"%d", shared_fd);
58 setenv("SMBW_HANDLE", s, 1);
63 perror("Failed to setup shared variable area ");
68 /*****************************************************
69 lock the shared variable area
70 *******************************************************/
71 static void lockit(void)
74 char *p = getenv("SMBW_HANDLE");
76 DEBUG(0,("ERROR: can't get smbw shared handle\n"));
81 if (fcntl_lock(shared_fd,SMB_F_SETLKW,0,1,F_WRLCK)==False) {
82 DEBUG(0,("ERROR: can't get smbw shared lock\n"));
87 /*****************************************************
88 unlock the shared variable area
89 *******************************************************/
90 static void unlockit(void)
92 fcntl_lock(shared_fd,SMB_F_SETLK,0,1,F_UNLCK);
96 /*****************************************************
97 get a variable from the shared area
98 *******************************************************/
99 char *smbw_getshared(const char *name)
106 /* maybe the area has changed */
107 if (fstat(shared_fd, &st)) goto failed;
109 if (st.st_size != shared_size) {
110 variables = (char *)Realloc(variables, st.st_size);
111 if (!variables) goto failed;
112 shared_size = st.st_size;
113 lseek(shared_fd, 0, SEEK_SET);
114 if (read(shared_fd, variables, shared_size) != shared_size) {
122 while (i < shared_size) {
131 if (strcmp(name,n)) {
140 DEBUG(0,("smbw: shared variables corrupt (%s)\n", strerror(errno)));
146 /*****************************************************
147 set a variable in the shared area
148 *******************************************************/
149 void smbw_setshared(const char *name, const char *val)
153 /* we don't allow variable overwrite */
154 if (smbw_getshared(name)) return;
158 len = strlen(name) + strlen(val) + 2;
160 variables = (char *)Realloc(variables, shared_size + len);
163 DEBUG(0,("out of memory in smbw_setshared\n"));
167 pstrcpy(&variables[shared_size], name);
168 shared_size += strlen(name)+1;
169 pstrcpy(&variables[shared_size], val);
170 shared_size += strlen(val)+1;
172 lseek(shared_fd, 0, SEEK_SET);
173 if (write(shared_fd, variables, shared_size) != shared_size) {
174 DEBUG(0,("smbw_setshared failed (%s)\n", strerror(errno)));