2 * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 #include "arla_local.h"
38 static long blocksize
= 1024; /* XXX */
41 flushbuf (void *vargs
)
43 struct write_dirent_args
*args
= (struct write_dirent_args
*)vargs
;
44 struct dirent
*last
= (struct dirent
*)args
->last
;
45 unsigned inc
= blocksize
- (args
->ptr
- args
->buf
);
47 last
->d_reclen
+= inc
;
49 if (write (args
->fd
, args
->buf
, blocksize
) != blocksize
)
50 arla_warn (ADEBWARN
, errno
, "write");
51 args
->ptr
= args
->buf
;
53 memset(args
->buf
, 0, blocksize
);
57 write_dirent(VenusFid
*fid
, const char *name
, void *arg
)
59 struct dirent dirent
, *real
;
60 struct write_dirent_args
*args
= (struct write_dirent_args
*)arg
;
62 dirent
.d_namlen
= strlen (name
);
63 dirent
.d_reclen
= DIRSIZ(&dirent
);
65 if (args
->ptr
+ dirent
.d_reclen
> args
->buf
+ blocksize
)
67 real
= (struct dirent
*)args
->ptr
;
69 real
->d_namlen
= dirent
.d_namlen
;
70 real
->d_reclen
= dirent
.d_reclen
;
71 real
->d_fileno
= dentry2ino (name
, fid
, args
->e
);
72 strcpy (real
->d_name
, name
);
73 args
->ptr
+= real
->d_reclen
;
74 args
->off
+= real
->d_reclen
;
75 real
->d_off
= args
->off
;
81 conv_dir(FCacheEntry
*e
, CredCacheEntry
*ce
, u_int tokens
)
83 return conv_dir_sub(e
, ce
, tokens
, write_dirent
, flushbuf
, blocksize
);
87 * remove `filename` from the converted directory for `e'
91 dir_remove_name(FCacheEntry
*e
, const char *filename
)
101 struct dirent
*last_dp
;
103 fcache_extra_file_name (e
, cache_name
, cache_name_sz
);
104 fd
= open (cache_name
, O_RDWR
, 0);
107 fcache_fhget (cache_name
, cache_handle
);
108 if (fstat (fd
, &sb
) < 0) {
115 ret
= fbuf_create (&fb
, fd
, len
, FBUF_READ
|FBUF_WRITE
);
122 for (p
= buf
= fbuf_buf (&fb
); p
< buf
+ len
; p
+= dp
->d_reclen
) {
123 dp
= (struct dirent
*)p
;
125 if (strcmp (filename
, dp
->d_name
) == 0) {
126 if (last_dp
!= NULL
) {
127 struct dirent new_last
;
129 new_last
.d_reclen
= last_dp
->d_reclen
+ dp
->d_reclen
;
130 if (new_last
.d_reclen
>= last_dp
->d_reclen
)
131 last_dp
->d_reclen
= new_last
.d_reclen
;