Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Inferno Programming with Limbo 1st Edition Phillip Stanley-Marbell 2024 Scribd Download

Download as pdf or txt
Download as pdf or txt
You are on page 1of 72

Visit https://ebookultra.

com to download the full version and


explore more ebooks

Inferno Programming with Limbo 1st Edition Phillip


Stanley-Marbell

_____ Click the link below to download _____


https://ebookultra.com/download/inferno-programming-
with-limbo-1st-edition-phillip-stanley-marbell/

Explore and download more ebooks at ebookultra.com


Here are some recommended products that might interest you.
You can download now and explore!

Earth Inferno Austin Osman Spare

https://ebookultra.com/download/earth-inferno-austin-osman-spare/

ebookultra.com

Introduction to Programming with Greenfoot Object Oriented


Programming in Java with Games and Simulations 1st Edition
Michael Kolling
https://ebookultra.com/download/introduction-to-programming-with-
greenfoot-object-oriented-programming-in-java-with-games-and-
simulations-1st-edition-michael-kolling/
ebookultra.com

Graphics Programming with Perl 1st Edition Martien


Verbruggen

https://ebookultra.com/download/graphics-programming-with-perl-1st-
edition-martien-verbruggen/

ebookultra.com

Maya Programming with Python Cookbook 1st Edition Herbez

https://ebookultra.com/download/maya-programming-with-python-
cookbook-1st-edition-herbez/

ebookultra.com
PHP Programming with PEAR 1st Edition Schmidt Stephan

https://ebookultra.com/download/php-programming-with-pear-1st-edition-
schmidt-stephan/

ebookultra.com

Programming with C Zambak 1st Edition Osman Ay

https://ebookultra.com/download/programming-with-c-zambak-1st-edition-
osman-ay/

ebookultra.com

Inferno Special Illustrated Edition Featuring Robert


Langdon Dan Brown

https://ebookultra.com/download/inferno-special-illustrated-edition-
featuring-robert-langdon-dan-brown/

ebookultra.com

Masterminds of Programming Conversations with the Creators


of Major Programming Languages 1st Edition Federico
Biancuzzi
https://ebookultra.com/download/masterminds-of-programming-
conversations-with-the-creators-of-major-programming-languages-1st-
edition-federico-biancuzzi/
ebookultra.com

Excel Programming with VBA Starter 1st Edition Robert


Martin

https://ebookultra.com/download/excel-programming-with-vba-
starter-1st-edition-robert-martin/

ebookultra.com
Inferno Programming with Limbo 1st Edition Phillip
Stanley-Marbell Digital Instant Download
Author(s): Phillip Stanley-Marbell
ISBN(s): 9780470843529, 0470843527
Edition: 1
File Details: PDF, 28.67 MB
Year: 2003
Language: english
Inferno Programming
with Limbo
This page intentionally left blank
Inferno Programming
with
Limbo

Phillip Stanley-Marbell
Carnegie Mellon University
Copyright © 2003 John Wiley & Sons, Ltd
The Atrium, Southern Gate, Chichester,
West Sussex PO19 8SQ, England
National 01243 779777
International (+44) 1243 779777
Email (for orders and customer service enquiries): cs-books@wiley.co.uk
Visit our Home Page on http://www.wileyeurope.com or http://www.wiley.com
All Rights Reserved. No part of this publication may be reproduced, stored in a retrieval system or
transmitted in any form or by any means, electronic, mechanical, photocopying, recording, scanning or
otherwise, except under the terms of the Copyright, Designs and Patents Act 1988 or under the terms of a
licence issued by the Copyright Licensing Agency Ltd, 90 Tottenham Court Road, London WIT 4LP, UK,
without the permission in writing of the Publisher, with the exception of any material supplied specifically
for the purpose of being entered and executed on a computer system, for exclusive use by the purchaser
of the publication. Requests to the Publisher should be addressed to the Permissions Department, John
Wiley & Sons, Ltd, The Atrium, Southern Gate, Chichester, West Sussex PO19 8SQ, England, or emailed to
permreq@wiley.co.uk, or faxed to (+44) 1243 770620.
Neither the authors nor John Wiley & Sons, Ltd accept any responsibility or liability for loss or damage
occasioned to any person or property through using the material, instructions, methods or ideas contained
herein, or acting or refraining from acting as a result of such use. The authors and publisher expressly
disclaim all implied warranties, including merchantability or fitness for any particular purpose. There will
be no duty on the authors or publisher to correct any errors or defects in the software.
Designations used by companies to distinguish their products are often claimed as trademarks. In all
instances where John Wiley & Sons, Ltd is aware of a claim, the product names appear in capital or all
capital letters. Readers, however, should contact the appropriate companies for more complete information
regarding trademarks and registration.
This publication is designed to provide accurate and authoritative information in regard to the subject
matter covered. It is sold on the understanding that the Publisher is not engaged in rendering profes-
sional services. If professional advice or other expert assistance is required, the services of a competent
professional should be sought.
Wiley also publishes its books in a variety of electronic formats. Some content that appears in print may
not be available in electronic books.

Library of Congress Cataloging-in-Publication Data


(to follow)
British Library Cataloguing in Publication Data
A catalogue record for this book is available from the British Library
ISBN 0 470 84352 7

Typeset in 10/12 pt Palanno by T&T Productions Ltd, London.


Printed and bound in Great Britain by Biddies Ltd, Guildford and King's Lynn.
This book is printed on acid-free paper responsibly manufactured from sustainable forestry in
which at least two trees are planted for each one used for paper production.
To my friend Nebahat Noyan
Benim kucuk mavi cicegim
This page intentionally left blank
Contents

Preface xiii

1 Introduction 1
1.1 What is Inferno? 1
1.2 History and Overview of Inferno 2
1.3 Limbo 3
1.4 Resources as Filesystems and Per-Process Name Spaces 4
1.5 Networks 4
1.6 Installing the Inferno Emulator 5
1.7 Getting Started with Inferno 6
1.8 Name Spaces and Basic Name Space Configurations 12
1.9 The Inferno Application Development Environment 13
1.10 Summary 21

2 An Overview of Limbo 25
2.1 Introduction to Limbo 25
2.2 Hello World 26
2.3 Discourse on include and load 28
2.4 Some Details 29
2.5 Reserved Identifiers, Operators and Associativity 30
vii
vlii Contents

2.6 Scope 30
2.7 Import Statements 33
2.8 Flow Control 33
2.9 Summary 38
2.10 Chapter Examples 40
Problems 43

3 Data Types 45
3.1 Primitive Data Types 45
3.2 The string Data Type 47
3.3 Reference Versus Value Types 48
3.4 Lists 49
3.5 Arrays 52
3.6 Tuples 57
3.7 ADTs 58
3.8 Type Definitions 71
3.9 Summary 71
3.10 Chapter Examples 73
Problems 74

4 Using Modules 77
4.1 Review 77
4.2 Taking Advantage of Dynamic Module Loading 83
4.3 Module Resource Consumption and Built-in Modules 84
4.4 Self-Referential Modules 84
4.5 Summary 86
4.6 Chapter Example: Xsniff 88
Problems 92
Appendix: Developing Built-in Modules 93
A.I Defining the Module Interface 93
A.2 Generating C Stubs with the Limbo Compiler 94
A.3 Module Function Signatures 95

5 System I/O 101


5.1 The Sys Module 101
5.2 aprint 101
5.3 bind 104
5.4 byte2char 107
Contents ix

5.5 char2byte 108


5.6 chdir 109
5.7 create 110
5.8 dup, fildes 113
5.9 open 115
5.10 read 115
5.11 remove 116
5.12 seek 116
5.13 stream 117
5.14 write 117
5.15 Unbuffered Character I/O 117
5.16 Exception Handling 118
5.17 Summary 121
5.18 Chapter Example: Pled, a Simple Line Editor 123
Problems 131

B Programming with Threads 133


6.1 Introduction 133
6.2 Thread Creation 135
6.3 Thread States 136
6.4 Thread Name Spaces 137
6.5 Caveats 140
6.6 The /prog Filesystem Interface to Threads 140
6.7 Summary 147
6.8 Chapter Example: Broke—Culling Broken Threads 149
Problems 151

7 Channels 153
7.1 Introduction 153
7.2 Multi-Way Selection on Channels with alt and Arrays of Channels 156
7.3 Pipelining Computation with Channels 159
7.4 User-Level Filesystems: Files Connected to Channels 161
7.5 Example: A Simple File Server 165
7.6 Summary 169
7.7 Chapter Example: Multiplexing Readers in Simple File Server 170
Problems 172
Appendix: Modeling and Verification of Concurrent Applications
with SPIN 173
x Contents

A.1 Using SPIN 173

8 Styx Servers 183


8.1 #M, The Mount Driver 184
8.2 #s, The Server Registry 185
8.3 The Styx Protocol 186
8.4 Types, Tags, Fids and Qids 187
8.5 Styx Message Formats 187
8.6 Intercepting Styx Messages 191
8.7 Building Filesystem Filters: Filterfs 194
8.8 Implementing a Styx Server with the Styxlib Module 202
8.9 Summary 206
8.10 Chapter Example: Dynamic User-Level Filesystems 207
Problems 212

9 Networking 215
9.1 The /net/ Filesystem 215
9.2 Configuring the Network on the Inferno Emulator 216
9.3 Configuring the Network in Native Inferno 217
9.4 Networking Through Sys Module Calls 220
9.5 Dealing with HTML: The Webgrab, Url and HTML Modules 224
9.6 Summary 231
9.7 Chapter Example: Tunneling Styx Traffic over HTTP 233
Problems 240

10 Cryptographic Facilities 243


10.1 Setting Up an Authentication Server 243
10.2 Mutual Authentication 246
10.3 Summary 248
10.4 Chapter Example: Secure Hashes of Files 249
Problems 251

11 Graphics 253
11.1 Introduction 253
11.2 Point 256
11.3 Rect 258
11.4 Context 259
11.5 Display and/dev/draw 261
Contents xi

11.6 Screen 263


11.7 Image 264
11.8 Example: Pong 265
11.9 The Tk and Wmlib Modules 272
11.10 Summary 277
Problems 284

Appendix A Limbo Language Grammar 285


A.I Limbo Language Grammar 285

Appendix B Module Reference 291


B.I The Bufio Module Interface 291
B.2 The Draw Module 293
B.3 The Keyring Module 297
B.4 The Styx Module 300
B.5 The Sys Module 302
B.6 The Tk Module 305
B.7 The HTML Module 306
B.8 The Url Module 307
B.9 The Wmlib Module 308

Appendix C Selected Manual Pages 309


C.I The Inferno Emulator 309
C.2 The Limbo Compiler 311
C.3 Formatted Output 313
C.4 Secure Sockets Layer Device 315
C.5 Secure Sockets Layer Limbo Interface 317
C.6 Draw Introduction 318
C.7 The Draw Image ADT 321
C.8 Fonts 326
C.9 Tk 329

Bibliography 339

Index 345
This page intentionally left blank
Preface

The subject matter of the text is the development of software for the Inferno operating
system, using the Limbo programming language.
Inferno is an operating system for building distributed applications in networked
environments. It is targeted at resource-constrained computing systems such as set-
top boxes, PDAs and point-of-sale terminals, which usually have limited computing
resources, are networked and often need to handle multimedia such as streaming
audio or video. It was designed from the ground up to address these issues.
Inferno derives its heritage from the creators of the Unix and Plan 9 operating
systems and the C and C++ programming languages, Lucent Technologies' Bell Labs.
Inferno has recently been made freely available to the general public in binary form,
and source code is available for a small fee under an open-source-like licence. Limbo
is the programming language in which applications for Inferno are written.

Purpose
This book is intended as a comprehensive guide for programmers who wish to develop
applications for the Inferno operating system, with an emphasis on taking advantage
of its unique capabilities. The text provides a brief introduction to the installation and
use of Inferno, and an in-depth exposition and solid reference for developing Inferno
applications in Limbo.

xiii
xiv Preface

A reader with no prior experience of Inferno, or of related technologies, should be


able to use the text both as an introduction to Inferno and as a reference on developing
Inferno applications in Limbo.

Target Audience
The text is targeted primarily at professionals who will be developing applications
in the Limbo language for Inferno and is therefore structured as a self-study text. It
is also suitable for use as a college-level text, providing end-of-chapter exercises to
further develop the concepts introduced in each chapter. For both the professional
audience and the college student, a familiarity with programming languages such as
Pascal, C/C++ or Java is assumed. It is not meant to be an introductory programming
text.
Every attempt has been made to keep the book as self-contained as possible, mak-
ing it an ideal introduction as well as a handy reference. Readers will appreciate the
practical approach of the text. Each chapter concludes with an analysis of a complete
representative application that uses concepts introduced in the chapter, which may
be used as a starting point for developing the reader's own applications. The exam-
ple discussion further serves to point out common pitfalls when programming with
concepts introduced in that chapter. The tone of the book is intended to be refreshing,
and every attempt is made to keep the presentation and discussions lively.

Material Covered
1 Introduction
An introduction to the Inferno Operating System, its origin, design and use.
A description of the heritage of the Limbo language, its origins and how it
compares to other contemporary programming languages. Resources as files
and per-process name spaces. Installing Inferno and setting up user accounts.
The Inferno application development environment.
2 An Overview of Limbo
An introduction to Limbo programming. The basic structure of Limbo pro-
grams. Operators. Flow control.
3 Data Types
An overview of the basic data types in Limbo.
4 Using Modules
Using modules to structure applications. Developing Inferno built-in modules.
5 System Input and Output
Performing program input and output in Limbo. The Inferno built-in system
module.
Preface xv

6 Programming with Threads


Writing multi-threaded applications in Limbo. Thread creation and control.
Thread name spaces. The Inferno /prog interface.
7 Channels
Channels as communication paths. Simple fileservers—Files connected to chan-
nels.
8 Styx Servers
Introduction to the Styx protocol and its use in Inferno. Styx message formats.
Intercepting Styx messages. Developing Limbo Styx servers.
9 Networking
Introduction to inter-networking in Inferno. Inferno's /net filesystem and net-
work protocol stacks. Writing networking applications using the /net filesys-
tem interface. Writing networking applications using Sys module calls. Devel-
oping applications that access the WWW. Dealing with HTML.
10 Cryptographic Facilities
The Inferno security model. Configuring Certificate Authorities. Mutual au-
thentication.
11 Graphics
Introduction to graphics in Inferno. The /dev/draw interface. The Inferno Draw
built-in module. The Inferno Tk and Wmlib modules.
Appendices Limbo language grammar. Some useful module interface definitions. Selected
manual pages.
The source code for the examples included in the book, together with additional
material such as more Limbo applications, updates to the text to reflect changes
in Inferno and Limbo, and corrections, are available from the book's Web page at
http://www.gemusehaken.org/i pwl/.

Conventions
Throughout the text, a handful of conventions are used to distinguish between differ-
ent types of material.
Path names are listed relative to the root of the Inferno distribution and are dis-
played in a teletype font, in-line in the text. For example, /appl/cmd/sort.b. IP
addresses and host names are also displayed in a tel etype font.
Code fragments and command shell transcripts are listed in shaded boxes such as
the following:
xvi Preface

Variable names and Limbo module names appear in tel etype font when they are
being discussed; for example, one may refer to a variable vari abl ename.
Inferno command-line utilities and other services are displayed in italics, with the
section number of their respective manual pages in parenthesis. For example, the
manual page for the application for displaying manual pages is referred to as manCL),
as its page is in Section 1 of the Inferno manual. Other applications, such as those
developed in this text, are referred to by their name in italics.

Acknowledgments
Thanks to all those who provided encouragement at various stages of this work,
spread over almost five years. I could not possibly mention by name all those who,
either by their encouraging remarks or outright derision, have helped keep me mo-
tivated. Truman Boyes, Russ Cox, Vasilios Daskalopoulos, Ben Lui, Nebahat Noyan,
Matthew Riben, Seth Rubenstein and Simon Wong all read early versions of the
manuscript and provided valuable feedback. Truman Boyes, Ben Brewer, Jon Ober-
ton, Andrew Sylvia and the collective energies of suspicious.org helped refine the
final versions of the manuscript.
Bengt Kleberg, Vasilios Daskalopoulos and Vincent Matossian deserve special men-
tion for their detailed reviews of many of the chapters of this book. Their feedback
was invaluable. The artwork preceding each chapter was created (all in one night!)
by Nebahat Noyan.
Last, but most importantly, I would like to thank the fine folk at Wiley and elsewhere
who helped make this happen: Karen Mosman and Gaynor Redvers-Mutton (my
editors in succession at Wiley), Jill Jeffries, Robert Hambrook (my production editor
at Wiley), Jonathan Wainwright (my copy-editor at T&T Productions), whom I drove
crazy with PDF sticky notes (almost 400 in one revision!)—Thanks Jon!—and countless
others whom I will probably never know.
This document was typeset using free software. The typesetting was done in KTgX,
primarily on computers running derivatives of the 4.4BSD operating system.

Phillip Stanley-Marbell
Pittsburgh, PA
This page intentionally left blank
1
Introduction

This chapter provides an introduction to Inferno, its history, underlying concepts and
construction. Also described in this chapter are the procedures for installing and
configuring an Inferno system, and the basic tools provided for editing, compiling
and debugging Limbo programs.

1.1 What is Inferno?


Inferno is an operating system well suited for building networked applications which
run in heterogeneous environments. It runs on a variety of hardware architectures,
such as the Intel x86 family, various flavors of the MIPS architecture, different variants
of the ARM architecture such as the ARM Thumb and Intel StrongARM, the SPARC
architecture and many more. Inferno was designed to be easily ported to a wide
variety of architectures, and support for new microprocessor and system architectures
is easily added. It is unique in being available to run directly over bare hardware,
as traditional operating systems such as Unix do, as well as being available as an
emulator. The Inferno emulator virtualizes the entire operating system, and Inferno
applications and end users are presented with an identical interface on the native
platform or on the emulator running over another host operating system.
The supported host platforms for the Inferno emulator include Sun Solaris for
SPARC processors, Solaris for Intel x86 processors, Windows 95/98/ME/NT/2000,
HP-UX, IRIX, OpenBSD, FreeBSD, Linux and Plan 9. Applications written for the
emulator, or for the native platform, can be run on any Inferno system without re-
compilation. This is made possible by Inferno's use of a virtual machine to shield
1
2 Introduction

applications from the details of the underlying hardware. Having versions of Inferno
that run both on bare hardware and in emulated environments lends a degree of
flexibility in application development that is rare among operating systems. A devel-
oper, in order to develop applications for Inferno, therefore need not have access to
hardware that will run Inferno natively.

Figure 1.1 Organization of components in Inferno running directly over hardware (i.e. native Inferno).

Figures 1.1 and 1.2 illustrate the organization of components in the native and
emulated versions of Inferno, respectively. The emulated and native environments are
identical above the Dis virtual machine (Dis VM). Native Inferno, which runs over bare
hardware, provides the necessary OS support to the Dis VM, whereas the emulated
version of Inferno relies on the facilities of the host operating system. The facilities
required of the host operating system include performing I/O and scheduling Dis
VM threads. These Dis VM threads are threads (or processes, depending on the host
platform) of the Dis VM itself. The Dis VM contains an internal scheduler for scheduling
Limbo threads running over the VM. This is separate from the host platform's thread
or process scheduling in the emulator, and from the process scheduling in native
Inferno (which schedules Dis VM processes and the like, not Limbo threads).

1.2 History and Overview of Inferno


Inferno was created by the Computing Sciences Research Center (CSRC) at Lucent
Technologies' Bell-Labs, Murray Hill, NJ, the creators of C, C++, Alef, Acid, Unix
and Plan 9 to name but a few. In the mid 1980s, after their child Unix had reached
pubescence, the creators of Unix created 'Plan 9' (named after Ed Wood's film 'Plan 9
from Outer Space'). In 1995, at about the same time as Sun's Java programming
language was beginning to cause a stir, the developers of Plan 9 started work on a
Limbo 3

Figure 1.2 Organization of components in emulated version of Inferno.

decidedly commercial project that would later on be named Inferno' (after The Inferno,
vol. I of Dante Alighieri's Divine Comedy) 1 .
Several of the features of Plan 9 saw their way into Inferno. Unlike Plan 9, however,
Inferno comes with a virtual machine, the Dis VM, to enable portability of Inferno ap-
plications across different hardware platforms. Dis has a memory-to-memory archi-
tecture as opposed to a stack architecture as in the Java virtual machine. A memory-to-
memory architecture is essentially an infinite-register machine, with as many registers
as there are words of memory. This simplifies on-the-fly compilation on most mod-
ern target architectures. At the time of the development of Inferno, the developers
realized they needed a secure, type-safe, garbage-collected language. The developers
considered using Java, but Java was in a state of flux and they decided they would
rather deal with their own language that would be changing as it evolved rather than
someone else's moving target [64]. Unlike Java, Limbo is not object oriented; however,
it does support code reuse via modular programming.

1.3 Limbo
Limbo was designed by Sean Dorward, Rob Pike and Phil Winterbottom. It has cer-
tain features of other programming languages like Pascal (declarations), Alef (chan-
nels, ADTs), Occam (channels), Hoare's Communicating Sequential Processes (CSP)
(channels, alternating on channels), Newsqueak, ML (module system, compile-time
1This naming decision was made because a member of the team (Rob Pike) had been reading the Divine
Comedy at the time and noted that it would provide a rich source of names.
4 Introduction

type checking, garbage collection), and introduces ideas of its own. Limbo employs
strong type checking both at compile- and runtime, automatic garbage collection, and
inter-thread communication over typed channels. Limbo was designed for the devel-
opment of distributed applications. Its implementation makes it suitable for use on
machines that do not have memory protection hardware such as a hardware memory
management unit (MMU). There are no pointers in Limbo, and the language pre-
vents direct access to machine memory—the virtual machine and the Limbo compiler
cooperate to provide the functionality of memory protection. Limbo is compiled to
machine-independent byte-code for execution on the Dis VM.

1.4 Resources as Filesystems and Per-Process


Name Spaces
Representation of resources as files is a fundamental idea in Inferno. Computer users
and programmers are familiar with files and their semantics, so make every resource
behave like a file, subject to the well-known and understood file operators (open, read,
write, etc.). If this hierarchy of files representing resources (referred to as a name space)
is then made available over a network, it facilitates the easy distribution of resources
in a network.
Entries in a name space may be ordinary disk files, interfaces to services, peripher-
als, programs or networks. There are operations provided for the management of the
name space, and applications may be restricted by constraining their name spaces.
For example, an application may be restricted from performing network communi-
cation by restricting its name space to exclude the network protocol stack, which is
represented as a filesystem in the application's name space. The facilities which ap-
plications may use to perform operations on their name space are discussed in detail
in Chapter 6.
Besides being able to restrict the entries in the name space of an application, entries
in the name space are subject to file-access restrictions, similar to those in operating
systems such as Unix.

1.5 Networks
Inferno (and to a lesser extent the Inferno emulator) supports a wide variety of inter-
networking protocols, such as IP, TCP/IP, UDP/IP, ICMP, GRE and ESP to name a
few. Communication between Inferno devices is typically in the form of messages
in a protocol called Styx, usually running over TCP/IP. Styx is a remote procedure
call protocol similar to the NFS RPC protocol [69] (though significantly simpler in
both design and implementation). Unlike NFS RPC, Styx is stateful, and a Styx server
maintains information on connected clients.
Installing the Inferno Emulator 5

1.6 Installing the Inferno Emulator


This section describes installing the Inferno emulator over a host operating system.
Installing Inferno directly over the hardware of your computer, as you would for
Linux or OpenBSD, is beyond the scope of this book.

1.6.1 Microsoft Windows


To install from an Inferno distribution CD, run the setup program in the install
directory of the CD. If installing from the Web download, first download the nec-
essary archive files. You should then uncompress them into a temporary instal-
lation directory. You can then run the setup program, which can be found in the
install subdirectory. The setup program will attempt to install into the directory
C: \Users\Inferno by default. You might want to add the emulator executables di-
rectory (C:\Users\Inferno\NT\386\bin\) to your PATH environment variable, but
this is not absolutely necessary. If you installed the emulator in the default directory,
you should now be able to start the emulator by running the emu. exe program in
NT/386/bi n relative to the installation root directory.
If the emulator was installed into a directory other than the default C:\Users
\Inferno, you will need to supply the full path of the installation root directory
when invoking the emulator executable. For example, if you installed into the di-
rectory C: \Program Files\Inferno, you would have to invoke the emulator in the
following manner:

The - r flag specifies the location of the Inferno root. Be careful that there is no
whitespace between the - r flag and the path name. Further options accepted by the
emulator command are detailed in the manual page for the emulator, which can be
viewed by typing man emu from within the emulator. The manual page for emu (and
other useful ones) are included in the appendices to this book.
There is nothing more in the setup that is specific to Windows platforms, and
everything else is a matter of configuring your Inferno system correctly, from within
the emulator.

1.6.2 Unix Platforms (Linux, FreeBSD, etc.)


The default installation location is /usr/local/i nferno. You can override the root
directory that the Inferno emulator knows of by using the - r/<path>/ flag when
starting up emu. It is advisable to create a startup script that will launch Inferno with
the appropriate parameters. You will also need to create a user called 'inferno' on the
6 Introduction

host system, or whatever name you want the administrative user within Inferno to be
called.

1.6.3 Plan 9
The default installation location of Inferno on Plan 9 is in /usr/inferno. You can
override the root directory that the emulator knows of by using the - r/<path>/ flag
when starting up the emulator. To be able to cleanly run Inferno services, you need
to add the contents of the file /services/cs/services from your Inferno root to
/lib/ndb/1oca!. You will also need to create a user called 'inferno' on the host
system, or whatever name you want the administrative user within Inferno to be
called.

1.7 Getting Started with Inferno


The rest of the configuration is performed through the use of the configuration pro-
grams provided with the emulator. These run within the emulator to perform such
functions as creating new users and setting up your machine as a server of some
sort. Throughout the remainder of the book, all path names are relative to the Inferno
installation root.

Figure 1.3 The initial console login prompt after starting the emulator.

1.7.1 Overview
After launching the emulator executable, you will be presented with the Inferno con-
sole, shown in Figure 1.3.
The Inferno graphical environment can be started by launching either the login
window manager interface shown in Figure 1.4, by typing wm/logon at the initial
Getting Started with Inferno 7

Figure 1.4 Logging in to Inferno.

Inferno console, or launching directly into the window manager by typing wm/wm.
Once logged in, command consoles or shells can be opened via the button on the
lower left of the screen, as illustrated in Figure 1.5.
For those familiar with operating systems such as Unix and its derivatives, a few
of the familiar commands are also available in Inferno; ls(l) provides a listing of files
in the current directory, and accepts many of the command-line flags available in
Unix-like systems: cd(i) changes the current working directory; ps(1) provides a list
of launched threads; du(1) provides a listing of disk usage statistics, etc. There are
some new commands and variants of old commands: lc(l) provides a columnized
output of the contents of the current working directory. These commands and a few
more are illustrated below. Each line of the output of the ps command shows the
thread ID, thread group ID, user executing the thread, state of the thread, memory
size and module name, respectively:
8 Introduction

Figure 1.5 The default window manager.


Getting Started with Inferno 9

The command kill(l) takes as argument a thread ID or Limbo module name, and
terminates the corresponding thread or the threads executing the specified module,
respectively. More information is available from the Inferno command line or shell
by typing 'man' followed by a command, utility or application name.

Figure 1.6 The general layout of an Inferno system.

1.7.2 Adding New Users and Passwords


There are no 'super users' and all users have equal privileges. However, on each
system, most services are owned by an administrative user, usually the user 'inferno',
but this need not necessarily be so. It is usually prudent to set up the filesystem so
that all system-related configuration files are owned by the user 'inferno'. If using
10 Introduction

the Inferno emulator, this user must have an account on the host system, i.e. on Unix
platforms there must be a user 'inferno' if your administrative user within Inferno is
going to be 'inferno'. This is because the Inferno emulator exports the file ownership
and permissions from the host system to the emulator level. Thus, for each user that
has an account to login to the emulator, there should be a corresponding user with
the same name on the host system (hopefully the same user!), but not necessarily the
same password.
Users are added to the system by creating home directories with their user names
under the /usr/ directory of the Inferno root. The directory 1ib/ in a user's home
directory conventionally contains per-user configuration files, such as rule sets for
the plumber(8) inter-application message router. The directory keyring/ is used for
holding certificates obtained from a certifying authority. The directory charon/ is
used to hold user configuration information and bookmarks for the Charon Web
browser. These directories have to be created for each user added to the system with
the mkdir(1) command. The creation of these directories is a separate process from
the creation of user passwords, to be described next. Figure 1.6 shows the top-level
hierarchy of a typical Inferno filesystem.

Figure 1.7 Adding a new user with the change login command.

Unless the machine is going to be used as an authentication server, there is no need


to set user passwords. In an Inferno network, one machine, the Authentication Server,
also known as the Certificate Authority (CA) or Signer, usually maintains the password
database for users on all nodes in the network. For a machine that is going to be the
sole Inferno entity on a network, one would set it up to be its own authentication
server.
Getting Started with Inferno 11

User passwords are set on an authentication server via the changelogin(8) utility.
Passwords are stored in the file /keydb/password. The change login command
changes the password of a user with a current password entry or creates a new entry
in the /keydb/password file for a new user. To run change login, you need to have
write permission on /keydb/password, so this can only be done by the administrative
user. Figure 1.7 shows a typical session of the changelogin program.

1.7.3 Setting Up Services


You may define which machines in your network are going to provide services such as
your certifying authorities, mail servers, HTTP proxy servers, etc. If you are running
Inferno as a stand-alone system and not in a network, you might use your machine to
provide these services to itself, or you might employ other non-Inferno machines to
perform tasks such as acting as mail or file servers. The default servers for different
services of interest are listed in the connection server database, /services/cs/db.
The connection server, cs(8), is an Inferno server that resolves symbolic names to host
names and network addresses.

Figure 1.8 Editing the connection server database in the Brutus editor. The connection server database
file has the name of the service in the first column and the name or IP address of the machine providing
that service in the second.
12 Introduction

The connection server database file, /services/cs/db, is read when cs is requested


to resolve a name beginning with '$'. All other names are resolved by the external
name servers, which are specified in the /servi ces/dns/db configuration file. You
may specify your DNS servers by creating entries in the /servi ces/dns/db config-
uration file, with the IP address of each of your DNS servers in order of preference,
one per line. Conventionally, names of well-known services are placed in the con-
nection server database, and referred to by their entries, such as SMAIL SERVER. For
example, for the system whose connection server database file is shown in Figure 1.8,
applications and users may use the symbolic name SMAILSERVER whenever they wish
to refer to the system's designated mail server, mail .gemusehaken.org. Edit your
connection server database file to reflect your local setup.
There is no means of explicitly specifying your machine's IP address in the emulator.
The IP address for your machine is exported from the underlying host machine. The
name of your machine, from within the emulator, can be read from /dev/sysname,
which is a synthetic file, synthesized by the emulator kernel. Writing /dev/sysname
sets the machine name, but since this is not a file on disk but rather a file synthesized
by the system, the string written to /dev/sysname does not go into any persistent
storage medium such as a disk, but rather is routed into the emulator. Thus, any
changes written to /dev/sysname will be lost when you restart. You can set up your
environment so that an appropriate string is written into /dev/sysname whenever
you login by placing commands you want executed in the 1ib/wmsetup shell script
in your user directory.

1.8 Name Spaces and Basic Name Space Configurations


An important Inferno concept is that of per-process name spaces. In simple terms, the
name space is the hierarchy of files accessible to a thread.
Resources in Inferno—be they network protocol stacks, interfaces to devices, in-
terfaces to local or remote servers or what have you—usually present simple file or
filesystem interfaces to applications. The entries out of these resources (and also the
more mundane disk files) that are visible to an application or thread make up its name
space. The hierarchy of files visible to two threads from different applications might
be entirely different, as might even be the hierarchy visible to two threads that are
part of the same application.
Modifications to a name space are only seen by the thread making those changes.
Changes made to the name space by a thread also affect the thread's parent, unless a
thread explicitly detaches its name space from that of its parent's. Since name spaces
are per-thread, modifications made to a thread's name space die with it. Modifications
to the name space are made with bind(2), mount(2), unmount(2) and pctl(2) system calls.
The bind system call causes the attachment of one part of an already existing portion
of the file name space to another. The mount system call, on the other hand, causes
the attachment of a new local or remote filesystem into the local name space. The
unmount system call is used to undo the effect of either a bind or a mount operation.
The Inferno Application Development Environment 13

The pctl system call is used to modify properties of a thread's name space, such as
detaching its name space from its parent's.
A default name space is constructed upon login, based on the contents of the
namespace file in the user's home directory. This is achieved through the nsbuild(l)
Inferno utility. In most scenarios, this is either invoked by the wm/logon login pro-
gram or wm/wm, the default window manager. The layout of the name space file is
described in detail in the manual page for namespace (6). In brief, it contains strings
which are interpreted as commands to perform operations on the name space through
bind, mount, unmount and pctl.
Figure 1.9 illustrates the operation of bind and mount system calls, using the equiv-
alent Inferno utilities from the command shell. In the figure, a host, nonetstack.
gemusehaken.org, has no network protocol stack implementation, but has an im-
plementation of Styx over a serial RS-232 line. It attaches the interface to the net-
work protocol stack of the host gw.gemusehaken.org into its local name space
through a mount operation, and subsequently positions it into the default network
protocol stack filesystem interface location through a bind operation. Subsequent to
these steps, the network protocol stack of gw. gemusehaken. org will appear local to
nonetstack.gemusehaken.org.
Applications which engage in network communication via TCP/IP will be using the
network protocol stack of the gw. gemusehaken .org host. Each network access will
cause the generation of Styx messages over the serial line to gw.gemusehaken.org,
where they will be received by the network protocol stack driver. Note that it is only
the interface to the protocol stack that is made local to nonetstack. gemusehaken .org.
All the network traffic to the outside world is being handled by gw. gemusehaken. org,
and nonetstack.gemusehaken.org only receives data that it explicitly requests,
through the protocol stack interface. Network communication and the structure of the
filesystem presented by the network protocol implementations is described further
in Chapter 9.

1.9 The Inferno Application Development Environment


Inferno provides several facilities for writing and debugging applications. Figure 1.10
illustrates the general flow of application development in Inferno using Limbo.
There are two text editors distributed with the system (wm/edit and wm/brutus),
and an integrated shell, window system and editor called Acme that literally does
everything! There is a debugger (wm/deb) for debugging applications and, of course,
a Limbo compiler, Dis assembler, as well as a Dis disassembler.
14 Introduction

Figure 1.9 Illustration of bind and mount.


The Inferno Application Development Environment 15

Figure 1.10 The Inferno application development process.

1.9.1 The Limbo Compiler


The Limbo compiler is available in the distribution in two forms: a version that runs
directly on the host system and compiles Limbo source files to Dis byte-code, and a
version that runs from within the emulator and also generates Dis byte-code.
Having a version that runs natively on the host platforms enables the use of your
favorite editor to edit your Limbo programs, and you may even make use of facilities
like makefiles on your host system to build your applications. However, once these
applications are built, you can only debug, run and crash them from within the Inferno
emulator (or native Inferno).
16 Introduction

The Limbo compiler takes Limbo source files, ending with the extension '.b' by
convention, and produces executables for the Dis VM, with the conventional extension
'.dis'. The compiler will also generate a separate file containing symbolic debugging
information to be used by a debugger. In addition to its use in developing Limbo
programs, the Limbo compiler also provides facilities to ease the development of C
language modules that interact with Limbo applications, so-called built-in modules.
This use is discussed in detail in the appendix to Chapter 4. The following examples
illustrate some modes of use of the Limbo compiler.
Calling the Limbo compiler without any arguments prints a brief summary of its
usage. In the following example, the source file name is webdi ct. b and the resulting
executable is webdict. dis. The executable can then be run by either giving its full
file name or its file name without the '.dis' extension:

Symbolic debugging information to be used by debugging applications such as


wm/deb and stack is generated with the -g flag to the Limbo compiler. It is placed
in a separate file with the extension '.sbl'. In the example below, we cannot initially
obtain any useful information from the stack utility, which prints the stack trace for
a thread, because that utility cannot locate a symbolic debugging information file for
the Cs thread2. Such debugging information can be generated by recompiling the
source for the application (in this case, located in /appl /lib/cs. b) with the -g flag,
and we can retry printing the stack trace. This is particularly useful when debugging
a moribund thread that was not originally compiled with the -g flag:

2The mechanism by which . sbl files are located by Stack and other debugging programs is described
in their respective manual pages.
The Inferno Application Development Environment 17

Figure 1.11 The Acme text window manager.

The Limbo compiler can generate warnings on potentially erroneous (but syn-
tactically correct) statements and expressions in Limbo programs with the -w flag.
Supplying more w's in the flag enables more verbosity:
18 Introduction

Figure 1.12 Using Acme as an integrated development environment.

More options to the Limbo compiler—such as marking executables to be always


interpreted (versus just-in-time compiled) and vice versa, generating Dis assembly
code, etc.—are described in the manual page limbo(1E), included in the appendices to
this book.

1.9.2 The Acme User Interface


Acme is a user interface for programmers. It is a combined text window manager,
text editor and file manager. It is also bundled with and serves as the interface for a
few utility programs such as a mail reader and a command shell. To use Acme, you
will need a three-button mouse.
An example Acme session is shown in Figure 1.11. In the figure, there is an active
Acme session with five text windows open. In the figure, all the windows on the left-
hand portion are being used to edit text files. The window on the upper right-hand
The Inferno Application Development Environment 19

Table 1.1 Some useful Acme commands.

Action / Command Description


Mouse button-1 Hold and drag to highlight text. Single words
can be highlighted by double clicking on them.
Mouse button-2 Execute highlighted phrase. Single words may
also be executed in this manner.
Mouse button-3 Clicking on a word with button-3 will move the
cursor to the next occurrence of the word.
Del col Delete a sub- window (column).
Exit Exit from Acme.
Get Refresh the contents of a window.
Newcol Create a new column.
New Create a new window /file. This window may either
be used as a scratch space or as a file. To save as
a file, edit the tag of the window with the name
you wish to assign to the file, then use the Put
command to save.
Paste Paste the contents of the snarf buffer.
Put Write the contents of the window to disk.
Snarf Copy the selected text.

side shows a directory listing of the path /usr/pi p, and the window on the lower
right is a command shell. The top row of each text window is an editable menu bar,
often referred to as the tag of the window. In the case of the text window containing
all five text windows previously mentioned, the menu bar contains the text strings
Newcol K i l l Putall Dump Exit and the phrase limbo -g small, b.
Each of these items, which can be edited, can be executed by highlighting and
clicking with the middle mouse button (button-2). In the figure, the phrase 1 i mbo -g
smal 1, b has been highlighted, and clicking on it with the middle mouse button will
cause the compilation of the program (smal 1. b) being edited in the Acme window
on the left. For single-word commands, highlighting is not necessary. For example,
clicking on Exit with mouse button-2 will exit from Acme. Some of the more com-
monly used commands in Acme are listed in Table 1.1. Any new commands may be
typed into the menu bar and executed at convenience in this manner. More details
on Acme are provided in its manual pages, acme(l) and acme(4).
Acme is the environment of choice for writing and debugging Inferno applications.
A sample Acme session is shown in Figure 1.12, illustrating some of Acme's capabili-
ties. In the figure, a text file, /usr/pip/hel1o. b, is open for editing in the left half of
Acme. In the right half, there are four sections. The three uppermost window sections
show the contents of three directories, the last being the directory containing the file
hell o. b. The last section of the right-hand side is a window running the program
win, which is an interface to the shell.
20 Introduction

In the shell window at the lower right of Figure 1.12, an attempt has been made to
compile hel1o. b. It has resulted in an error message of the form hel1o. b: 6: syntax
error. Right clicking on this string automatically moves the mouse into the window
containing hel1o. b (or opens it in a new window for editing if it is currently not being
edited), and the faulting line (line 6) is highlighted. A more detailed description of
Acme can be found in its manual pages.

Figure 1.13 Attaching the debugger to an already existent thread—selecting the thread from the list
of running threads in the system.

1.9.3 Debugging Programs


The stackd) utility is used to examine a stack trace of a running or broken Limbo
thread. The output of the stack is formatted so that it can be utilized by Acme and
also by Inferno's plumbing(6). Section 1.9.1 showed an example of the use of the stack
utility.
There is also a graphical debugger, wm/deb(l), which can be used to debug multi-
threaded applications. Figures 1.13-1.15 illustrate the use of Inferno's graphical de-
bugger.
The series of figures illustrate the use of the debugger to debug an application,
SimpleHTTPD, which has previously been launched. The debugger is started by typing
wm/deb from a command shell inside the window manager. It is then attached to the
SimpleHTTPD thread by choosing Thread from the File menu of the debugger and
Summary 21

Figure 1,14 The graphical debugger after attaching it to the SimpleHTTPD thread. The highlighted
source statement is the currently executing statement in the application.

selecting the SimpleHTTPD thread from the list of threads in the window that pops
up, as illustrated in Figure 1.13.
Once the debugger has been attached to a thread, the main debugger window
displays the source of the running application, with the currently running statement
highlighted, as illustrated in Figure 1.14.
The values of variables and other module information may now be probed from
the stack window of the debugger, as illustrated in Figure 1.15. The running program
may be stepped through, stopped, breakpoints inserted, etc., using the buttons on the
top row of the main debugger window.

1.10 Summary
This introductory section has provided a brief overview of Inferno and a walk-through
of how to perform an installation, and we have touched upon how to edit, compile and
debug Limbo applications. The next chapter provides an introduction to the Limbo
language.
22 Introduction

Figure 1.15 Probing the values of variables and module data.

Bibliographic Notes
More detailed histories of Unix can be found in [34, 68]. The Plan 9 operating sys-
tem is described in [53, 54] and further in the accompanying system documentation
available from [55]. Overviews of the Inferno operating system and Limbo language
are provided in [15, 61, 75]. Brian Kernighan's A Descent into Limbo [27] was the ear-
liest tutorial on programming Inferno in Limbo. The use of Inferno for developing
distributed applications is discussed in [72]. Developing and debugging under In-
ferno are also described in [60]. Inferno's Styx protocol is described in [65]. The Dis
virtual machine is described further in [31,82], and its garbage collection mechanism
in [26]. Execution of Java programs under Inferno, by translating Java byte-code to
Dis instructions is described in [85]. The installation process for Inferno is described
further in the Inferno system manuals [80]. The Acme programming environment,
which originally appeared in the Plan 9 operating system is described in [51], and
borrows some ideas from Wirth's Oberon system [84]. Commercial products which
have employed Inferno to date include the Philips Consumer Communications /S2630
Screen Phone, Lucent Technologies' PathStar Access Server, which is described in [18],
and Lucent Technologies' VPN Fireivall Brick [19, 20,43].
This page intentionally left blank
2
An Overview of Limbo

2.1 Introduction to Limbo


Limbo programs are made up of functions and data grouped into entities called mod-
ules. Modules consist of two parts: the interface definition and the implementation.
The interface definition is the interface the module provides to other modules that
wish to invoke it. It specifies functions the module implements and their function
signatures, data constants the module provides and module variables. Interface dec-
larations are typically placed in a separate source file with the extension '.m' by con-
vention, while module implementations are placed in files with the extension '.b'. The
interface definition may also be placed in the same file as the implementation. The
interface declaration file may contain interface definitions for more than one module,
and typically specifies the interface definitions for a closely related group of modules.
The module interface and module implementation can be thought of as types and
values, respectively. Variables can be declared to be of the type of the module interface,
and they must be initialized with a module implementation.
The module implementation consists of the actual Limbo program that performs
the duties of a module. Module implementations are placed in source files with the
extension '.b' by convention. Limbo '.b' files may only contain one module implemen-
tation definition. Putting the interface declaration and implementations in different
files enables the programmer to write programs that interact with a specific module
interface with an option to choose between different implementations of that inter-
face at runtime. Module implementations are compiled by the Limbo compiler into
programs for execution on the Dis VM. The compiled module implementation files
have the extension '.dis' by convention. Figure 2.1 illustrates this organization of the

25
26 An Overview of Limbo

Figure 2.1 Parts of a Limbo module.

components of a module. We will now look at a concrete example which illustrates


this further.

2.2 Hello World


Our first Limbo programming example implements a module that prints out the string
'Hello World!'. We organize this module into two parts: the interface definition and
the implementation. We place the interface definition in the file helloworld.m and
the implementation in the file hel1oworld. b.
The interface definition for the module, placed in hel1oworld. m:

The implementation of the Hel1oWorld Module, in hel1oworld. b:


Discovering Diverse Content Through
Random Scribd Documents
CHAPTER XIV
LETIZIA THE FIRST
“Mrs. Fuller has been so excited ever since the letter came to say
that you would pay a visit to Lebanon House,” the nurse stopped to
tell Nancy at the head of the stairs, before showing the way along
the landing to the old lady’s room.
“Are we going to see more aunts, muvver?” Letizia anxiously
inquired.
“No, darling, you’re going to see dear father’s grannie whom he
loved very much; and he would like you to love her very much too.”
“Well, I will love her,” Letizia promised.
“You must remember that your name is Letizia and that her name
is Letizia. You were christened Letizia because father loved his
grannie. And remember she is very old and that’s why you’ll find her
in bed.”
“Will she be like Red Riding Hood’s grannie?” Letizia asked.
“Perhaps she will be a little.”
“But a naughty wolf won’t come and eat her?” Letizia pressed on a
note of faint apprehension.
“Oh, no,” her mother assured her. “There are no wolves in this
house.”
Was it a trick of the gathering dusk, or did the bright-eyed young
woman raise her eyebrows and smile to herself at this confident
reply?
Nancy had never been so much surprised in her life as she was by
the aspect of old Mrs. Fuller’s room. The old lady, wrapped in a bed-
jacket of orange and yellow brocade and supported by quantities of
bright vermilion cushions, was sitting up in a gilded four-post bed,
the curtains and valance of damasked maroon silk and the canopy
sustained by four rouged Venetian amorini with golden wings. Over
the mantelpiece was a copy of Giorgione’s “Pastorale.” Mirrors in
frames of blown glass decorated with wreaths of pink glass rosebuds
and blue glass forget-me-nots hung here and there on the white
walls, the lighted candles in which gave the windowpanes such a
bloom in the March dusk as is breathed upon ripe damsons.
Bookcases on either side of the fireplace were filled with the sulphur
backs of numerous French novels. On a mahogany table at the foot
of the bed stood a green cornucopia of brilliantly tinted wax fruits that
was being regarded with slant-eyed indifference by two antelopes of
gilded wood, seated on either side.
Of course, Nancy had known that old Mrs. Fuller was different
from the rest of the family; but this flaunting rococo bedroom made a
sharper impression of that immense difference than could all the
letters to her grandson. It was strange, too, that Bram should never
have commented on this amazing room, set as it was in the heart of
the house against which his boyhood had so bitterly revolted. In her
astonishment at her surroundings she did not for the moment take in
the aspect of the old lady herself; and then suddenly she saw the
dark eyes of Bram staring at her from the middle of those vermilion
cushions, the bright eyes of Bram flashing from a death’s head
wrapped in parchment. She put her hand to her heart, and stopped
short on her way across the room to salute the old lady.
“What’s the matter?” snapped a high incisive voice.
“Oh, you’re so like Bram,” cried Nancy, tears gushing like an
uncontrollable spring from her inmost being, like blood from a
wound, and yet without any awareness of grief, so that her voice was
calm, her kiss of salutation not tremulous.
“Might I lift my little girl on Mrs. Fuller’s bed, nurse?” she asked.
“Don’t call her nurse,” the old lady rapped out. “This ain’t a
hospital. It’s only that sanctimonious ghoul Caleb who calls her
nurse. She’s my companion, Miss Emily Young. And why should the
wretched child be lifted up to see an old bogey like myself?”
“I think she’d like to kiss you, if she may,” said Nancy.
“Yes, I would like to kiss you,” said Letizia.
The old woman’s eyes melted to an enchanting tenderness, and,
oh, how often Nancy had seen Bram’s eyes melt so for her.
“Lift her up, Emily, lift her up,” said Mrs. Fuller.
Miss Young put Letizia beside her and the old woman encircled
the child with her left arm. The other hung motionless beside her.
“I’m not going to maul you about. I expect your aunts have
slobbered over you enough downstairs. Just give me one kiss, if you
want to. But if you don’t want to, now that you’re so close to my
skinny old face, why, say so, and I shan’t mind.”
But Letizia put both arms round her great-grandmother’s neck and
kissed her fervidly.
“And now sit down and tell me how you like Lebanon House,” she
commanded.
“Is this Lebbon House?”
The old woman nodded.
“I like it here, but I don’t like it where those aunts are. Have you
seen those aunts, grannie?”
“I made them.”
“Why did you make them, grannie? I don’t fink they was very
nicely made, do you? I don’t fink their dresses was sewed on very
nicely, do you?”
“You’re an observant young woman, that’s what you are.”
“What is azervant?”
“Why, you have eyes in your head and see with them.”
“I see those gold stags,” said Letizia, pointing to the antelopes.
“Ah-ha, you see them, do you?”
“Did Santy Claus give them to you? He gived me a lamb and a
monkey and lots and lots of fings, so I aspeck he did.”
“I expect he did too. But they’re antelopes, not stags.”
“Auntylopes?” Letizia repeated dubiously. “Will Santy Claus put
gold aunts in your stocking at Christmas?”
“Mon dieu, I hope not,” the old lady exclaimed. “So you like
antelopes better than aunts?”
“Yes, I do. And I like puss-cats better. And I like all fings better
than I like aunts.”
“Well, then I’ll tell you something. When Santa Claus brought me
those antelopes, he said I was to give them to you.”
Letizia clapped her hands.
“Fancy! I fought he did, grannie.”
“So, if you’ll take them into the next room with Miss Young, she’ll
wrap them up for you while I’m talking to your mother.”
“How kind of you to give them to her,” said Nancy, from whose
eyes the silent tears had at last ceased to flow.
“Letizia darling, say ‘thank you’ to your kind grannie.”
“Senza complimenti, senza complimenti,” the old woman muttered,
“The pleasure in her eyes was all the thanks I wanted.”
“I aspeck they won’t feel very hungry wivout the apples and the
pears,” Letizia suggested anxiously.
“Of course they won’t, darling,” her mother interrupted quickly.
“You’d better wrap up some of the fruit as well, Emily,” said the old
lady with a chuckle.
“No, please ...” Nancy began.
“Hoity-toity, I suppose I can do what I like with my own fruit?” said
the old lady sharply. “Draw the curtains before you go, Emily.”
When Letizia had retired with Miss Young, and the gilded
antelopes and a generous handful of the wax fruit, the old lady bade
Nancy draw up one of the great Venetian chairs. When her
grandson’s wife was seated beside the bed, she asked her why she
had come to Brigham.
Nancy gave her an account of her struggles for an engagement
and told her about Bram’s death and that unuttered wish.
“He may have worried about your future,” said the old lady. “But it
was never his wish that Letizia should be brought up here. Never! I
know what that wish was.”
“You do?”
“He was wishing that he had become a Catholic. He used to write
to me about it, and I’m afraid I was discouraging. It didn’t seem to me
that there was any point in interrupting his career as a clown by
turning religious somersaults as well. I’m sorry that it worried his
peace at the last, but by now he is either at rest in an eternal
dreamless enviable sleep or he has discovered that there really is a
God and that He is neither a homicidal lunatic, nor a justice of the
peace, nor even a disagreeable and moody old gentleman. I used to
long to believe in Hell for the pleasure of one day seeing my late
husband on the next gridiron to my own; but now I merely hope that,
if there is another world, it will be large enough for me to avoid
meeting him, and that, if he has wings, an all-merciful God will clip
them and put him to play his harp where I shan’t ever hear the tune.
But mostly I pray that I shall sleep, sleep, sleep for evermore. And so
young Caleb objected to bring up my namesake? By the way, I’m
glad you’ve not shrouded her in black.”
“I knew Bram wouldn’t like it,” Nancy explained.
“I loved that boy,” said the old lady gently. “You made him happy.
And I can do nothing more useful than present his daughter with a
pair of gilded antelopes.” Her sharp voice died away to a sigh of
profound and tragic regret.
Nancy sat silent waiting for the old lady to continue.
“Of course, I could have written and warned you not to ask young
Caleb for anything,” she suddenly began again in her high incisive
voice. “But I wanted to see you. I wanted to see Letizia the second. I
must die soon. So I didn’t attempt to stop your coming. And, as a
matter of fact, you’ve arrived before I could have written to you. No,
don’t hand your child over to young Caleb, girl. Just on sixty-six
years ago my mother handed me over to old Caleb. I suppose she
thought that she was doing the best thing for me. Or it may have
been a kind of jealousy of my young life, who knows? Anyway she
has been dead too long to bother about the reason for what she did.
And at least I owe her French and Italian, so that with books I have
been able to lead a life of my own. Letizia would hear no French or
Italian in this house except from me. And even if I could count on a
few more years of existence, what could I teach that child? Nothing,
but my own cynicism, and that would be worse than nothing. No, you
mustn’t hand her over to young Caleb. That would be in a way as
wrong as what my mother did. Your duty is to educate her. Yes, you
must educate her, girl, you must be sure that she is taught well. She
seems to have personality. Educate her. She must not be stifled by
young Caleb and those two poor crones I brought into this world. It
would be a tragedy. I had another daughter, and I was not strong
enough in those days to secure her happiness. Perhaps I was still
hoping for my own. Perhaps in trying to shake myself free from my
husband I did not fight hard enough for her. She ran away. She went
utterly to the bad. She died of drink in a Paris asylum. Caterina
Fuller! You may read of her in raffish memoirs of the Second Empire
as one of the famous cocottes of the period. If my mother had not
married me to Caleb, I daresay I should have gone to the bad
myself. Or what the world calls bad. But how much worse my own
respectable degradation! It was only after Caterina’s death that I
ceased to lament my prison. It was as if the sentient, active part of
me died with her. Thence onward I lived within myself. I amused
myself by collecting bit by bit over many years the gewgaws by
which you see me surrounded. They represent years of sharp
practice in housekeeping. The only thing for which I may thank God
sincerely is that I wasn’t married to young Caleb. I should never have
succeeded in cheating him out of a penny on the household bills. I
should never have managed to buy a solitary novel, had he been my
accountant. I should have remained for ever what I was when I
married, raw, noisy, impudent, scatterbrained, until I died as a bird
dies, beating its wings against the cage. Educate Letizia, educate
her. I wish I had a little money. I have no means of getting any now. I
had some, but I spent it on myself, every penny of it. Don’t despair
because you’ve not had an engagement since Christmas. It’s only
early March. Mon dieu, I haven’t even a ring that you could pawn.
But I don’t worry about you. I’m convinced you will be all right. Easy
to say, yes. But I say it with belief, and that isn’t so easy. I shall live
on for a few weeks yet, and I know that I shall have good news from
you before I die.”
All the while the old lady had been talking, her face had been
losing its expression of cynicism, and by the time she had finished it
was glowing with the enthusiasm of a girl. It was as if she had beheld
reincarnate in little Letizia her own youth and as if now with the
wisdom of eighty-three years she were redirecting her own future
from the beginning. Presently, after a short silence, she told Nancy to
search in the bottom drawer of a painted cabinet for a parcel
wrapped up in brown paper, and bring it to her. With this she fumbled
for a while with her left hand and at last held up a tunic made
apparently of thick sackcloth and some fragments of stuff that looked
like a handful of cobwebs.
“The silk has faded and perished,” she murmured. “This was once
a pair of blue silk tights. I wore them when I made my descent down
that long rope from the firework platform. It was a very successful
descent, but my life has perished like this costume—all that part of it
which was not fireproof like this asbestos tunic: Take this miserable
heap of material and never let your daughter make such a descent,
however brightly you might plan the fireworks should burn, however
loudly you might hope that the mob would applaud the daring of her
performance, however rich and splendid you might think the costume
chosen for her. Yes, this wretched bundle of what seemed once such
finery represents my life. Wrap it up again and take it out of my sight
for ever, but do you, girl, gaze at it sometimes and remember what
the old woman who once wore it told you a few weeks before she
died.”
There was a tap at the door, and the elderly parlourmaid came in
to say that the fly for which Mr. Fuller had telephoned was waiting at
the door.
“Do you mean to say that Mr. Fuller hasn’t ordered the brougham
to take Mrs. Fuller to the station?” the old lady demanded angrily.
“I think that the horse was tired, ma’am,” said the elderly maid,
retreating as quickly as she could.
“I wish I had my legs. I wish I had both arms,” the old lady
exclaimed, snatching at the small handbell that stood on the table at
the left of the bed, and ringing it impatiently.
Miss Young brought Letizia back.
“Emily, will you drive down with my visitors to the station? I shan’t
need anything for the next hour.”
It was useless for Nancy to protest that she did not want to give all
this trouble. The old lady insisted. And really Nancy was very grateful
for Miss Young’s company, because it would have been dreary on
this cold March night to fade out of Brigham with such a humiliating
lack of importance.
“Good-bye, little Letizia,” said her great-grandmother.
“Good-bye, grannie. I’ve told my auntylopes about my lamb and
about my dog and about all my fings, and they wagged their tails and
would like to meet them very much they saided.”
On the way to the station Miss Young talked about nothing else
except Mrs. Fuller’s wonderful charm and personality.
“Really, I can hardly express what she’s done for me. I first came
to her when she was no longer able to read to herself. I happened to
know a little French, and since I’ve been with her I’ve learnt Italian.
She has been so kind and patient, teaching me. I used to come in
every afternoon at first, but for the last two years I’ve stayed with her
all the time. I’m afraid Mr. Fuller resents my presence. He always
tries to make out that I’m her nurse, which annoys the old lady
dreadfully. She’s been so kind to my little brother too. He comes in
two or three times a week, and sometimes he brings a friend. She
declares she likes the company of schoolboys better than any. She
has talked to me a lot about your husband, Mrs. Fuller. I thought that
she would die herself when she heard he had been killed like that.
And the terrible thing was that she heard the news from Mr. Fuller,
whom, you know, she doesn’t really like at all. He very seldom
comes up to her room, but I happened to be out getting her
something she wanted in Brigham, and I came in just as he had told
her and she was sitting up in bed, shaking her left fist at him, and
cursing him for being alive himself to tell her the news. She was
calling him a miser and a hypocrite and a liar, and I really don’t know
what she didn’t call him. She is a most extraordinary woman. There
doesn’t seem to be anything she does not know. And yet she has
often told me that she taught herself everything. It’s wonderful, isn’t
it? And her room! Of course, it’s very unusual, but, do you know, I
like it tremendously now. It seems to me to be a live room. Every
other room I go into now seems to me quite dead.”
And that was what Nancy was thinking when the dismal train
steamed out of Brigham to take Letizia and herself back to London,
that melancholy March night.
CHAPTER XV
THE TUNNEL
The only other occupant of the railway-carriage was a nun who sat
in the farther corner reading her breviary or some pious book. Letizia
soon fell fast asleep, her head pillowed on her mother’s lap, while
Nancy, watching the flaring chimneys in the darkness without, was
thinking of that old lady who had flared like them in the murk of
Lebanon House. After two hours of monotonous progress Letizia
woke up.
“Muvver,” she said, “I fink I’ve got a funny feeling in my tummy.”
“I expect you’re hungry, pet. You didn’t eat a very good tea.”
“It was such a crumby cake; and when I blowed some of the
crumbs out of my mouf, one of those aunts made a noise like you
make to a gee-gee, and I said, ‘Yes, but I’m not a gee-gee,’ and then
the plate what I was eating went out of the room on a tray.”
“Well, I’ve got a sponge cake for you here.”
Letizia worked her way laboriously through half the cake, and then
gave it up with a sigh.
“Oh, dear, everyfing seems to be all crumbs to-day.”
“Try some of the lemonade. Be careful, darling, not to choke,
because it’s very bubbly.”
Letizia made a wry face over the lemonade.
“It tastes like pins, muvver.”
The nun who overheard this criticism put down her book and said,
with a pleasant smile, that she had a flask of milk which would be
much better for a little girl than lemonade. She had, too, a small
collapsible tumbler, from which it would be easier to drink than from
a bottle.
“Is that a glass, muvver?” Letizia exclaimed. “I was finking it was a
neckalace.”
“Thank Sister very nicely.”
“Is that a sister?” Letizia asked incredulously.
The various relationships to which she had been introduced this
day were too much for Letizia, and this new one seemed to her even
more extraordinary than the collapsible metal tumbler. Nancy
explained to the nun that they had been making a family visit to
hitherto unknown relations in Brigham, to which the nun responded
by saying that she, too, had been making a kind of family visit
inasmuch as she had been staying in Lancashire at the mother
house of the Sisters of the Holy Infancy.
“Right out on the moors. Such a lovely position, though of course
it’s just a little bleak at this time of year.”
She had laid aside her pious book and was evidently glad to talk
for a while to combat the depression that nocturnal journeys
inevitably cast upon travellers in those days before corridors were at
all usual in trains. In those days a railway compartment seemed such
an inadequate shelter from the night that roared past in torrents of
darkness on either side of it. The footwarmers, glad though one was
of them, only made the chilly frost that suffused the upper portion of
the carriage more blighting to the spirit. The dim gaslit stations
through which the train passed, the clangour of the tunnels, the
vertical handle of the door which at any moment, it seemed, might
become horizontal and let it swing open for the night to rush through
and sweep one away into the black annihilation from which the train
was panting to escape, the saga of prohibitions inscribed above the
windows and beneath the rack which gradually assumed a
portentous and quasi-Mosaic significance—all these menacing,
ineluctable impressions were abolished by the introduction of the
corridor with its assurance of life’s continuity.
Nancy told the nun that she was a Catholic, and they talked for a
time on conventional lines about the difficulty of keeping up with
one’s religious duties on tour.
“But I do hope that you will go on trying, my dear,” said the nun.
The young actress felt a little hypocritical in allowing her
companion to presume that until this date she had never
relinquished the struggle. Yet she was not anxious to extend the
conversation into any intimacy of discussion, nor did she want the
nun to feel bound by her profession to remonstrate with her for past
neglect. So instead of saying anything either about the past or the
future, she smiled an assent.
“You mustn’t let me be too inquisitive a travelling companion,” said
the nun, “but I notice that you’re in deep mourning. Have you lost
some one who was very dear to you?”
“My husband.”
The nun leaned over and with an exquisite tenderness laid her
white and delicate hand on Nancy’s knee.
“And you have only this little bright thing left?” she murmured.
Letizia had been regarding the nun’s action with wide-eyed
solemnity. Presently she stood up on the seat and putting her arms
round her mother’s neck, whispered in her ear:
“I fink the lady tied up with a handkie is nice.”
“You have conquered Letizia’s heart,” said Nancy, smiling through
the tears in her eyes.
“I’m very proud to hear it. I should guess that she wasn’t always an
easy conquest.”
“Indeed, no!”
“Letizia?” the nun repeated. “What a nice name to own! Gladness!”
“You know Italian? My husband’s grandmother was Italian. I often
wish that I could speak Italian and teach my small daughter.”
“What is Italian, muvver?” Letizia asked.
“Italian, Letizia,” said the nun, “is the way all the people talk in the
dearest and most beautiful country in the world. Such blue seas, my
dear, such skies of velvet, such oranges and lemons growing on the
trees, such flowers everywhere, such radiant dancing airs, such
warmth and sweetness and light. I lived in Italy long ago, when I was
young.”
Nancy looked up in amazement as the nun stopped speaking, for
her voice sounded fresh and crystalline as a girl’s, her cheeks were
flushed with youth, her eyes were deep and warm and lucent as if
the Southern moon swam face to face with her in the cold March
night roaring past the smoky windows of the carriage. Yet when
Nancy looked again she saw the fine lines in the porcelain-frail face,
and the puckered eyelids, and middle-age in those grave blue eyes.
In Italy, then, was written the history of her youth, and in Italy the
history of her love, for only remembered love could thus have
transformed her for a fleeting instant to what she once was. At that
moment the train entered a tunnel and went clanging on through
such a din of titanic anvils that it was impossible to talk, for which
Nancy was grateful because she did not want Letizia to shatter the
nun’s rapture by asking questions that would show she had not
understood a great deal about Italy or Italian. Presently the noise of
the anvils ceased, and the train began to slow down until at last it
came to a stop in a profound silence which pulsed upon the inner ear
as insistently as a second or two back had clanged those anvils. The
talk of people in the next compartment began to trickle through the
partition, and one knew that such talk was trickling all the length of
the train, and that, though one could not hear the words through all
the length of the train, people were saying to one another that the
signals must be against them. One felt, too, a genuine gratitude to
those active and vigilant signals which were warning the train not to
rush on through that din of anvils to its doom.
And then abruptly the lights went out in every single compartment.
The blackness was absolute. People put up windows and looked out
into the viewless tunnel, until the vapours drove them back within.
Now down the line were heard hoarse shouts and echoes, and the
bobbing light of the guard’s lamp illuminated the sweating roof of the
tunnel as he passed along to interview the engine driver. In a few
minutes he came back, calling out, “Don’t be frightened, ladies and
gentlemen, there’s no danger.” Heads peered out once more into the
mephitic blackness, and the word went along that there had been a
breakdown on the line ahead and that their lighting had by an
unfortunate coincidence broken down as well. Everybody hoped that
the signals behind were as vigilant as those in front and that the red
lamps were burning bright to show that there was danger on the line.
“I aspeck the poor train wanted a rest, muvver,” said Letizia. “I
aspeck it was sleepy because it was out so late.”
“I know somebody else who’s sleepy.”
“P’r’aps a little bit,” Letizia admitted.
“Dear me, she must be tired,” her mother said across the darkness
to the nun. “Well, then, put your head on my lap, old lady, and go
right off to sleep as soon as ever you can.”
For some time the two grown-ups in the compartment sat in
silence while the little girl went to sleep. It was the nun who spoke
first.
“I wonder whether it will disturb her if we talk quietly? But this utter
blackness and silence is really rather dispiriting.”
“Oh, no, Sister, we shan’t disturb her. She’s sound asleep by now.”
“Does she always travel with you when you’re on tour?” the nun
asked.
“Until now she has. You see, my husband only died at Christmas
and we were always together with her. I am a little worried about the
future, because I can’t afford to travel with a nurse and landladies
vary and of course she has to be left in charge of somebody.”
“Yes, I can understand that it must be a great anxiety to you.”
Nancy thought how beautiful the nun’s voice sounded in this
darkness. While the train was moving, she had not realised its
quality, but in the stillness now it stole upon her ears as magically as
running water or as wind in pine-tree tops or as any tranquil and
pervasive sound of nature. In her mind’s eye she was picturing the
nun’s face as it had appeared when she was speaking of Italy, and
she was filled with a desire to confide in her.
“That is really the reason I’ve been to Brigham,” Nancy said. “I
thought that I ought to give my husband’s relations the opportunity of
looking after Letizia. Not because I want to shirk the responsibility,”
she added quickly. “Indeed I would hate to lose her, but I did feel that
she ought to have the chance of being brought up quietly. My own
mother died when I was very young, and my father who is on the
stage allowed me to act a great deal as a child, so that really I didn’t
go to school till I was over twelve, and it wasn’t a very good school,
because I was living in Dublin with an aunt who hadn’t much money.
Indeed I never really learnt anything, and when I was sixteen I went
back to the stage for good. I’m only twenty-four now. I look much
older, I think.”
“I shouldn’t have said that you were more than that,” the nun
replied. “But how terribly sad for you, my dear, to have lost your
husband so young. Many years ago before I became a nun I was
engaged to be married to a young Italian, and he died. That was in
Italy, and that is why I still always think of Italy as the loveliest
country and of Italian as the most beautiful language. But you were
telling me about your relations in Brigham.”
Nancy gave an account of her visit, and particularly of the
interview with Letizia’s great-grandmother.
“I think the old lady was quite right. I cannot imagine that bright
little sleeping creature was intended to be brought up in such
surroundings. Besides, I don’t think it is right to expose a Catholic
child to Protestant influences. Far better that you should keep her
with you.”
“Yes, but suppose I cannot get an engagement? As a matter of
fact, I have only a pound or two left, and the prospect is terrifying
me. I feel that I ought to have gone on acting at Greenwich. But to
act on the very stage on which my husband had died in my arms! I
couldn’t. I simply couldn’t have done it.”
“My dear, nobody would ever dream of thinking that you could. It’s
cruel enough that you should have to act on any stage at such a
time. However, I feel sure that you will soon get an engagement.
Almighty God tries us in so many ways—ways that we often cannot
understand, so that sometimes we are tempted to question His love.
Be sure that He has some mysterious purpose in thus trying you
even more hardly. Nobody is worth anything who cannot rise above
suffering to greatness of heart and mind and soul. Do not think to
yourself that a foolish old nun is just trying to soothe you with the
commonplaces of religious consolation. To be sure, they are
commonplaces that she is uttering, but subtleties avail nothing until
the truth of the great commonplaces has been revealed to the
human soul. Our holy religion is built up on the great commonplaces.
That is why it is so infinitely superior to the subtleties of proud and
eccentric individuals as encouraged by Protestantism. What a long
time we are waiting in this darkness! Yet we know that however long
we have to wait we shall sometime or other get out of this tunnel.”
“Yes, but if we wait much longer,” said Nancy, “I will have another
problem to face when we get to London, for I will never dare arrive
back at my present landlady’s too late.”
“I can solve that problem for you, at any rate,” said the nun. “I shall
be met at Euston by a vehicle, and I know that our guest-room is free
to-night. So don’t let your night’s lodging worry you.”
After this they sat silent in the darkness for a long time. The
presence of the nun filled Nancy with a sense of warm security and
peace of mind. Gradually it seemed to her that this wait in the tunnel
was a perfect expression of the dark pause in her life, which,
beginning with the death of Bram, had ended in her visit to Brigham.
A conviction was born in her brain, a conviction which with every
minute of this immersion in absolute blackness became stronger,
that somehow the presence of the nun was a comforting fact, the
importance of which was not to be measured by her importance
within the little space of the railway-carriage, but that the existence of
this nun was going to influence the whole of her life, which must
soon begin again when the train emerged from the tunnel. The
curtain would rise once more upon the pantomime, and, whatever
the vicissitudes that she as the heroine of it might have to endure,
there would always be a Fairy Queen waiting in the wings to enter
and shake her silver wand against the powers of Evil. It was very
childish and sentimental to be sitting here in the dark dreaming like
this, Nancy kept telling herself; but then once more the mystery of
the tunnel would enfold her as one is enfolded by those strange half-
sleepy clarities of the imagination that flash through the midway of
the night when one lies in bed and hopes that the sense of
illumination that is granted between a sleep and a sleep will return
with daylight to illuminate the active life of the morning. Her thoughts
about the nun reassumed their first portentousness; the comparison
of her own life to a pantomime appeared once more with the
superlative reality of a symbol that might enshrine the whole
meaning of life. Then suddenly the lights went up, and after a few
more minutes the train was on its way again.
Nancy was glad indeed on arriving at Euston toward two o’clock of
a frore and foggy night to drive away with Sister Catherine in the
queer conventual vehicle like a covered-in wagonette with four small
grilled windows. To have argued with Miss Fewkes about her right to
enter the tall thin house in Blackboy Passage at whatever hour she
chose would have been the climax to the Brigham experience.
The Sisters of the Holy Infancy were a small community which was
founded by one of several co-heiresses to a thirteenth-century
barony by writ, dormant for many centuries. Instead of spending her
money on establishing her right to an ancient title Miss Tiphaine de
Cauntelo Edwardson preferred to endow this small community and
be known as Mother Mary Ethelreda. The headquarters of the
community were at Beaumanoir where Sister Catherine, the right-
hand of the now aged foundress, had been visiting her. This was a
Lancashire property which had formerly been held by Miss
Edwardson’s ancestors and repurchased by her when she decided
to enter the religious life. In London the house of the community was
situated in St. John’s Wood where the Sisters were occupied in the
management of an extremely good school. There was a third house
in Eastbourne which was used chiefly as a home for impoverished
maiden ladies.
Sister Catherine was head-mistress of St. Joseph’s School, and it
was there that she took Nancy and Letizia from Euston. The
porteress was overjoyed to see her, having been working herself up
for the last two hours into a panic over the thought of a railway
accident. The white guest-room was very welcome to Nancy after
the fatigue of this long day, so long a day that she could not believe
that it had only been fifteen hours ago that she set out from Euston
to Brigham. She seemed to have lived many lives in the course of it
—Bram’s life as a boy with his brother, old Mrs. Fuller’s eighty years
of existence, Sister Catherine’s bright youth in Italy, and most
wearingly of all, Letizia’s future even to ultimate old age and death.
And when she did fall asleep she was travelling, travelling all the
time through endless unremembered dreams.
In the morning Letizia greatly diverted some of the nuns by her
observations on the image of the Holy Child over the altar, which
was a copy of the famous image of Prague.
“Muvver, who is that little black boy with a crown on His head?”
“That is the baby Jesus, darling.”
“Why is He dressed like that? Is He going out to have tea with one
of His little friends?”
Nancy really did not know how to explain why He was dressed like
that, but hazarded that it was because He was the King of Heaven.
“What has He got in His hand, muvver? What toy has He got?”
“That’s a sceptre, and a thing that kings hold in their hands.”
“Are you quite sure that He is the baby Jesus, muvver?” Letizia
pressed.
“Quite sure, darling.”
“Well, I don’t fink he is. I fink he’s just a little friend of the baby
Jesus, who He likes very much and lets him come into His house
and play with His toys, but I don’t fink that little black boy is the baby
Jesus. No, no, no, no, no!” she decided, with vigorous and repeated
shakes of the head.
Nancy was sorry when they had to leave St. Joseph’s School and
return to Blackboy Passage.
“I fink here’s where the little friend lives,” Letizia announced.
“Oh, darling, you really mustn’t be so terribly ingenious. You quite
frighten me. And what am I going to do about you next week when
the dear Kinos will be gone?”
CHAPTER XVI
BLACKBOY PASSAGE
As Nancy had anticipated, Miss Fewkes was more than doubtful
about her ability to keep an eye on Letizia while her mother was
haunting the offices of theatrical agents.
“I’m not really at all used to children,” she sniffed angrily.
“Supposing if she was to take it into her silly little head to go and
jump out of the window? There’s no knowing what some children
won’t do next. Then of course you’d blame me. I’ve always been
very nervous of children. I could have been married half-a-dozen
times if I hadn’t have dreaded the idea of having children of my own,
knowing how nervous they’d be sure to make me.”
“I wondered if perhaps Louisa might be glad to keep an eye on
her, that is, of course, if you’d let me give her a little present. It
probably won’t be for more than a week.” It certainly wouldn’t, Nancy
thought, at the rate her money was going, for she could not imagine
herself owing a halfpenny to Miss Fewkes. And even that little
present to Louisa, the maid-of-all-work, would necessitate a first visit
to the nearest pawnbroker.
“Louisa has quite enough to do to keep her busy without looking
after the children of my lodgers,” the landlady snapped.
Poor Louisa certainly had, Nancy admitted to herself guiltily, at the
mental vision of the overworked maid toiling up and downstairs all
day at Miss Fewkes’s behest.
“I don’t see why you don’t take her out with you,” said the landlady
acidly.
“Oh, Miss Fewkes, surely you know something of theatrical
agents!” Nancy exclaimed. “How could I possibly drag Letizia round
with me? No, I’ll just leave her in my room. She’ll be perfectly good,
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookultra.com

You might also like