]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/DiskIO/DiskDaemon/diskd.cc
2 * $Id: diskd.cc,v 1.8 2007/08/16 23:32:28 hno Exp $
4 * DEBUG: section -- External DISKD process implementation.
5 * AUTHOR: Harvest Derived
7 * SQUID Web Proxy Cache http://www.squid-cache.org/
8 * ----------------------------------------------------------
10 * Squid is the result of efforts by numerous individuals from
11 * the Internet community; see the CONTRIBUTORS file for full
12 * details. Many organizations have provided support for Squid's
13 * development; see the SPONSORS file for full details. Squid is
14 * Copyrighted (C) 2001 by the Regents of the University of
15 * California; see the COPYRIGHT file for full details. Squid
16 * incorporates software developed and/or copyrighted by other
17 * sources; see the CREDITS file for full details.
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation; either version 2 of the License, or
22 * (at your option) any later version.
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with this program; if not, write to the Free Software
31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
42 #include "DiskIO/DiskDaemon/diomsg.h"
45 xassert(const char *msg
, const char *file
, int line
)
47 fprintf(stderr
,"assertion failed: %s:%d: \"%s\"\n", file
, line
, msg
);
52 const int diomsg::msg_snd_rcv_sz
= sizeof(diomsg
) - sizeof(mtyp_t
);
53 #define DEBUG(LEVEL) if ((LEVEL) <= DebugLevel)
55 typedef struct _file_state file_state
;
66 static hash_table
*hash
= NULL
;
69 static int DebugLevel
= 0;
72 do_open(diomsg
* r
, int len
, const char *buf
)
77 * note r->offset holds open() flags
79 fd
= open(buf
, r
->offset
, 0600);
83 fprintf(stderr
, "%d %s: ", (int) mypid
, buf
);
90 fs
= (file_state
*)xcalloc(1, sizeof(*fs
));
92 fs
->key
= &fs
->id
; /* gack */
94 hash_join(hash
, (hash_link
*) fs
);
96 fprintf(stderr
, "%d OPEN id %d, FD %d, fs %p\n",
105 do_close(diomsg
* r
, int len
)
109 fs
= (file_state
*) hash_lookup(hash
, &r
->id
);
114 fprintf(stderr
, "%d CLOSE id %d: ", (int) mypid
, r
->id
);
122 hash_remove_link(hash
, (hash_link
*) fs
);
124 fprintf(stderr
, "%d CLOSE id %d, FD %d, fs %p\n",
134 do_read(diomsg
* r
, int len
, char *buf
)
137 int readlen
= r
->size
;
139 fs
= (file_state
*) hash_lookup(hash
, &r
->id
);
144 fprintf(stderr
, "%d READ id %d: ", (int) mypid
, r
->id
);
151 if (r
->offset
> -1 && r
->offset
!= fs
->offset
) {
153 fprintf(stderr
, "seeking to %"PRId64
"\n", (int64_t)r
->offset
);
155 if (lseek(fs
->fd
, r
->offset
, SEEK_SET
) < 0) {
157 fprintf(stderr
, "%d FD %d, offset %"PRId64
": ", (int) mypid
, fs
->fd
, (int64_t)r
->offset
);
163 x
= read(fs
->fd
, buf
, readlen
);
165 fprintf(stderr
, "%d READ %d,%d,%"PRId64
" ret %d\n", (int) mypid
,
166 fs
->fd
, readlen
, (int64_t)r
->offset
, x
);
170 fprintf(stderr
, "%d FD %d: ", (int) mypid
, fs
->fd
);
177 fs
->offset
= r
->offset
+ x
;
182 do_write(diomsg
* r
, int len
, const char *buf
)
184 int wrtlen
= r
->size
;
187 fs
= (file_state
*) hash_lookup(hash
, &r
->id
);
192 fprintf(stderr
, "%d WRITE id %d: ", (int) mypid
, r
->id
);
199 if (r
->offset
> -1 && r
->offset
!= fs
->offset
) {
200 if (lseek(fs
->fd
, r
->offset
, SEEK_SET
) < 0) {
202 fprintf(stderr
, "%d FD %d, offset %"PRId64
": ", (int) mypid
, fs
->fd
, (int64_t)r
->offset
);
209 fprintf(stderr
, "%d WRITE %d,%d,%"PRId64
"\n", (int) mypid
,
210 fs
->fd
, wrtlen
, (int64_t)r
->offset
);
211 x
= write(fs
->fd
, buf
, wrtlen
);
215 fprintf(stderr
, "%d FD %d: ", (int) mypid
, fs
->fd
);
222 fs
->offset
= r
->offset
+ x
;
227 do_unlink(diomsg
* r
, int len
, const char *buf
)
229 if (unlink(buf
) < 0) {
231 fprintf(stderr
, "%d UNLNK id %d %s: ", (int) mypid
, r
->id
, buf
);
239 fprintf(stderr
, "%d UNLNK %s\n", (int) mypid
, buf
);
244 msg_handle(diomsg
* r
, int rl
, diomsg
* s
)
249 s
->seq_no
= r
->seq_no
; /* optional, debugging */
250 s
->callback_data
= r
->callback_data
;
251 s
->requestor
= r
->requestor
;
252 s
->size
= 0; /* optional, debugging */
253 s
->offset
= 0; /* optional, debugging */
254 s
->shm_offset
= r
->shm_offset
;
255 s
->newstyle
= r
->newstyle
;
257 if (s
->shm_offset
> -1)
258 buf
= shmbuf
+ s
->shm_offset
;
265 s
->status
= do_open(r
, rl
, buf
);
269 s
->status
= do_close(r
, rl
);
273 s
->status
= do_read(r
, rl
, buf
);
277 s
->status
= do_write(r
, rl
, buf
);
281 s
->status
= do_unlink(r
, rl
, buf
);
291 fsCmp(const void *a
, const void *b
)
293 const int *A
= (const int *)a
;
294 const int *B
= (const int *)b
;
299 fsHash(const void *key
, unsigned int n
)
301 /* note, n must be a power of 2! */
302 const int *k
= (const int *)key
;
307 alarm_handler(int sig
)
313 main(int argc
, char *argv
[])
325 setbuf(stdout
, NULL
);
326 setbuf(stderr
, NULL
);
330 rmsgid
= msgget(key
, 0600);
338 smsgid
= msgget(key
, 0600);
346 shmid
= shmget(key
, 0, 0600);
353 shmbuf
= (char *)shmat(shmid
, NULL
, 0);
355 if (shmbuf
== (void *) -1) {
360 hash
= hash_create(fsCmp
, 1 << 4, fsHash
);
362 fcntl(0, F_SETFL
, SQUID_NONBLOCK
);
363 memset(&sa
, '\0', sizeof(sa
));
364 sa
.sa_handler
= alarm_handler
;
365 sa
.sa_flags
= SA_RESTART
;
366 sigaction(SIGALRM
, &sa
, NULL
);
370 memset(&rmsg
, '\0', sizeof(rmsg
));
372 std::cerr
<< "msgrcv: " << rmsgid
<< ", "
373 << &rmsg
<< ", " << diomsg::msg_snd_rcv_sz
374 << ", " << 0 << ", " << 0 << std::endl
;
375 rlen
= msgrcv(rmsgid
, &rmsg
, diomsg::msg_snd_rcv_sz
, 0, 0);
378 if (EINTR
== errno
) {
379 if (read(0, rbuf
, 512) <= 0) {
380 if (EWOULDBLOCK
== errno
)
382 else if (EAGAIN
== errno
)
389 if (EAGAIN
== errno
) {
398 msg_handle(&rmsg
, rlen
, &smsg
);
400 if (msgsnd(smsgid
, &smsg
, diomsg::msg_snd_rcv_sz
, 0) < 0) {
407 fprintf(stderr
, "%d diskd exiting\n", (int) mypid
);
409 if (msgctl(rmsgid
, IPC_RMID
, 0) < 0)
410 perror("msgctl IPC_RMID");
412 if (msgctl(smsgid
, IPC_RMID
, 0) < 0)
413 perror("msgctl IPC_RMID");
415 if (shmdt(shmbuf
) < 0)
418 if (shmctl(shmid
, IPC_RMID
, 0) < 0)
419 perror("shmctl IPC_RMID");