sim/sysctl.c
author frederic.urbani@inria.fr
Mon, 15 Oct 2012 11:31:49 +0200
changeset 0 bf005a4c1191
child 1 cd5ead578b19
permissions -rw-r--r--
First import.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     1
#include <linux/mm.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     2
#include <linux/mmzone.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     3
#include <linux/mman.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     4
#include <linux/ratelimit.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     5
#include "sim-assert.h"
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     6
#include "sim-types.h"
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     7
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     8
int drop_caches_sysctl_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
     9
			       void  *buffer, size_t *length, loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    10
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    11
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    12
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    13
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    14
int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    15
					void  *buffer, size_t *length, loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    16
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    17
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    18
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    19
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    20
int min_free_kbytes_sysctl_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    21
				   void  *buffer, size_t *length, loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    22
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    23
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    24
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    25
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    26
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    27
int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    28
					    void  *buffer, size_t *length, loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    29
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    30
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    31
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    32
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    33
int dirty_background_ratio_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    34
				   void  *buffer, size_t *lenp,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    35
				   loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    36
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    37
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    38
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    39
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    40
int dirty_background_bytes_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    41
				   void  *buffer, size_t *lenp,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    42
				   loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    43
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    44
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    45
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    46
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    47
int dirty_ratio_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    48
			void  *buffer, size_t *lenp,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    49
			loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    50
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    51
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    52
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    53
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    54
int dirty_bytes_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    55
			void  *buffer, size_t *lenp,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    56
			loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    57
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    58
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    59
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    60
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    61
int dirty_writeback_centisecs_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    62
				      void  *buffer, size_t *length, loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    63
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    64
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    65
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    66
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    67
int scan_unevictable_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    68
			     void __user *buffer,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    69
			     size_t *length, loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    70
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    71
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    72
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    73
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    74
int sched_rt_handler(struct ctl_table *table, int write,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    75
		     void __user *buffer, size_t *lenp,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    76
		     loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    77
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    78
  sim_assert (false);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    79
  return 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    80
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    81
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    82
int sysctl_overcommit_memory = OVERCOMMIT_GUESS;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    83
int sysctl_overcommit_ratio = 50;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    84
int sysctl_panic_on_oom = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    85
int sysctl_oom_dump_tasks = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    86
int sysctl_oom_kill_allocating_task = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    87
int sysctl_nr_open = 1024*1024;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    88
int sysctl_nr_open_min = BITS_PER_LONG;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    89
int sysctl_nr_open_max = 1024 * 1024;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    90
int sysctl_nr_trim_pages = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    91
int sysctl_drop_caches = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    92
int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = {32};
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    93
int sysctl_vfs_cache_pressure = 100;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    94
unsigned int sysctl_sched_child_runs_first = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    95
unsigned int sysctl_sched_compat_yield = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    96
unsigned int sysctl_sched_rt_period = 1000000;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    97
int sysctl_sched_rt_runtime = 950000;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    98
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
    99
int vm_highmem_is_dirtyable;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   100
unsigned long vm_dirty_bytes = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   101
int vm_dirty_ratio = 20;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   102
int dirty_background_ratio = 10;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   103
unsigned int dirty_expire_interval = 30 * 100;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   104
unsigned int dirty_writeback_interval = 5 * 100;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   105
unsigned long dirty_background_bytes = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   106
int percpu_pagelist_fraction = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   107
int panic_timeout = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   108
int panic_on_oops = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   109
int printk_delay_msec = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   110
DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   111
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   112
#define RESERVED_PIDS 300
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   113
int pid_max = PID_MAX_DEFAULT;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   114
int pid_max_min = RESERVED_PIDS + 1;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   115
int pid_max_max = PID_MAX_LIMIT;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   116
int min_free_kbytes = 1024;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   117
int max_threads = 100;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   118
int laptop_mode = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   119
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   120
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   121
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   122
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   123
int console_printk[4] = {
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   124
  DEFAULT_CONSOLE_LOGLEVEL,       /* console_loglevel */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   125
  DEFAULT_MESSAGE_LOGLEVEL,       /* default_message_loglevel */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   126
  MINIMUM_CONSOLE_LOGLEVEL,       /* minimum_console_loglevel */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   127
  DEFAULT_CONSOLE_LOGLEVEL,       /* default_console_loglevel */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   128
};
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   129
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   130
int print_fatal_signals = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   131
unsigned int core_pipe_limit = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   132
int core_uses_pid = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   133
int vm_swappiness = 60;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   134
int nr_pdflush_threads = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   135
unsigned long scan_unevictable_pages = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   136
int suid_dumpable = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   137
int page_cluster = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   138
int block_dump = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   139
int C_A_D = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   140
#include <linux/nsproxy.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   141
struct nsproxy init_nsproxy;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   142
#include <linux/reboot.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   143
char poweroff_cmd[POWEROFF_CMD_PATH_LEN] = "/sbin/poweroff";
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   144
#include <linux/pipe_fs_i.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   145
unsigned int pipe_max_pages =  PIPE_DEF_BUFFERS * 16;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   146
unsigned int pipe_max_size = 1048576;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   147
unsigned int pipe_min_size = PAGE_SIZE;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   148
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   149
int pipe_proc_fn(struct ctl_table *table, int write, void __user *buf,
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   150
                 size_t *lenp, loff_t *ppos)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   151
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   152
  return -1;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   153
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   154
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   155
#include <linux/fs.h>
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   156
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   157
/**
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   158
 * Honestly, I don't understand half of that code.
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   159
 * It was modeled after fs/proc/proc_sysctl.c proc_sys_readdir
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   160
 */
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   161
static void iterate_recursive (const struct SimSysIterator *iter, struct ctl_table *table);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   162
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   163
static void iterate_table_recursive (const struct SimSysIterator *iter, struct ctl_table *table)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   164
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   165
  struct ctl_table *cur_table;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   166
  for (cur_table = table; cur_table->procname != NULL; cur_table++)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   167
    {
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   168
      if (table->child == 0)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   169
	{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   170
	  bool may_read = (table->mode & MAY_READ);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   171
	  bool may_write = (table->mode & MAY_WRITE);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   172
	  int flags = 0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   173
	  flags |= may_read?SIM_SYS_FILE_READ:0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   174
	  flags |= may_write?SIM_SYS_FILE_WRITE:0;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   175
	  iter->report_file (iter, cur_table->procname, flags, (struct SimSysFile *)cur_table);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   176
	}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   177
      else
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   178
	{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   179
	  iter->report_start_dir (iter, cur_table->procname);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   180
	  iterate_recursive (iter, table->child);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   181
	  iter->report_end_dir (iter);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   182
	}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   183
    }
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   184
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   185
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   186
static void iterate_recursive (const struct SimSysIterator *iter, struct ctl_table *table)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   187
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   188
  struct ctl_table_header *root = sysctl_head_next (NULL);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   189
  struct ctl_table_header *cur;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   190
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   191
  iterate_table_recursive (iter, table);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   192
  for (cur = root; cur != 0; cur = sysctl_head_next (cur))
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   193
    {
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   194
      if (cur->set != table)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   195
	{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   196
	  continue;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   197
	}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   198
      iterate_table_recursive (iter, cur->root);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   199
    }
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   200
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   201
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   202
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   203
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   204
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   205
void sim_sys_iterate_files (const struct SimSysIterator *iter)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   206
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   207
//	sim_assert (0);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   208
	return;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   209
  struct ctl_table_header *root = sysctl_head_next (NULL);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   210
  iterate_recursive (iter, root->ctl_table);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   211
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   212
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   213
int sim_sys_file_read (const struct SimSysFile *file, char *buffer, int size, int offset)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   214
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   215
  struct ctl_table *table = (struct ctl_table *)file;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   216
  loff_t ppos = offset;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   217
  size_t result = size;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   218
  int error;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   219
  error = table->proc_handler (table, 0, buffer, &result, &ppos);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   220
  return result;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   221
}
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   222
int sim_sys_file_write (const struct SimSysFile *file, const char *buffer, int size, int offset)
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   223
{
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   224
  struct ctl_table *table = (struct ctl_table *)file;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   225
  loff_t ppos = offset;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   226
  size_t result = size;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   227
  int error;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   228
  error = table->proc_handler (table, 1, (char *)buffer, &result, &ppos);
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   229
  return result;
bf005a4c1191 First import.
frederic.urbani@inria.fr
parents:
diff changeset
   230
}