1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
|
1999-09-13 Roland McGrath <roland@baalperazim.frob.com>
* fifo.c, null.c, new-fifo.c: Reverted changes related to
io_map_segment.
1999-09-07 Thomas Bushnell, BSG <tb@mit.edu>
* null.c (trivfs_S_io_map): Renamed to ...
(trivfs_S_io_map_segment): ... here, with new parameter `index'.
* new-fifo.c (trivfs_S_io_map): Renamed to ...
(trivfs_S_io_map_segment): ... here, with new parameter `index'.
* fifo.c (trivfs_S_io_map): Renamed to ...
(trivfs_S_io_map_segment): ... here, with new parameter `index'.
1999-08-31 Marcus Brinkmann <Marcus.Brinkmann@ruhr-uni-bochum.de>
* crash.c (trivfs_modify_stat): Remove redundant fstype setting.
* password.c (trivfs_modify_stat): Likewise.
* bogus-fifo.c (main): Deallocate bootstrap port after using it.
* fifo.c (main): Likewise.
* firmlink.c (main): Likewise.
* ifsock.c (main): Likewise.
* magic.c (main): Likewise.
* null.c (main): Likewise.
* symlink.c (main): Likewise.
1999-07-11 Roland McGrath <roland@baalperazim.frob.com>
* firmlink.c: Add #include <sys/mman.h>.
1999-07-09 Thomas Bushnell, BSG <tb@mit.edu>
* firmlink.c (trivfs_S_io_read): Use mmap instead of vm_allocate.
1999-07-10 Roland McGrath <roland@baalperazim.frob.com>
* crash.c: Add #include <sys/mman.h> for munmap decl.
1999-07-03 Thomas Bushnell, BSG <tb@mit.edu>
* crash.c (stop_pgrp): Use munmap instead of vm_deallocate.
1999-06-01 Roland McGrath <roland@baalperazim.frob.com>
* crash.c (options): Add --dump-core as alias for --core-file.
* crash.c: Support three modes of operation, selected by command line
switches:
-s/--suspend suspend crashing process (old behavior)
-k/--kill kill crashing process, no core dump
-c/--core-file dump core file
(enum crash_action): New type.
(crash_how): New variable.
(options, crash_argp, trivfs_runtime_argp): New variables.
(parse_opt, trivfs_append_args): New functions.
(main): Call argp_parse.
1999-05-19 Roland McGrath <roland@baalperazim.frob.com>
* null.c (trivfs_S_io_read): Fix return value.
Reported by Steinar Hamre <steinarh@fim.ntnu.no>.
1999-05-01 Roland McGrath <roland@baalperazim.frob.com>
* fwd.c (main): Add missing newline in usage msg.
From Marcus Brinkmann.
1999-02-20 Mark Kettenis <kettenis@gnu.org>
* password.c: New file.
* Makefile (targets): Add password.
(SRCS): Add password.c.
(OBJS): Add passwordServer.o.
(password-LDLIBS): New variable.
Use dependencies identical to those for crash.
1998-10-20 Roland McGrath <roland@baalperazim.frob.com>
* fifo.c (open_hook: WAIT): Add braces to silence gcc warning.
(trivfs_S_io_select): Likewise.
* new-fifo.c (fifo_trans_open): Likewise.
(trivfs_S_io_select): Likewise.
1998-07-20 Roland McGrath <roland@baalperazim.frob.com>
* firmlink.c (main): Fix return type to int, and use return.
* fwd.c (main): Likewise.
* new-fifo.c (main): Likewise.
* magic.c (main): Likewise.
* fifo.c (main): Likewise.
* null.c (main): Likewise.
1997-09-04 Miles Bader <miles@gnu.ai.mit.edu>
* null.c (main): Fix typo.
Wed Aug 20 14:07:56 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* crash.c (main): New args for
ports_manage_port_operations_multithread.
* fifo.c (main): Likewise.
* firmlink.c (main): Likewise.
* new-fifo.c (main): Likewise.
* null.c (main): Likewise.
1997-07-22 Miles Bader <miles@gnu.ai.mit.edu>
* devport.c: File removed.
* Makefile (targets): Remove devport.
(SRCS): Remove devport.c.
1997-07-15 Miles Bader <miles@gnu.ai.mit.edu>
* magic.c (main): Actually parse the arg.
1997-07-14 Miles Bader <miles@gnu.ai.mit.edu>
* magic.c (argp_program_version, args_doc, doc): New variables.
(main): Use argp to parse args.
Add new includes <argp.h> & <version.h>.
Fri Feb 28 20:00:14 1997 Miles Bader <miles@gnu.ai.mit.edu>
* Makefile (fwd null ifsock fifo new-fifo devport firmlink):
Add firmlink to targets depending on libthreads.
* null.c (main): Make multithreaded.
Tue Feb 25 15:42:40 1997 Miles Bader <miles@gnu.ai.mit.edu>
* firmlink.c (main): Make multithreaded.
Sun Feb 23 00:23:49 1997 Miles Bader <miles@gnu.ai.mit.edu>
* firmlink.c (argp): Use OPTIONS.
(getroot): If firmlink returns ENOENT, act like an unresolvable link.
Don't support visible mode.
(options, parse_opt): Remove -i.
Wed Feb 19 21:34:01 1997 Miles Bader <miles@gnu.ai.mit.edu>
* null.c (argp_program_version): Make const.
* fifo.c (argp_program_version, argp): New variables.
(parse_opt): New function.
(options): Use argp structures instead of getopt ones.
(main): Use argp instead of getopt.
<argp.h>: New include.
<getopt.h>: Include removed.
(trivfs_protid_port_class, trivfs_cntl_portclasses,
trivfs_protid_nportclasses, trivfs_cntl_nportclasses):
Variables removed.
(main): Don't use them.
Don't create our own port classes/bucket, let trivfs_startup do it.
Tue Feb 18 12:55:50 1997 Miles Bader <miles@gnu.ai.mit.edu>
* fifo.c <version.h>: New include.
(parse_opt): Use KEY, not OPT.
Fri Feb 14 03:05:59 1997 Miles Bader <miles@gnu.ai.mit.edu>
* null.c (control_class, node_class, port_bucket,
trivfs_protid_port_class, trivfs_cntl_portclasses,
trivfs_protid_nportclasses, trivfs_cntl_nportclasses):
Variables removed.
(main): Don't use them.
Thu Feb 13 19:42:38 1997 Miles Bader <miles@gnu.ai.mit.edu>
* firmlink.c: New file.
* Makefile (targets): Add firmlink.
(SRCS): Add firmlink.c.
(firmlink): New target.
Thu Sep 26 14:27:02 1996 Miles Bader <miles@gnu.ai.mit.edu>
* null.c (trivfs_S_file_check_access): Function removed (trivfs
default is now sufficient).
Tue Sep 24 15:39:36 1996 Miles Bader <miles@gnu.ai.mit.edu>
* null.c (provide_zeros): Variable removed.
(trivfs_S_io_read): Don't return zeros anymore.
(trivfs_S_io_readable): Always return 0.
(argp_program_version): New variable.
(main): Use argp for argument parsing.
(trivfs_S_file_check_access): New function.
Thu Sep 12 16:39:47 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* Makefile (HURDLIBS): New variable.
Fri Jul 12 23:02:36 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
* crash.c (stop_pgrp): Fetch pgrp using correct call.
Mon Jul 8 13:52:36 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
* crash.c (stop_pgrp): Don't do anything if ORPHANED.
Mon Jul 8 08:54:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* crash.c (stop_pgrp): Take second arg CTTYID. Fetch each pgrp
member's msgpor and send msg_sig_post with that as refport instead of
calling POSIX.1 kill function like a bonehead.
(S_crash_dump_task): Pass CTTY_ID arg through to stop_pgrp.
Sun Jul 7 22:43:23 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
* crash.c (stop_pgrp): New function.
(S_crash_dump_task): Call stop_pgrp.
* Makefile (fwd): Depend on libports.
Mon Jul 1 16:09:10 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
* Makefile (crash): New target.
* Makefile (SRCS): Added crash.c.
* crash.c: Moved here from ../exec.
(S_crash_dump_task): New args EXC, CODE, SUBCODE, CTTY_ID.
Supply SIGCODE arg to proc_mark_stop.
(signal_crasher): New arg SIGCODE, supply to proc_mark_exit. All
callers changed.
(S_msg_sig_post_untraced): Supply C->sigcode to proc_mark_stop.
(S_crash_dump_task): Drop arg TARGET.
(dump_core): Likewise; all callers changed.
(struct crasher): Delete member `target'.
(S_msg_describe_ports): New function.
Thu Jun 20 16:28:33 1996 Miles Bader <miles@gnu.ai.mit.edu>
* Makefile (null ifsock fifo new-fifo devport): Depend on
../libfshelp/libfshelp.a.
Wed May 29 10:31:16 1996 Miles Bader <miles@gnu.ai.mit.edu>
* devport.c (trivfs_S_file_get_storage_info): Implement new interface.
Sat May 11 01:19:21 1996 Miles Bader <miles@gnu.ai.mit.edu>
* new-fifo.c (fifo_trans_parse_args): Use ARGP_ERR_UNKNOWN instead
of EINVAL.
Tue Apr 30 09:58:47 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
* Makefile (all): Delete target.
(include ../Makeconf): *Before* all dependences.
($(targets)): Each program depends on its associated .o.
Mon Apr 15 12:50:37 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
* new-fifo.c (fifo_trans_parse_args): Supply missing arg to
argp_parse.
Sun Mar 31 13:26:48 1996 Miles Bader <miles@gnu.ai.mit.edu>
* Makefile (targets): Add devport.
(SRCS): Add devport.c.
Add devport as a target to various dependency rules.
Wed Feb 7 17:51:49 1996 Miles Bader <miles@gnu.ai.mit.edu>
* fifo.c (trivfs_S_file_set_size): Add #!$@&* reply port args.
* new-fifo.c (trivfs_S_file_set_size): Likewise.
Mon Jan 29 09:53:01 1996 Miles Bader <miles@gnu.ai.mit.edu>
* fifo.c (close_hook): Also disconnect ACTIVE_FIFO if the laster
writer is going away and there were no readers.
(open_hook): Unbreak a new read pipe even if not waiting for writers.
* new-fifo.c (fifo_trans_open): Typo.
Sun Jan 28 21:52:00 1996 Miles Bader <miles@gnu.ai.mit.edu>
* fifo.c (open_hook): Only bother to do anything if O_READ | O_WRITE.
* new-fifo.c (fifo_trans_open): Likewise.
When O_NONBLOCK is set, just don't block if possible, instead of
of returning EWOULDBLOCK.
(trivfs_S_io_select): The pipe is on CRED->po->hook, not CRED->hook.
(trivfs_modify_stat): Zero the returned size if there's no pipe.
Sat Jan 27 19:30:25 1996 Miles Bader <miles@gnu.ai.mit.edu>
* fifo.c (open_hook): When O_NONBLOCK is set, just don't block if
possible, instead of of returning EWOULDBLOCK.
Only set PO->hook if O_READ or O_WRITE is set.
(trivfs_S_io_select): The pipe is on CRED->po->hook, not CRED->hook.
(trivfs_modify_stat): Zero the returned size if there's no pipe.
Thu Jan 25 18:34:26 1996 Miles Bader <miles@gnu.ai.mit.edu>
* fifo.c (trivfs_goaway): Handle errors from ports_inhibit_bucket_rpcs.
* new-fifo.c (trivfs_goaway): Likewise.
Call ports_interrupt_rpcs instead of ports_interrupt_rpc.
Tue Jan 16 14:18:57 1996 Miles Bader <miles@gnu.ai.mit.edu>
* new-fifo.c (trivfs_S_io_select): Request interruption if the
reply-port dies.
Don't block if there's an error immediately available.
* fifo.c (trivfs_S_io_select): Ditto.
Mon Nov 6 12:39:32 1995 Miles Bader <miles@gnu.ai.mit.edu>
* magic.c (S_fsys_get_options): New function.
* symlink.c (S_fsys_get_options): New function.
Sun Nov 5 01:56:20 1995 Miles Bader <miles@gnu.ai.mit.edu>
* ifsock.c (main): Add flags argument to trivfs_startup call.
* null.c (main): Ditto.
* fifo.c (main): Ditto.
* new-fifo.c (fifo_trans_start): Ditto.
* symlink.c (main): Add flags argument to fsys_startup call.
(S_fsys_startup): Add FLAGS arg.
* magic.c (main): Add flags argument to fsys_startup call.
(S_fsys_startup): Add FLAGS arg.
Sat Oct 7 23:41:02 1995 Miles Bader <miles@gnu.ai.mit.edu>
* symlink.c (S_fsys_getpriv): Add new extra args.
* magic.c (S_fsys_getpriv): Ditto.
Mon Sep 18 14:54:55 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* fifo.c (trivfs_S_file_set_size): Renamed from trivfs_S_file_truncate;
Return EINVAL if the new size isn't 0.
* new-fifo.c (trivfs_S_file_truncate): Ditto.
* null.c (trivfs_S_file_set_size): Renamed from trivfs_S_file_truncate.
Fri Sep 8 12:27:35 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* fifo.c, new-fifo.c (open_hook): Block for read only when there's
really someone reading already, or until there's a writer.
(open_hook): Use the WAIT macro to block.
* fifo.c (wait_for_writer): New variable.
(main): Set WAIT_FOR_WRITER with WAIT_FOR_READER.
* new-fifo.c (struct fifo_trans): Added wait_for_writer field.
Delete standalone field. Add some comments.
(fifo_trans_create): Propagate and set the wait_for_writer field.
(fifo_trans_parse_args): Set the wait_for_writer field.
* fifo.c (trivfs_modify_stat): Only return pipe info if there's a pipe.
(close_hook): Don't die if there's no pipe.
* new-fifo.c (trivfs_modify_stat): Only return pipe info if
there's a pipe.
(fifo_trans_close): Don't die if there's no pipe.
Thu Aug 31 19:16:25 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* fifo.c (trivfs_S_io_select): Use pipe_pair_select.
(trivfs_S_io_write): Pass in the NOBLOCK parameter to pipe_write.
Wed Aug 30 12:14:58 1995 Miles Bader <miles@geech.gnu.ai.mit.edu>
* fifo.c (trivfs_goaway): Implement correctly.
(main): When we time out, don't exit unless there are no opens.
(main): Add timeouts.
(port_bucket): Now a local variable in main.
(trivfs_S_io_select): Implement correctly.
Tue Aug 29 17:31:45 1995 Miles Bader <miles@geech.gnu.ai.mit.edu>
* fifo.c (open_hook): Use hurd_condition_wait to detect interrupts.
Thu Aug 24 10:41:31 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* Makefile (all): New target.
(symlink, magic, ifsock, fifo, null): Put all dependencies in
these targets.
(null-HURDLIBS, ifsock-HURDLIBS, fifo-HURDLIBS): Removed.
Get rid of rules dealing with error.o
Wed Aug 23 13:11:18 1995 Miles Bader <miles@duality.gnu.ai.mit.edu>
* magic.c (S_fsys_forward): New function.
* symlink.c (S_fsys_forward): New function.
* bogus-fifo.c (S_fsys_forward): New function.
Tue Aug 22 10:48:47 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* Makefile (HURDLIBS): Add libshouldbeinlibc (everyone uses it).
(symlink, magic, fifo, null, ifsock): Remove error.o.
Get rid of rules dealing with error.o.
* fifo.c (trivfs_goaway, trivfs_modify_stat): Update arguments.
(trivfs_modify_stat): Give the size of the fifo now that we've got
a handle on it.
Mon Aug 21 14:43:46 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* null.c (trivfs_goaway, trivfs_modify_stat): Update arguments.
* ifsock.c (trivfs_goaway, trivfs_modify_stat): Update arguments.
* fifo.c (open_hook): Use condition_broadcast instead of
condition_signal on active_fifo_changed, as all waiters need be
notified of changes.
Tue Jul 25 13:53:30 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* fifo.c: New file.
(main): Don't pass in the MACH_RCV_TIMEOUT flag with a zero timeout.
* Makefile (SRCS): Add fifo.c.
(targets): Add fifo.
(fifo): New target.
Thu Jul 6 15:42:25 1995 Michael I Bushnell <mib@duality.gnu.ai.mit.edu>
* Makefile (OBJS): New var.
* Makefile: Removed dependencies that are now automatically
generated.
Wed Jul 5 21:17:34 1995 Michael I Bushnell <mib@duality.gnu.ai.mit.edu>
* Makefile (ifsock-HURDLIBS, null-HURDLIBS): New vars.
(null, ifsock): Fix dependencies.
Wed Jun 28 15:07:25 1995 Michael I Bushnell <mib@duality.gnu.ai.mit.edu>
* null.c (PT_CTL, PT_NODE): Deleted macros.
(trivfs_protid_porttypes, trivfs_cntl_porttypes,
trivfs_protid_nporttypes, trivfs_cntl_nporttypes): Deleted vars.
(trivfs_protid_portclasses, trivfs_cntl_portclasses,
trivfs_protid_nportclasses, trivfs_cntl_nportclasses): New vars.
(control_class, node_class, port_bucket): New vars.
(main): Initialize control_class, node_class, port_bucket,
trivfs_protid_portclasses, and trivfs_cntl_portclasses.
(ports_cleanroutines): Delete initialization.
(main): Convert to new trivfs interface.
(trivfs_goaway): Likewise.
(main): Convert to new ports interface.
(ports_demuxer, ports_notice_idle, ports_no_live_ports,
ports_no_hard_ports): Deleted functions.
* Makefile (ifsock): Add dependency on libihash.
(null): Likewise.
* ifsock.c (PT_CTL, PT_NODE): Deleted macros.
(ports_cleanroutines): Deleted var.
(ports_notice_idle, ports_no_live_ports, ports_no_hard_ports):
Deleted functions.
(control_class, node_class, port_bucket): New vars.
(trivfs_protid_porttypes, trivfs_cntl_porttypes,
trivfs_protid_nporttypes, trivfs_cntl_nporttypes): Deleted vars.
(trivfs_protid_portclasses, trivfs_cntl_portclasses,
trivfs_protid_nportclasses, trivfs_cntl_nportclasses): New vars.
(main): Initialize control_class, node_class, port_bucket,
trivfs-protid_portclasses, and trivfs_cntl_portclasses.
(main): Use new trivfs interface.
(trivfs_goaway): Likewise.
(main): Use new ports interface.
(S_ifsock_getsockaddr): Likewise.
(demuxer): Renamed from ports_demuxer.
(demuxer): Declare ifsock_server.
Fri May 12 19:07:54 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* magic.c (S_fsys_set_options, S_fsys_mod_readonly): Change from
mod_readonly to set_options.
* symlink.c (S_fsys_set_options, S_fsys_mod_readonly): Ditto.
Thu May 11 13:36:28 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* null.c (trivfs_modify_stat): Make st_blksize really large.
Mon Apr 10 20:38:49 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* null.c (trivfs_S_file_truncate): Always return 0, so O_TRUNC works.
Sun Apr 9 00:26:07 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* null.c (main): Use trivfs_startup() instead of doing things manually.
Get rid of _libports_initialize() [it gets called automatically].
* ifsock.c (main): Ditto; also, use error() to print error messages.
Mon Apr 3 16:39:33 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* null.c (trivfs_modify_stat): Return more useful values for the
st_blksize and st_fstype fields.
Fri Mar 31 12:20:48 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* null.c (main): Move the check for the bootstrap port after the
args check, so that users can run it from the shell to get a usage
message.
* magic.c (main): Don't deallocate our right to the underlying
disk node, so we don't get garbage collected prematurely. Also
move the check for the bootstrap port after the args check, so
that users can run it from the shell to get a usage message.
Wed Mar 29 19:30:33 1995 Miles Bader <miles@churchy.gnu.ai.mit.edu>
* magic.c: New file: Translator to return F_RETRY_MAGIC strings.
* null.c: New file: Translator for /dev/null & /dev/zero.
* Makefile: Add support for the magic and null servers.
Wed Aug 31 11:08:10 1994 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
* symlink.c (S_fsys_mod_readonly, S_fsys_syncfs): New functions.
Tue Aug 30 16:42:29 1994 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
* ifsock.c (main): Call file_name_lookup instead af path_lookup.
Tue Aug 16 11:38:26 1994 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
* Makefile (symlink, symlink.o): New targets.
Change to be type `servers.'.
Fri Jul 22 15:15:49 1994 Michael I Bushnell <mib@geech.gnu.ai.mit.edu>
* Makefile: Rewritten in accord with new scheme.
|