* procfs/procfs.c (procfs_make_ino): Use 2 rather than 42 as a temporary hack, since 2 is the root's inode with ext2fs.
* procfs/rootdir.c (get_boottime, get_idletime): replace KERNEL_PID with the opt_kernel_pid command-line option. * procfs/main.c (argp): Document the change.
* dircat.c, dircat.h, main.c, main.h, netfs.c, process.c, process.h, procfs.c, procfs.h, procfs_dir.c, procfs_dir.h, proclist.c, proclist.h, rootdir.c, rootdir.h: Add copyright notices.
* Makefile: Add procfs as a subdirectory. * procfs/Makefile: Rewrite as a subdir Makefile. * procfs/rootdir.c: Use the PROF preprocessor constant to identify profiling builds.
* procfs/TODO: Add more entries.
* procfs/rootdir.c: Add page breaks to separate sections and add header comments for them.
* procfs/rootdir.c (rootdir_gc_meminfo): Add swap information. * procfs/TODO: Update.
* procfs/Makefile: Change FOOFLAGS defaults to appropriate values when $(PROFILE) is defined. * procfs/rootdir.c: Add an "exit" file, which causes exit to be called when looked up, so that profiling data can be written to disk.
* procfs/process.c (process_lookup_pid): Fix leak in error case.
This is necessary for top, for instance, which keeps some files open and re-reads them regularly. As an extra bonus we can drop the refresh hack. * procfs/procfs.c, procfs/procfs.h: Remove the refresh hack. (procfs_refresh): New function, invalidates the cached contents. * procfs/netfs.c (netfs_attempt_read, netfs_get_dirents): Call procfs_refresh when the read is from offset 0. * procfs/proclist.c (proclist_make_node): Remove the refresh hack. * procfs/dircat.c (dircat_make_node): Likewise. (dircat_get_contents): Use procfs_refresh to avoid keeping old data from the component nodes.
* procfs/process.c, procfs/rootdir.c: When converting timeval structures into seconds or jiffies, make sure that floating point rounding errors don't make the clock the result jump backwards on second boundaries.
* procfs/rootdir.c: Replace INIT_PID by KERNEL_PID, for boot time and idle time purposes. (get_idletime): New function, queries the kernel's idle thread. (rootdir_gc_uptime, rootdir_gc_stat): Use the new function and provide the real idle time.
* procfs/process.c: Reorder some of the code. Improve comments. Jiffies and clock tick are the same thing, right? Replace the stat mode and cleanup hacks by more straightforward solutions.
* procfs/procfs_dir.c, procfs/procfs_dir.h: Revamp the interface to make the more complicated use cases somewhat less hackish. * procfs/process.c: Update, specify a default make_node function. * procfs/rootdir.c: Likewise; make this optional "self" link use case somewhat less hackish.
* procfs/dircat.c, procfs/dircat.h (dircat_make_node): Use an explicit array size for DIRS, fail with ENOMEM is any of them is NULL, and release the reference on the non-NULL nodes on any error. * procfs/main.c (root_make_node): Use the new interface.
* procfs/procfs.h: Make CONTENTS_LEN an ssize_t rather than a size_t, and document the change. * procfs/procfs.c (procfs_get_contents): Initialize CONTENTS_LEN to a negative value, and fail with ENOMEM if it's still negative after the callback returns. (everywhere): Update to ssize_t. * procfs/dircat.c, procfs/netfs.c, procfs/process.c, procfs/procfs_dir.c, procfs/proclist.c, procfs/rootdir.c: Update to ssize_t and the new GET_CONTENTS semantics.
* procfs/procfs.h (procfs_cleanup_contents_with_free, procfs_cleanup_contents_with_vm_deallocate, procfs_get_contents, struct procfs_ops): Change CONTENTS from a void pointer to a char one. * procfs/dircat.c, procfs/netfs.c, procfs/process.c, procfs/procfs.c, procfs/procfs_dir.c, procfs/proclist.c, procfs/rootdir.c: Update.
* procfs/procfs_file.c, procfs/procfs_file.h: Remove. * procfs/Makefile: Remove procfs_file.
* procfs/main.c (argp_parser): New option --anonymous-owner. * procfs/main.h: Publish it. * procfs/process.c (process_lookup_pid): Use it to set the file owner uid of non-owned processes.
* procfs/proclist.c, procfs/proclist.h (proclist_create_node): Use a ps_context passed by the caller; errors are no longer possible, rename to proclist_make_node and change the signature accordingly. * procfs/rootdir.c, procfs/rootdir.h (rootdir_create_node): Likewise. * procfs/main.c (main): Create the ps_context here and pass it to root_make_node. (root_make_node): Pass it to proclist_make_node and rootdir_make_node.
* procfs/TODO: New file.
* procfs/main.c: Don't call netfs_server_loop repeatedly; it should never return.
* procfs/main.c (main): Handle errors from argp_parse and root_make_node.
* procfs/main.c (argp_parser): Add --compatible, which sets the options required for compatibility with the procps tools.
* procfs/process.c: Add a status file.
* procfs/process.c: Add the statm file.
* procfs/main.c (argp_parser, main): Add the --kernel-pid option. * procfs/main.h: Publish it. * procfs/rootdir.c (rootdir_gc_cmdline): New function.
* procfs/rootdir.c: Add a (non-empty) meminfo and a vmstat file.
* procfs/main.c (argp_parse, main): Add the --fake-self option. * procfs/main.h: Publish it. * procfs/rootdir.c (rootdir_gc_fakeself, rootdir_entries, rootdir_create_node): Use it.
* procfs/main.c (argp_parser, main): Add the --stat-mode option. * procfs/process.c (process_lookup_pid): Use it.
* procfs/main.c (argp_parser, main): Add and parse the --clk-tck option. * procfs/main.h: Publish opt_clk_tck. * procfs/process.c (sc_tc): Use the user-provided clock frequency. * procfs/rootdir.c (rootdir_gc_stat): Likewise.
* procfs/rootdir.c (rootdir_gc_uptime, rootdir_gc_stat): assume a completely idle rather than completely busy system, so that the idle seconds can be meaningfully divided by the idle jiffies by procps.
* procfs/rootdir.c: Add "meminfo", empty for now.
* procfs/rootdir.c: Add a fake "self" symlink which always points to init.
* procfs/rootdir.c: Add the root file "loadavg".