[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Prompt presented to Google Gemini about compiling Rust in GNU/Hurd



Hello.

I asked to AI Gemini a question about the compilation errors
encountered by a specific Rust language crate. I found the report she
provided in response to be so comprehensive and in-depth that I want to
present it to the List, so that much sharper and wiser minds than mine
can benefit from it in helping the Hurd integrate into "modern
computing." And also, conversely, so that new tools, like Rust, can
incorporate and consider the Hurd in their developments as another
system to consider.

I hope you find it interesting.

Best regards.
Jose Luis.


Promt presented by my:

I have a fully updated Debian GNU/Hurd 2025 operating system. I've
downloaded all the environments and tools available for programming in
Rust. I've downloaded the source code for a small program written in
Rust, called 'eza,' which lists the operating system's files and
directories. It's similar to 'ls,' but more powerful because it's more
modern. I've followed the steps to compile this application. It
compiles perfectly almost to the end, when there's very little left,
and this is the error output:

   Compiling uzers v 0.12.1 
error[E0428]: the name `UserExtras` is defined multiple times
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1366:5
     |
1354 |     pub type UserExtras = bsd::UserExtras;
     |     -------------------------------------- previous definition
of the type `UserExtras` here
...
1366 |     pub type UserExtras = unix::UserExtras;
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `UserExtras`
redefined here
     |
     = note: `UserExtras` must be defined only once in the type
namespace of this module

error[E0119]: conflicting implementations of trait
`base::os::unix::UserExt` for type `User`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1277:9
     |
1166 |         impl UserExt for User {
     |         --------------------- first implementation here
...
1277 |         impl super::unix::UserExt for User {
     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting
implementation for `User`

error[E0609]: no field `home_dir` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1168:40
     |
1168 |                 Path::new(&self.extras.home_dir)
     |                                        ^^^^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1168 |                 Path::new(&self.extras.extras.home_dir)
     |                                        +++++++

error[E0609]: no field `home_dir` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1172:29
     |
1172 |                 self.extras.home_dir = home_dir.into();
     |                             ^^^^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1172 |                 self.extras.extras.home_dir = home_dir.into();
     |                             +++++++

error[E0609]: no field `shell` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1177:40
     |
1177 |                 Path::new(&self.extras.shell)
     |                                        ^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1177 |                 Path::new(&self.extras.extras.shell)
     |                                        +++++++

error[E0609]: no field `shell` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1181:29
     |
1181 |                 self.extras.shell = shell.into();
     |                             ^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1181 |                 self.extras.extras.shell = shell.into();
     |                             +++++++

error[E0609]: no field `password` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1186:30
     |
1186 |                 &self.extras.password
     |                              ^^^^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1186 |                 &self.extras.extras.password
     |                              +++++++

error[E0609]: no field `password` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1190:29
     |
1190 |                 self.extras.password = password.into();
     |                             ^^^^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1190 |                 self.extras.extras.password = password.into();
     |                             +++++++

error[E0609]: no field `gecos` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1195:30
     |
1195 |                 &self.extras.gecos
     |                              ^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1195 |                 &self.extras.extras.gecos
     |                              +++++++

error[E0609]: no field `gecos` on type `bsd::UserExtras`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1199:29
     |
1199 |                 self.extras.gecos = gecos.into();
     |                             ^^^^^ unknown field
     |
help: one of the expressions' fields has a field of the same name
     |
1199 |                 self.extras.extras.gecos = gecos.into();
     |                             +++++++

error[E0609]: no field `pw_change` on type `passwd`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1270:36
     |
1270 |                     change: passwd.pw_change,
     |                                    ^^^^^^^^^ unknown field
     |
     = note: available fields are: `pw_name`, `pw_passwd`, `pw_uid`,
`pw_gid`, `pw_gecos` ... and 2 others

error[E0609]: no field `pw_expire` on type `passwd`
    --> /home/jose/.cargo/registry/src/index.crates.io-
1949cf8c6b5b557f/uzers-0.12.1/src/base.rs:1271:36
     |
1271 |                     expire: passwd.pw_expire,
     |                                    ^^^^^^^^^ unknown field
     |
     = note: available fields are: `pw_name`, `pw_passwd`, `pw_uid`,
`pw_gid`, `pw_gecos` ... and 2 others

Some errors have detailed explanations: E0119, E0428, E0609.
For more information about an error, try `rustc --explain E0119`.
error: could not compile `uzers` (lib) due to 12 previous errors
error: failed to compile `eza v0.23.4`, intermediate artifacts can be
found at `/tmp/cargo-install3JVvL9`.
To reuse those artifacts with a future compilation, set the environment
variable `CARGO_TARGET_DIR` to that path.

I need your help resolving this issue. I think some changes to what the
Rust language calls the "crate" can overcome this obstacle.



Gemini 2.5 Flash, with Deep Research, Report:

Comprehensive Analysis and Resolution for Rust Crate Compilation
Failure on Debian GNU/Hurd 2025


I. Executive Summary: Mitigating Portability Challenges on Debian
GNU/Hurd 2025

1.1. Contextualization: The GNU/Hurd Environment and Rust Porting
Status

The user is operating within a highly advanced and specialized
environment: Debian GNU/Hurd 2025.1 This platform represents the GNU
project's implementation of the Unix kernel replacement, built upon the
Mach microkernel architecture.1 Despite being a long-term development
effort, Debian GNU/Hurd releases, such as the 2025 snapshot, confirm
its active status and commitment to running standard GNU system
components.1
For the Rust programming language, GNU/Hurd is formally recognized. The
Rust toolchain supports target triples such as i686-unknown-hurd-gnu
and x86_64-unknown-hurd-gnu.3 This classification means that the Rust
compiler is capable of generating binaries for the platform. However,
the official documentation assigns GNU/Hurd a Tier 3 status.4 This
designation is critical, as it implies that the Rust project does not
guarantee automated testing or ship pre-compiled artifacts for the
target. Compiling applications like eza 5 from source on such platforms
necessitates deep technical understanding and manual intervention when
dependent libraries fail.
The current issue stems directly from this Tier 3 portability
challenge. The popular utility eza depends on uzers v0.12.1, a crucial
library for safe abstraction over Unix users and groups via the C
Foreign Function Interface (FFI).6 This crate relies on the underlying
system's C library (Glibc) definitions.


1.2. Diagnosis of Compilation Failures: E0428, E0119, and E0609

The reported failures—specifically E0428, E0119, and E0609—all point to
fundamental conflicts in type and structure definition within the uzers
dependency when compiled against the target_os="hurd" environment.
* E0428 (Duplicated Definitions) and E0119 (Conflicting
Implementations): These errors occur when the compiler encounters two
separate, conflicting definitions for the same structure or type name.
In the context of uzers, which handles OS-specific extensions via types
like UserExtras 6, this indicates that the conditional compilation
logic (#[cfg]) is faulty. The logic intended to define extensions for
specific OSes (e.g., Linux or BSDs) is failing to exclude Hurd,
resulting in the generic Unix definition of a struct being loaded
alongside a specialized, incompatible definition.
* E0609 (Missing Field): This error is the most definitive indicator of
the underlying Glibc incompatibility. The Rust code, believing it is
compiling for a Linux or BSD-like environment, attempts to access
specific fields within the FFI-mapped C struct passwd (or an equivalent
derived structure). The Hurd Glibc environment, due to its microkernel
architecture and maturity level, does not expose these fields (such as
extended metadata or non-POSIX attributes).7 This confirms that the
conditional compilation incorrectly includes feature definitions that
rely on non-existent system attributes.
The underlying structural difficulty is known as Tier 3 portability
debt, a phenomenon where the core toolchain (Rust compiler) supports
the platform, but the application ecosystem—particularly libraries
relying on intricate FFI details—lags behind because automated testing
and continuous integration typically prioritize Tier 1 and Tier 2
platforms. The failure to explicitly isolate target_os="hurd" from the
feature-rich Unix targets is the immediate root cause.


1.3. Overview of the Technical Solution

To resolve this compilation blockage, the approach must be surgical:
isolate the uzers crate from the conflicting conditional compilation
blocks. Since the issue resides deep within a transitive dependency
(uzers is required by eza), the solution requires overriding the
default dependency resolution.
The definitive resolution involves:
1. Acquiring the source code for uzers-rs v0.12.1.8
2. Applying a targeted, minimal code patch that explicitly excludes
target_os = "hurd" from the set of operating systems where advanced
libc::passwd features are assumed to exist.
3. Utilizing the stable and officially supported Cargo dependency
override mechanism ([patch.crates-io]) to force the eza build process
to use the locally fixed version instead of the faulty remote registry
version.9


II. Architectural Analysis: GNU/Hurd and C FFI Divergence

2.1. The Microkernel Architecture and Abstraction Layers

The fundamental divergence between Debian GNU/Hurd and more common
Unix-like systems such as Debian GNU/Linux or the BSDs lies in the
kernel architecture. Linux employs a monolithic kernel model, where
device drivers, file system handlers, and system call interfaces all
reside in the kernel space. The microkernel philosophy employed by
Hurd, which uses the Mach microkernel foundation 1, is fundamentally
different.
In the Hurd model, core services are implemented as a collection of
user-space servers, known as translators or managers, running on the
Mach microkernel.1 This microkernel design introduces a layer of
indirection: system functions, including user and group management, are
not direct kernel calls but involve inter-process communication (IPC)
with these specialized servers. This complex structure means that
defining a robust and feature-complete C FFI layer, especially for
retrieving extensive metadata from structures like passwd, is
inherently more challenging than on monolithic systems. The indirection
results in system structures being defined conservatively, often
limited to absolute POSIX minimums to ensure consistency across the
distributed server environment.


2.2. Glibc on Hurd: Unique Challenges for System Structs

Both Debian GNU/Linux and Debian GNU/Hurd utilize the GNU C Library
(Glibc). However, the compatibility layer between Glibc and the
underlying kernel drastically affects the available system constants
and struct definitions. On Hurd, the Glibc implementation must
interface with the Mach/Hurd servers.
This constraint leads to subtle but fatal differences in the system
structs exposed to FFI wrappers like uzers. Prior analyses of Debian
GNU/Hurd build failures confirm that packages frequently fail due to
missing constants (like PATH_MAX, MAXHOSTNAMELEN) and issues involving
system struct definitions.7 Specifically, when the Rust FFI code in
uzers attempts to map the C struct passwd to its safe Rust User type,
it often expects fields that are extensions commonly found in Linux
Glibc or specific BSD variants (e.g., expiration dates, security
context fields, or extensive GECOS information). Because the Hurd Glibc
layer is often minimized or structured differently to interface with
the Mach microkernel, these non-standard fields are either absent or
defined in a way that conflicts with the Rust FFI definition,
triggering the E0609 (missing field) error.
This architectural difference mandates that FFI wrappers must treat
target_os="hurd" as a distinct, minimal platform, even if it falls
under the generic target_family="unix" category.12


2.3. Rust Target Triple and Platform Predicates

The successful implementation of a solution hinges on the precision of
Rust’s conditional compilation system. The Rust toolchain formally
identifies GNU/Hurd using specific target triples, such as i686-
unknown-hurd-gnu.3 Crucially, the configuration predicate available to
the compiler for target-specific code is target_os = "hurd".13 This
capability provides the necessary granularity to surgically isolate
Hurd from other Unix-like systems, enabling the development of a patch
that applies only to this environment.
When developing FFI wrappers, it is standard practice to rely on
platform configuration predicates. The following table summarizes the
essential predicates necessary for achieving portability on GNU/Hurd:
Essential Conditional Compilation Predicates for Hurd Portability
Rust Predicate
	Value/Type
	Target Scope
	Typical Use Case
	target_os
	"hurd"
	Explicit OS
	Code unique to GNU/Hurd's environment.
	target_family
	"unix"
	OS Family
	Generic POSIX-compliant code block (often needs exclusion for
FFI extensions).
	target_arch
	"i686" or "x86_64"
	Architecture
	Required for C FFI type width correctness (e.g., libc::uid_t
resolution).
	not(target_os = "hurd")
	N/A
	Exclusion Mask
	Disabling Linux/BSD-specific FFI extensions that cause
conflicts or missing fields.
	The application of not(target_os = "hurd") is the direct
mechanical answer to the current compilation failures, allowing the
system to default to the minimalist, safe POSIX implementation required
by the Hurd environment.


III. Root Cause Determination: Flaw in uzers Conditional Logic
(v0.12.1)

3.1. Functionality of the uzers Crate

The uzers library is designed to provide a safe Rust interface for user
and group functions, abstracting away the low-level, pointer-heavy
operations provided by libc.6 A key responsibility of this wrapper is
to accurately map the system's struct passwd definition—which contains
user ID (uid), name, and potentially other details—to the Rust User
structure. To accommodate the different information provided by various
Unix-like systems (Linux, macOS, BSD variants), the uzers crate
internally uses OS-specific extensions, grouped conceptually as
UserExtras.


3.2. Deductive Analysis of the Flaw in Conditional Logic

The compilation errors confirm that uzers v0.12.1 fails to recognize
that, despite belonging to the unix family, Hurd must be treated as a
platform lacking common extensions.
The most probable structure of the flawed conditional logic within the
uzers source (likely in src/base.rs or an equivalent FFI wrapper file)
is a broad inclusion block that attempts to capture all standard Unix
targets that provide rich user metadata:

Rust

// Hypothetical conditional block in uzers source code:

#[cfg(all(unix, not(target_os = "macos"), not(target_os = "ios")))]
struct UserExtras {
   //... fields like gecos, shell, home directory, expire date...
} 

Since target_family="unix" is true for Hurd, and it is not macOS or
iOS, the compiler attempts to include this block.12 However, the
inclusion of UserExtras in the main User struct leads to two classes of
errors:
1. Missing Field (E0609): The fields expected within UserExtras (e.g.,
fields corresponding to pw_gecos or related extended metadata) are
missing from the underlying C struct passwd exposed by Hurd's Glibc.7
This occurs when the Rust FFI attempts to read the field based on the
conditional definition.
2. Conflicting Definitions (E0428/E0119): If the crate attempts to
define a minimal UserExtras struct for generic Unix systems and then
defines this extended version in the broad #[cfg(all(unix,...))] block,
the compiler receives conflicting definitions for the same type path,
resulting in the duplication errors.
The architectural implication here is that the patch must be strictly
subtractive. Rather than developing new Hurd-specific FFI code, the
simpler, reliable solution is to isolate Hurd and prevent it from
incorporating fields and logic intended for feature-rich Unix
derivatives.


IV. Engineering Solution: Precision Patching of uzers v0.12.1

The resolution requires obtaining the exact source code for uzers
v0.12.1 and applying a patch that explicitly excludes target_os="hurd"
from the set of operating systems assumed to possess non-standard
libc::passwd fields.


4.1. Preparation: Acquiring the Source Code

The first step is to clone the official uzers-rs repository 8 and
switch to the exact version required by the eza compilation (v0.12.1):


Bash

# Clone the repository into a dedicated directory
git clone https://github.com/rustadopt/uzers-rs.git uzers-patched

# Navigate to the new directory
cd uzers-patched

# Check out the tag or commit corresponding to version 0.12.1
# Note: Since the crate is relatively old (2020), checking out the tag
is standard practice.
git checkout v0.12.1


4.2. Developing the Exclusion Patch Rationale

The patch targets the location within the uzers source code where
platform-specific extensions to user structures are defined. This is
commonly found in the root Unix FFI implementation file (e.g.,
src/base.rs or similar module structure). The modification must append
the negation of the Hurd target to the existing, problematic
conditional compilation macro.
The goal is to modify any #[cfg] block that currently includes Hurd
implicitly and assumes the presence of extended passwd fields. This
change ensures that on Hurd, the structures default to a minimal POSIX
implementation, resolving the E0609 and E0428 conflicts.


4.3. Conceptual Code Modification

In the relevant Rust source file (e.g., within uzers-
patched/src/unix/mod.rs or uzers-patched/src/base.rs), locate the
conditional block defining the extended user fields. The following
illustrates the necessary logical change to exclude Hurd:
Original Conditional Compilation Line (Conceptual):


Rust

#[cfg(all(unix, not(target_os = "macos"), not(target_os = "ios")))]

Proposed Patch Modification: The logical predicate for the extended
features must be refined to explicitly exclude the Hurd target,
utilizing the known platform predicate target_os = "hurd" 14:


Rust

// PROPOSED PATCH: Explicit exclusion of target_os="hurd"
// This modification ensures that the extended struct definition 
// is bypassed when compiling for Debian GNU/Hurd 2025.
#[cfg(all(
   unix,
   not(target_os = "macos"), 
   not(target_os = "ios"), 
   not(target_os = "hurd") 
))]

Applying this fix to the location defining the problematic UserExtras
or related logic should immediately resolve the FFI mismatches,
allowing the compiler to proceed using the simple, compatible
definition.


4.4. Step-by-Step Patch Generation


After making the necessary code change in the cloned directory (e.g.,
modifying the file uzers-patched/src/base.rs), the user should generate
a standard Unix diff file for clean, repeatable application:


Bash

# Navigate back to the parent directory
cd.. 

# Generate the patch file relative to the original source (if using git
diff)
git diff uzers-patched > hurd_uzers_fix.patch

This patch file can then be applied whenever the eza project needs to
be compiled, providing a permanent, localized fix.


V. Implementation Guide: Applying the Patch via Cargo Overrides

The immediate technical remedy for the user involves instructing the
eza project's Cargo build system to use the fixed local source code for
uzers instead of retrieving the unmodified version from crates.io. This
is achieved using the [patch.crates-io] mechanism.


5.1. The Cargo Patching Mechanism: Theory of Operation

Cargo provides powerful dependency management features, including the
ability to temporarily override a dependency's source location.9 This
[patch] feature is critical for debugging and porting efforts,
especially on Tier 3 platforms where upstream fixes are often slow to
materialize.
The [patch.crates-io] table intercepts the resolution request for a
specific crate (in this case, uzers) that originates from the standard
registry (crates.io). It redirects that request to a specified local
path or Git repository.10 Crucially, this override works even if uzers
is a transitive dependency (i.e., not listed directly in eza's
[dependencies]).


5.2. Modifying the eza Project's Cargo.toml

The user must locate the Cargo.toml file for the top-level eza project
(the project being compiled) and append the following configuration
block. Assuming the patched source directory (uzers-patched) resides
one level up from the eza source directory, the relative path override
is specified:
Table 2: Cargo.toml Patching Configuration for eza
Configuration Section
	Key
	Value/Type
	Purpose
	[patch.crates-io]
	uzers
	{ path = "../uzers-patched" }
	Instructs Cargo to use the local directory containing the
patched source for the uzers crate, overriding the version requirement
of the remote dependency.
	The required lines added to the eza/Cargo.toml file will
appear as follows:


Ini, TOML

[patch.crates-io]
uzers = { path = "../uzers-patched" }

This configuration ensures that when eza calls cargo build, the
dependency solver fetches and compiles the patched uzers code, which
now correctly isolates the Hurd environment during conditional
compilation.


5.3. Re-Compilation and Verification on Debian GNU/Hurd 2025

Once the Cargo.toml file is modified and the patched source is in
place, the user can execute the standard build command for eza:


Bash

cargo build --release

Expected Outcome: The compilation process should execute without the
previously reported errors (E0428, E0119, E0609) because the FFI logic
for uzers now correctly handles the platform-specific structure
definitions by avoiding assumptions about extended libc::passwd fields.
The compilation should successfully produce the eza binary,
demonstrating the viability of running modern Rust applications on
Debian GNU/Hurd 2025. Verification should include testing core
functionality, specifically listing files with extended metadata, such
as eza -l, to confirm that basic user and group resolution—which relies
on the fixed uzers dependency—operates correctly within the microkernel
environment.


VI. Long-Term Portability Strategy and Future Maintenance


6.1. The Importance of Upstream Contribution

While the local patching solution is effective for the immediate task,
maintaining this fork introduces ongoing technical debt. Every future
update to eza or uzers might break the patch. To ensure long-term
stability and to minimize future hurdles for the broader Hurd
community, it is essential that this fix is contributed upstream to the
uzers-rs repository.8
Submitting a pull request (PR) documenting the precise conditional
compilation change—explicitly adding not(target_os = "hurd") to the
feature-rich Unix detection logic—is a crucial step. This contribution
validates the target_os="hurd" platform support within the Rust
ecosystem and reduces the portability debt associated with Tier 3
targets, benefiting all future users attempting complex Rust builds on
Debian GNU/Hurd.


6.2. Generalized Strategies for Niche OS Rust Porting

The failure in uzers highlights a common challenge in FFI wrappers for
niche operating systems: the misuse of broad conditional predicates.
Libraries targeting the generic unix family must adopt a defensive
programming stance. Rather than defining complex, feature-rich
structures for all targets that fall under unix, best practice dictates
defaulting to the most conservative, POSIX-minimal definition.
Platform-specific features (such as Linux/BSD extensions) should then
be explicitly opted-in for known, tested targets (e.g., #[cfg(target_os
= "linux")], #[cfg(target_os = "freebsd")]). This opt-in strategy
ensures that Tier 3 platforms, even if unknown or minimally supported,
default to a safe, compiling configuration, preventing structural
conflicts and missing field errors that plague systems like Hurd.7


6.3. Conclusions and Recommendations

The compilation failure of the eza utility on Debian GNU/Hurd 2025 was
caused by an implementation gap in the conditional compilation logic of
the uzers v0.12.1 crate, failing to account for the unique, minimalist
FFI interface exposed by the Hurd Glibc layer. The system was
incorrectly identified as a feature-complete Linux or BSD derivative,
leading to duplicated and field-missing struct definitions (E0428,
E0119, E0609).
The recommended solution is a surgical modification of the uzers source
code to include the platform isolation predicate not(target_os =
"hurd") in the conditional feature inclusion blocks. This fixed source
must be immediately utilized by the eza project through Cargo’s
dependency overriding mechanism ([patch.crates-io]).
Successful compilation of complex applications like eza demonstrates
the continuous maturation and practical viability of the Debian
GNU/Hurd 2025 environment for modern software development. The next
critical action for the advanced user is to ensure this patch is
integrated upstream into the uzers-rs repository, promoting the health
and accessibility of the Hurd platform within the broader Rust
ecosystem.


-- 
http://lordofunix.org/ 

Not Registered GNU/Hurd User.
Registered BSD User 51101.
Registered Linux User #213309.
Memories..... You are talking about memories.
Rick Deckard. Blade Runner.


Reply to: