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/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
;
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
;
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
);
64 perror("Failed to setup shared variable area ");
70 /*****************************************************
71 lock the shared variable area
72 *******************************************************/
73 static void lockit(void)
76 char *p
= getenv("SMBW_HANDLE");
78 DEBUG(0,("ERROR: can't get smbw shared handle\n"));
84 fcntl_lock(shared_fd
,SMB_F_SETLKW
,0,1,F_WRLCK
)==False
) {
85 DEBUG(0,("ERROR: can't get smbw shared lock\n"));
91 /*****************************************************
92 unlock the shared variable area
93 *******************************************************/
94 static void unlockit(void)
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
)
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
) {
129 while (i
< shared_size
) {
133 l1
= SVAL(&variables
[i
], 0);
134 l2
= SVAL(&variables
[i
], 2);
137 v
= &variables
[i
+4+l1
];
140 if (strcmp(name
,n
)) {
149 DEBUG(0,("smbw: shared variables corrupt (%s)\n", strerror(errno
)));
156 /*****************************************************
157 set a variable in the shared area
158 *******************************************************/
159 void smbw_setshared(const char *name
, const char *val
)
163 /* we don't allow variable overwrite */
164 if (smbw_getshared(name
)) return;
171 variables
= (char *)Realloc(variables
, shared_size
+ l1
+l2
+4);
174 DEBUG(0,("out of memory in smbw_setshared\n"));
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
)));
196 /*****************************************************************
197 set an env variable - some systems don't have this
198 *****************************************************************/
199 int smbw_setenv(const char *name
, const char *value
)
205 slprintf(s
,sizeof(s
)-1,"%s=%s", name
, value
);
209 if (p
) ret
= putenv(p
);
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
);