/*	$NetBSD: nineproto.h,v 1.2 2019/05/17 08:48:04 ozaki-r Exp $	*/

/*
 * Copyright (c) 2007  Antti Kantee.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef PUFFS9P_9PROTO_H_
#define PUFFS9P_9PROTO_H_

#include <stdint.h>

#define P9PROTO_VERSION		0
#define P9PROTO_VERSION_U	1

#define P9PROTO_VERSTR		"9P2000"
#define P9PROTO_VERSTR_U	"9P2000.u"
#define P9PROTO_VERSTR_MAXLEN	(sizeof(P9PROTO_VERSTR_U))

#define P9PROTO_T_VERSION	100
#define P9PROTO_R_VERSION	101
#define P9PROTO_T_AUTH		102
#define P9PROTO_R_AUTH		103
#define P9PROTO_T_ATTACH	104
#define P9PROTO_R_ATTACH	105
#define P9PROTO_T_ERROR		106
#define P9PROTO_R_ERROR		107
#define P9PROTO_T_FLUSH		108
#define P9PROTO_R_FLUSH		109
#define P9PROTO_T_WALK		110
#define P9PROTO_R_WALK		111
#define P9PROTO_T_OPEN		112
#define P9PROTO_R_OPEN		113
#define P9PROTO_T_CREATE	114
#define P9PROTO_R_CREATE	115
#define P9PROTO_T_READ		116
#define P9PROTO_R_READ		117
#define P9PROTO_T_WRITE		118
#define P9PROTO_R_WRITE		119
#define P9PROTO_T_CLUNK		120
#define P9PROTO_R_CLUNK		121
#define P9PROTO_T_REMOVE	122
#define P9PROTO_R_REMOVE	123
#define P9PROTO_T_STAT		124
#define P9PROTO_R_STAT		125
#define P9PROTO_T_WSTAT		126
#define P9PROTO_R_WSTAT		127
#define P9PROTO_MIN		9PROTO_T_VERSION
#define P9PROTO_MAX		9PROTO_R_MAX

#define P9PROTO_NOFID		(uint32_t)~0
#define P9PROTO_NOTAG		(uint16_t)~0

#define P9PROTO_NUNAME_UNSPECIFIED	(uint16_t)~0

/* type field in a qid */
#define P9PROTO_QID_TYPE_DIR	0x80
#define P9PROTO_QID_TYPE_APPEND	0x40
#define P9PROTO_QID_TYPE_EXCL	0x20
#define P9PROTO_QID_TYPE_MOUNT	0x10
#define P9PROTO_QID_TYPE_AUTH	0x08
/* P92000.u extensions */
#define P9PROTO_QID_TYPE_TMP	0x04
#define P9PROTO_QID_TYPE_LINK	0x02
#define P9PROTO_QID_TYPE_FILE	0x00

/* mode in open */
#define P9PROTO_OMODE_READ	0x00
#define P9PROTO_OMODE_WRITE	0x01
#define P9PROTO_OMODE_RDWR	0x02
#define P9PROTO_OMODE_EXEC	0x03
#define P9PROTO_OMODE_TRUNC	0x10
#define P9PROTO_OMODE_RMCLOSE	0x40

/* for creating directories */
#define P9PROTO_CPERM_DIR	0x80000000
#define P9PROTO_CPERM_APPEND	0x40000000
#define P9PROTO_CPERM_EXCL	0x20000000
#define P9PROTO_CPERM_MOUNT	0x10000000
#define P9PROTO_CPERM_AUTH	0x08000000
#define P9PROTO_CPERM_TMP	0x04000000
#define P9PROTO_CPERM_SYMLINK	0x02000000
/* P92000.u extensions */
#define P9PROTO_CPERM_DEVICE	0x00800000
#define P9PROTO_CPERM_NAMEDPIPE	0x00200000
#define P9PROTO_CPERM_SOCKET	0x00100000
#define P9PROTO_CPERM_SETUID	0x00080000
#define P9PROTO_CPERM_SETGID	0x00040000

/* stat non-values */
#define P9PROTO_STAT_NOVAL1	(uint8_t)~0
#define P9PROTO_STAT_NOVAL2	(uint16_t)~0
#define P9PROTO_STAT_NOVAL4	(uint32_t)~0
#define P9PROTO_STAT_NOVAL8	(uint64_t)~0
#define P9PROTO_STAT_NOSTR	""

#endif /* PUFFS9P_PROTO_H_ */
