ΰ̣:
	i, l, s ϡxxx_proto.c ΰեޥåʸ
		i: 32bit 
		l: 64bit 
		s: ǤĹʸ (Ĺ 32bit ɽ)
		b: ǤĹΥХʥǡ (Ĺ 32bit ɽ)

	եޥåʸ[ѿ] ϡ
		֤Υեޥåʸб뷿פΡѿײη֤
	: s[npaths]  ʸ(s)  npaths η֤

------------------------------------------------------------------------

᥿ǡСץȥ

	³: canonical_host, (job id, paralleism, index, pid) Ϥ
		 ޥɵưΥץȤ
		  --gfarm_nfrag, --gfarm_index ¾ --gfarm_job 䤹

	: 롼ץǡ١ǡ"gfadmin" 롼פ°桼

	
		COMPOUND ¦Ǥϡ
		2Ĥ file descriptor ֤ȤƤġ
		¿ current file descriptor оݤȤ롣
		- current file descriptor
		- saved file descriptor
		ϡʲξˡưŪ CLOSE 롣
		- COMPOUND λ
		- ¾ file descriptor Ǿ񤭤줿
		줿 ǥץ
		줿ǥץȤϡΤΤؤ
		- GET_FD ǳ줿Ρ
		- PUT_FD ǳϤ줿Ρ

  եǥץ
	GFM_PROTO_COMPOUND_BEGIN
	  : ʤ
	  : i:顼
	     Ȥ(ͥƥ󥰤ͳ)ԤǤ⡢
	       μ GFM_PROTO_COMPOUND_END ޤɬɤߤȤФ
	GFM_PROTO_COMPOUND_END
	  : ʤ
	  : i:顼
	GFM_PROTO_COMPOUND_ON_ERROR
	  : i:оݥ顼
	  : i:顼
	     Ȥ(Ʊ顼ɤʣꤷͳ)
	       ԤǤ⡢
	       μ GFM_PROTO_COMPOUND_{ON_ERROR,END} ޤ
	       ɬɤߤȤФ
	GFM_PROTO_GET_FD
	  ۤ: i:current file descriptor
	  : ʤ
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:fd
	   ():
		current file descriptor ϳ뤿ᡢ
		ưŪ CLOSE ʤʤ롣
	   顼Ȥ GFARM_ERR_TOO_MANY_OPEN_FILES ǽ롣
	   եǥץͤȤɤߤȤͣ
	GFM_PROTO_PUT_FD
	  : i:file_descriptor
	  : i:顼
	   ():
		current file descriptor <- new file_descriptor
	   current file descriptor ϳƤ뤿ᡢ
	     ưŪˤ CLOSE ʤ
	GFM_PROTO_SAVE_FD
	  ۤ: i:current file descriptor
	  : ʤ
	  : i:顼
	   ():
		saved file descriptor <- current file descriptor
	   current file descriptor ͤѤʤ
	GFM_PROTO_RESTORE_FD
	  ۤ: i:saved file descriptor
	  : ʤ
	  : i:顼
	   ():
		current file descriptor <- saved file descriptor
	   saved file descriptor ͤѤʤ
	GFM_PROTO_VERIFY_TYPE_NOT
	  ۤ: i:current file descriptor (target)
	  : i:
	  : i:顼
		 פȤƥǥ쥯ȥꤷ硢
			顼 GFARM_ERR_IS_A_DIRECTORY
		   פȤƥܥå󥯤ꤷ硢
			顼 GFARM_ERR_IS_A_SYMBOLIC_LINK
	GFM_PROTO_VERIFY_TYPE
	  ۤ: i:current file descriptor (target)
	  : i:
	  : i:顼
		 פȤƥǥ쥯ȥꤷ硢
			顼 GFARM_ERR_NOT_A_DIRECTORY
	GFM_PROTO_BEQUEATH_FD
	  ۤ: i:current file descriptor
	  : ʤ
	  : i:顼
	   ():
		 ΥեǥץФ롢
		 (GFM_PROTO_PROCESS_ALLOC_CHILD Ǻ)ҥץ
		 
	   current file descriptor γưŪ˹ԤʤȤϤʤ
	   ߤΤȤȥǥ쥯ȥμϤӤȤƤ
	     ͤƤʤ
	GFM_PROTO_INHEIRIT_FD
	  : i:Ƥfile descriptorֹ
	  : i:顼
	   ():
		current file descriptor <- new file_descriptor
	   current file descriptor γưŪ˹ԤʤȤϤʤ
	   Ƥfile descriptorֹ椬GFM_PROTO_BEQUEATH_FD 
	     ꤵ줿ΰʳä顢GFARM_ERR_BAD_FILE_DESCRIPTOR
	   ҥץGFM_PROTO_PROCESS_ALLOC_CHILD 
	     뤤 GFM_PROTO_INHERIT_FD ˡƥץλ
	     ޤäˤϡưʤȤ꤬롣
	   ߤΤȤȥǥ쥯ȥμϤӤȤƤ
	     ͤƤʤ

  gfs  / 饤ȤΥ

	GFM_PROTO_CREATE
	  ۤ: i:current file descriptor (target directory)
	  : s:name, i:flags, i: mode
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:i_node_number, l:generation, i:mode
	   ():
		current file descriptor <- new file_descriptor
	   GFM_PROTO_OPEN ⻲
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	   ǥ쥯ȥФƤ LOOKUP  RDONLY ʤ
	     ܥå󥯤ФƤ LOOKUP ʤ
	   ¸Υǥ쥯ȥФƹԤʤäˤ롣
	GFM_PROTO_OPEN
	  ۤ: i:current file descriptor (target directory)
	  : s:name, i:flags
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:i_node_number, l:generation, i:mode
	   ():
		current file descriptor <- new file_descriptor
	   GFM_PROTO_CREATE ⻲
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	   ǥ쥯ȥФƤ LOOKUP  RDONLY ʤ
	     ܥå󥯤ФƤ LOOKUP ʤ
	GFM_PROTO_OPEN_ROOT
	  : i:flags
	  : i:顼
	   ():
		current file descriptor <- new file_descriptor
	   flags ϡGFARM_FILE_LOOKUP 뤤 GFARM_FILE_RDONLY Τ
	GFM_PROTO_OPEN_PARENT
	  ۤ: i:current file descriptor (target directory)
	  : i:flags
	  : i:顼
	   ():
		current file descriptor <- new file_descriptor
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	   flags ϡGFARM_FILE_LOOKUP 뤤 GFARM_FILE_RDONLY Τ
	GFM_PROTO_FCHMOD
	  ۤ: i:current file descriptor
	  : i: mode
	  : i:顼
	GFM_PROTO_FCHOWN
	  ۤ: i:current file descriptor
	  : s: user, s:group
	  : i:顼
	   Ը¤ɬ

	GFM_PROTO_REMOVE
	  ۤ: i:current file descriptor (target directory)
	  : s:target
	  : i:顼
	GFM_PROTO_RENAME
	  ۤ:
		i:saved file descriptor (source directory)
		i:current file descriptor (target directory)
	  : s:src_name, s: target_name
	  : i:顼
	GFM_PROTO_FLINK
	  ۤ:
		i:saved file descriptor (content)
		i:current file descriptor (target directory)
	  : s:target_name
	  : i:顼
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤ GFARM_ERR_IS_A_DIRECTORY ֤
	GFM_PROTO_MKDIR
	  ۤ: i:current file descriptor (target directory)
	  : s: name, i: mode
	  : i:顼
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	GFM_PROTO_SYMLINK
	  ۤ:
		i:current file descriptor (directory to create the link)
	  : s:source_path, s: new_name
	  : i:顼
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	GFM_PROTO_READLINK
	  ۤ: i:current file descriptor (symbolic link)
	  : ʤ
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		s:target_path
	   current file descriptor ܥå󥯤ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_INVAILD_ARGUMENT ֤
	GFM_PROTO_GETDIRPATH
	  ۤ: i:current file descriptor (target directory)
	  : ʤ
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		s:path
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	GFM_PROTO_GETDIRENTS
	  ۤ: i:current file descriptor (target directory)
	  : i:n_entries,
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_entries, s[n_entries]:ent_names, i[n_entries]:ent_types,
		l[n_entries]:inode_numbers
	   n_entries == 0 ֤ǥ쥯ȥ
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	GFM_PROTO_SEEK
	  ۤ: i:current file descriptor (target directory)
	  : l:offset, i:whence
	  : i:顼,
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:offset
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤
	GFM_PROTO_GETDIRENTSPLUS
	  ۤ: i:current file descriptor (target directory)
	  : i:n_entries,
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_entries
		Ρn_entries η֤:
			s:entry_name,
			l:i_node_number, l:generation,
			i:mode, l:nlinks, s:user, s:group, l:size, l:ncopies,
			l:atime_sec, i:atime_nsec,
			l:mtime_sec, i:mtime_nsec,
			l:ctime_sec, i:ctime_nsec
	   n_entries == 0 ֤ǥ쥯ȥ
	   current file descriptor ǥ쥯ȥ꤫ɤ򸡺롣
	     ǥ쥯ȥǤʤ GFARM_ERR_NOT_A_DIRECTORY ֤

        GFM_PROTO_XATTR_SET
        GFM_PROTO_XMLATTR_SET
          ۤ: i:current file descriptor (target file)
          : s:name, B:value i:flags
          : i:顼
        GFM_PROTO_XATTR_GET
        GFM_PROTO_XMLATTR_GET
          ۤ: i:current file descriptor (target file)
          : s:name
          : i:顼, b:value
           ĥ°ǡΥ䤤碌Ϥʤ
        GFM_PROTO_XATTR_REMOVE
        GFM_PROTO_XMLATTR_REMOVE
          ۤ: i:current file descriptor (target file)
          : s:name
          : i:顼
        GFM_PROTO_XATTR_LIST
        GFM_PROTO_XMLATTR_LIST
          ۤ: i:current file descriptor (target file)
          : ʤ
          : i:顼, b:value
           ĥ°̾\0Ƕڤäʸ֤
        GFM_PROTO_XMLATTR_FIND
          ۤ: i:current file descriptor (target file)
          : s:expr, i:depth, i:nentry, s:cookie_path, s:cookie_name
          : i:顼, i:eof,i:n_entries, s[n_entries]:path, 
                s[n_entries]:name
           䤤碌Ϥʤ
            ׵᥵˶ᤤŬʶڤ̾ޤǤ֤
            entry  ĥ°ĥեХѥȳĥ°̾롣
            ׵ե뼫Ȥγĥ°λˤϥѥ"."Ȥ롣
            ׵cookieentryǡ׵Ǥϳĥ°̾NULL򤷤᤹
            ³׵ξϡǸ֤줿entrycookieȤϤ
            eof ξ eof ե饰1Ǥ롣

	GFM_PROTO_CKSUM_GET
	  ۤ: i:current file descriptor (target file)
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		s:cksum_type, b:cksum, i:flags
	  åबʤϡcksum_type == "", cksum = [] Ȥʤ롣
	   flags ˤϡξ󤬴ޤޤ롣
		Υץꥫ߽񤭹ߥץ󤵤Ƥ뤫
	GFM_PROTO_CKSUM_SET
	  ۤ: i:current file descriptor (target file)
	  : s:cksum_type, b:cksum
		i:flags, l:mtime_sec, i:mtime_nsec
	  : i:顼
	   flags ˤϡξ󤬴ޤޤ
		mtime_{,n}sec ͭ
			 Υǥץ˽񤭹ߤԤʤ줿˿
	GFM_PROTO_SCHEDULE_FILE
	  ۤ: i:current file descriptor (file)
	  : s:domain
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_hosts,
		Ρn_hosts η֤:
			s:host, i:port,
			i:loadavg*65536, l:cache_time, l:usedsize, l:availsize,
			l:rtt_cache_time, i:rtt_usec, i:rtt_flags
	   ȤʤۥȤΥꥹȤ֤
	   domain ѥ᡼äɤ?
	   ۥȿ¤ˤϡ

	GFM_PROTO_SCHEDULE_FILE_WITH_PROGRAM
	  ۤ:
		i:saved file descriptor (program)
		i:current file descriptor (file)
	  : s:domain
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_hosts,
		Ρn_hosts η֤:
			s:host, i:port,
			i:loadavg*65536, l:cache_time, l:usedsize, l:availsize,
			l:rtt_cache_time, i:rtt_usec, i:rtt_flags
	   ȤʤۥȤΥꥹȤ֤
	   domain ѥ᡼äɤ?
	   ۥȿ¤ˤϡ

	GFM_PROTO_REPLICA_LIST_BY_NAME
	  ۤ: i:current file descriptor
	  : ʤ
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_replicas,
		s[n_replicas]:replica_hosts, i[n_replicas]:replica_ports

	GFM_PROTO_REPLICA_LIST_BY_HOST
	  : s:host, i:port
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_replicas,
		o[n_replicas]:i_node_numbers
	   Ը¤ɬ
	GFM_PROTO_REPLICA_REMOVE_BY_HOST
	  : s:host, i:port
	  : i:顼
	   Ը¤ɬ

  gfs  / gfsd Υ
    CERT: ۥȾ/LDAPΡgfsdĤ

	GFM_PROTO_REOPEN
	  ۤ: i:current file descriptor
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:i_node_number, l:generation, i:mode, i:flags, i:to_create
	   GFM_PROTO_OPEN, GFM_PROTO_CREATE Τɤξ
	     Ѥ롣
	      gfarm-v2-outline: [old-replica] ⻲
	GFM_PROTO_CLOSE_READ
	  ۤ: i:current file descriptor
	  : l:atime_sec, i:atime_nsec
	  : i:顼
	   GFM_PROTO_CLOSE, GFM_PROTO_CLOSE_WRITE ⻲
	GFM_PROTO_CLOSE_WRITE
	  ۤ: i:current file descriptor
	  : l:size
		l:atime_sec, i:atime_nsec
		l:mtime_sec, i:mtime_nsec
	  : i:顼
	   GFM_PROTO_CLOSE, GFM_PROTO_CLOSE_READ ⻲
	   gfarm-v2-outline: [invalidate-replica] ⻲
	GFM_PROTO_LOCK
	  ۤ: i:current file descriptor
	  : l:start, l:len, i:type, i:whence
	  : i:顼
	GFM_PROTO_TRYLOCK
	  ۤ: i:current file descriptor
	  : l:start, l:len, i:type, i:whence
	  : i:顼
	GFM_PROTO_UNLOCK
	  ۤ: i:current file descriptor
	  : l:start, l:len, i:type, i:whence
	  : i:顼
	GFM_PROTO_LOCK_INFO
	  ۤ: i:current file descriptor
	  : l:start, l:len, i:type, i:whence
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:start, l:len, i:type, s:host, l:pid

	GFM_PROTO_REPLICA_ADDING
	  ۤ: i:current file descriptor
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:i_node_number, l:generation, l:st_mtime_sec, i:st_mtime_nsec
	GFM_PROTO_REPLICA_ADDED
	  ۤ: i:current file descriptor
	  : i:flags,
		l:st_mtime_sec, i:st_mtime_nsec
	  : i:顼
	   flags ˤϡξ󤬴ޤޤ
		mtime_{,n}sec ͭ
			 ʣΡɤǽ񤭹ߥץ󤵤Ƥ翿
	GFM_PROTO_REPLICA_LOST
	  : l:i_node_number, l:generation
	  : i:顼

  gfs  / 饤Ȥ gfsd ξΥ

	GFM_PROTO_CLOSE
	  ۤ: i:current file descriptor
	  : ʤ
	  : i:顼
	   GFM_PROTO_CLOSE_READ, GFM_PROTO_CLOSE_WRITE ⻲
	GFM_PROTO_FSTAT
	  ۤ: i:current file descriptor
	  : ʤ
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:i_node_number, l:generation,
		i:mode, l:nlinks, s:user, s:group, l:size, l:ncopies,
		l:atime_sec, i:atime_nsec,
		l:mtime_sec, i:mtime_nsec,
		l:ctime_sec, i:ctime_nsec
	GFM_PROTO_FUTIMES
	  ۤ: i:current file descriptor
	  : l:atime_sec, i:atime_nsec,
		l:mtime_sec, i:mtime_nsec
	  : i:顼

  gfs_pio 
	GFM_PROTO_GLOB
		XXX need to rethink
	  : i:n_globs, s[n_globs]:globs
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		Ρn_globs η֤:
			i:顼
			顼 == GFARM_ERR_NO_ERROR ξ:
			i:n_entries,
			s[n_entries]:entries, i[n_entries]:ent_types,
			l[n_entries]:inode_numbers
		 ʣ glob Ϳ륤󥿡եȤƤΤ
		   round trip β򸺤餹
	GFM_PROTO_SCHEDULE
		XXX need to rethink
	  : i:n, s:gfarm_program, s:parallel_file, s:domain,
		mode:open_mode
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_hosts
		Ρn_hosts η֤:
			s:hostname,
			i:n_host_aliases, s[n_host_aliases]:host_aliases,
			s:architecture, i:ncpu, i:port, i:flags
	   gfarm_program/parallel_file/domain  "" Ǥɤ
	     ޤ n  0 Ǥɤ
	     ξ硢Υѥ᡼̵뤵롣
	     ʤ AND ȸʤ롣
	     open_mode ˤϡCPUƤɬפ񤭹ߤɬפ
	     ξϤ񤭹߾ϤΤϡ񤭹ߤ椵뤿ᡣ
	GFM_PROTO_PIO_OPEN
		XXX need to rethink
	  : s:parallel_file, i:open_flags
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_files, s[n_files]:filenames
	   ():
		current file descriptor <- new file_descriptor
	   parallel_file  gfs ʳΥե륷ƥΥѥ̾ޤ硢
	     n_files  0 ֤ξ硢GFM_PROTO_PIO_SET_PATHS ǡ
	     parallel_file ɽѥ̾ΥꥹȤʤФʤʤ
	   pio_open() Ǥϡremove/rename ˴ؤposix semantics¸ʤ
	     open_flags ˤϡʤȤ write, create ɬ
	GFM_PROTO_PIO_SET_PATHS
		XXX need to rethink
	  : i:file_descriptor
		i:n_files, s[n_files]:filenames
	  : i:顼
	GFM_PROTO_PIO_CLOSE
		XXX need to rethink
	  ۤ: i:current file descriptor
	  : ʤ
	  : i:顼
	GFM_PROTO_PIO_VISIT
	  ۤ: i:current file descriptor
	  : i:index
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:flags
	   flags ˤϡξ󤬴ޤޤ롣
		Υե饰ȤФǽˬ䤫

  ᥿ǡ
	GFM_PROTO_HOST_INFO_GET_ALL
	  : ʤ
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		i:n_hosts,
		Ρn_hosts η֤:
			s:hostname,
			i:n_host_aliases, s[n_host_aliases]:host_aliases,
			s:architecture, i:ncpu, i:port, i:flags
	GFM_PROTO_HOST_INFO_GET_BY_ARCHITECTURE
	  : s:architecture
	  : i:n_hosts,
		Ρn_hosts η֤:
			s:hostname,
			i:n_host_aliases, s[n_host_aliases]:host_aliases,
			s:architecture, i:ncpu, i:port, i:flags
	GFM_PROTO_HOST_INFO_GET_BY_NAMES
	  : i: n_hostnames, s[n_hostnames]:hostnames
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		Ρn_hostnames η֤:
			i:顼,
			顼 == GFARM_ERR_NO_ERROR ξ:
			s:hostname,
			i:n_host_aliases, s[n_host_aliases]:host_aliases,
			s:architecture, i:ncpu, i:port, i:flags
	GFM_PROTO_HOST_INFO_GET_BY_NAMEALIASES
	  : i: n_hostnames, s[n_hostnames]:hostnames
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		Ρn_hostnames η֤:
			i:顼
			顼 == GFARM_ERR_NO_ERROR ξ:
			s:hostname,
			i:n_host_aliases, s[n_host_aliases]:host_aliases,
			s:architecture, i:ncpu, i:port, i:flags
	GFM_PROTO_HOST_INFO_SET
	  : s:hostname,
		i:n_host_aliases, s[n_host_aliases]:host_aliases,
		s:architecture, i:ncpu, i:port, i:flags
	  : i:顼
	   Ը¤ɬ
	GFM_PROTO_HOST_INFO_MODIFY
	  : s:hostname,
		i:n_host_aliases, s[n_host_aliases]:host_aliases,
		s:architecture, i:ncpu, i:port, i:flags
	  : i:顼
	   Ը¤ɬ
	GFM_PROTO_HOST_INFO_REMOVE
	  : s:hostname
	  : i:顼
	   Ը¤ɬ

	GFM_PROTO_USER_INFO_GET_ALL
	  : ʤ
	  : i:n_users
		Ρn_users η֤:
			s:username,
			s:real_name, s:gfarm_homedir, s:gsi_dn
	GFM_PROTO_USER_INFO_GET_BY_NAMES
	  : i:n_usernames, s[n_usernames]:usernames
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		Ρn_usernames η֤:
			i:顼
			顼 == GFARM_ERR_NO_ERROR ξ:
			s:username,
			s:real_name, s:gfarm_homedir, s:gsi_dn
	    gfsd ΥץȥѤΤɬפ롣
	       gfarm_metadb_verify_username() 뤿ᡣ
	GFM_PROTO_USER_INFO_SET
	  : s:username,
		s:real_name, s:gfarm_homedir, s:gsi_dn
	  : i:顼
	   Ը¤ɬ
	GFM_PROTO_USER_INFO_MODIFY
	  : s:username,
		s:real_name, s:gfarm_homedir, s:gsi_dn
	  : i:顼
	   Ը¤ɬ
	GFM_PROTO_USER_INFO_REMOVE
	  : s:username
	  : i:顼
	   Ը¤ɬ

	GFM_PROTO_GROUP_INFO_GET_ALL
	  : ʤ
	  : i:n_groups
		Ρn_groups η֤:
			s:groupname,
			i:n_users, s[n_users]:users
	GFM_PROTO_GROUP_INFO_GET_BY_NAMES
	  : i:n_groupnames, s[n_groupnames]:groupnames
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		Ρn_groupnames η֤:
			i:顼
			顼 == GFARM_ERR_NO_ERROR ξ:
			s:groupname,
			i:n_users, s[n_users]:users
	GFM_PROTO_GROUP_INFO_SET
	  : s:groupname,
		i:n_users, s[n_users]:users
	  : i:顼
	   Ը¤ɬ
	GFM_PROTO_GROUP_INFO_MODIFY
	  : s:groupname,
		i:n_users, s[n_users]:users
	  : i:顼
	   Ը¤ɬ
	GFM_PROTO_GROUP_INFO_REMOVE
	  : s:groupname
	  : i:顼
	   Ը¤ɬ
	GFM_PROTO_GROUP_INFO_ADD_USERS
	  : s:groupname,
		i:n_users, s[n_users]:users
	  : i:顼
		i[n_users]:user顼
	   Ը¤ɬ
	GFM_PROTO_GROUP_INFO_REMOVE_USERS
	  : s:groupname,
		i:n_users, s[n_users]:users
	  : i:顼
		i[n_users]:user顼
	   Ը¤ɬ
	GFM_PROTO_GROUP_NAMES_GET_BY_USERS
	  : i:n_usernames, s[n_usernames]:usernames
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		Ρn_usernames η֤:
			i:顼
			顼 == GFARM_ERR_NO_ERROR ξ:
			i:n_groups, s[n_groups]:groupnames

  replication manager :
	ץꥫ

  gfsck :

	  : 
	  : 

  process 
	GFM_PROTO_PROCESS_ALLOC
	  : i:key_type, b:shared_key
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:pid
	GFM_PROTO_PROCESS_ALLOC_CHILD
	  : i:parent_key_type, b:parent_shared_key, l:parent_pid,
		i:my_key_type, b:my_shared_key
	  : i:顼
		顼 == GFARM_ERR_NO_ERROR ξ:
		l:my_pid
	   ƥץȻҥץδ֤ǤΡȥǥ쥯ȥμϤ
	     ˻ȤGFM_PROTO_EXPORT_FD/GFM_PROTO_IMPORT_FD ⻲ȡ

	GFM_PROTO_PROCESS_FREE
	  : ʤ
	  : i:顼
	GFM_PROTO_PROCESS_SET
	  : i:key_type, b:shared_key, l:pid
	  : i:顼

------------------------------------------------------------------------


	ե륪ץ
		: "dir1/dir2/file"
			GFM_PROTO_COMPOUND_BEGIN
			GFM_PROTO_PUT_FD(cwd_fd)
			GFM_PROTO_OPEN("dir1", LOOKUP)
			GFM_PROTO_OPEN("dir2", LOOKUP)
			GFM_PROTO_OPEN("file", RDONLY)
			GFM_PROTO_GET_FD: gfm_fd
			GFM_PROTO_COMPOUND_ON_ERROR(IS_A_SYMBOLIC_LINK)
			GFM_PROTO_READLINK
			GFM_PROTO_COMPOUND_END
