---------------------------------
                      PS2NETFS OPERATION AND PROTOCOL
                        Dan Peori (peori@oopo.net)
                       Current as of March 6th, 2004
                     ---------------------------------

  Communication with ps2netfs takes place on TCP socket 0x4713. A connection is
  opened then a request packet is sent. Soon afterwards, a response packet will
  be received and the connection closed. Through these simple request/response
  pairs more complex functions can be created to do things like copy files to
  and from the ps2 itself. For examples see ps2netfs.c in the ps2client source.

  ----------------------------
   0xBEEF8011 (open request)
   0xBEEF8012 (open response)
  ----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char pathname[256]; } request;
    struct { int number; short length; int result; } response;

   FLAG VALUES

    #define OPEN_READ		0x0001
    #define OPEN_WRITE		0x0002
    #define OPEN_NONBLOCK	0x0010
    #define OPEN_APPEND		0x0100
    #define OPEN_CREATE		0x0200
    #define OPEN_TRUNCATE	0x0400

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8011);
    request.length = htons(sizeof(request));
    request.flags  = htonl(mode);
    if (pathname) { strncpy(request.pathname, pathname, 256); }

  -----------------------------
   0xBEEF8021 (close request)
   0xBEEF8022 (close response)
  -----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int fd; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8021);
    request.length = htons(sizeof(request));
    request.fd     = htonl(fd);

  ----------------------------
   0xBEEF8031 (read request)
   0xBEEF8032 (read response)
  ----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int fd, size; } request;
    struct { int number; short length; int result, size; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8031);
    request.length = htons(sizeof(request));
    request.fd     = htonl(fd);
    request.size   = htonl(size);

  -----------------------------
   0xBEEF8041 (write request)
   0xBEEF8042 (write response)
  -----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int fd, size; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8041);
    request.length = htons(sizeof(request));
    request.fd     = htonl(fd);
    request.size   = htonl(size);

  -----------------------------
   0xBEEF8051 (lseek request)
   0xBEEF8052 (lseek response)
  -----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int fd, offset, whence; } request;
    struct { int number; short length; int result; } response;

   WHENCE VALUES

    #define LSEEK_SET		0x0000
    #define LSEEK_CURRENT	0x0001
    #define LSEEK_END		0x0002

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8051);
    request.length = htons(sizeof(request));
    request.fd     = htonl(fd);
    request.offset = htonl(offset);
    request.whence = htonl(whence);

  -----------------------------
   0xBEEF8061 (ioctl request)
   0xBEEF8062 (ioctl response)
  -----------------------------

  ------------------------------
   0xBEEF8071 (delete request)
   0xBEEF8072 (delete response)
  ------------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char pathname[256]; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8071);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    if (pathname) { strncpy(request.pathname, pathname, 256); }

  -----------------------------
   0xBEEF8081 (mkdir request)
   0xBEEF8082 (mkdir response)
  -----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char pathname[256]; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8081);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    if (pathname) { strncpy(request.pathname, pathname, 256); }

  -----------------------------
   0xBEEF8091 (rmdir request)
   0xBEEF8092 (rmdir response)
  -----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char pathname[256]; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8091);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    if (pathname) { strncpy(request.pathname, pathname, 256); }

  ------------------------------
   0xBEEF80A1 (dopen request)
   0xBEEF80A2 (dopen response)
  ------------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char pathname[256]; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF80A1);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    if (pathname) { strncpy(request.pathname, pathname, 256); }

  ------------------------------
   0xBEEF80B1 (dclose request)
   0xBEEF80B2 (dclose response)
  ------------------------------

   PACKET STRUCTURES

    struct { int number; short length; int dd; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF80B1);
    request.length = htons(sizeof(request));
    request.dd     = htonl(dd);

  -----------------------------
   0xBEEF80C1 (dread request)
   0xBEEF80C2 (dread response)
  -----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int dd; } request;
    struct { int number; short length; int result; int mode, attr, size; char ctime[8], atime[8], mtime[8]; int hisize; char name[256]; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF80C1);
    request.length = htons(sizeof(request));
    request.dd     = htonl(dd);

  ------------------------------
   0xBEEF80F1 (format request)
   0xBEEF80F2 (format response)
  ------------------------------

   UNDOCUMENTED

  ------------------------------
   0xBEEF8111 (rename request)
   0xBEEF8112 (rename response)
  ------------------------------

   UNDOCUMENTED

  ----------------------------
   0xBEEF8131 (sync request)
   0xBEEF8132 (sync response)
  ----------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char device[256]; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8131);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    if (device) { strncpy(request.device, device, 256); }

  -----------------------------
   0xBEEF8141 (mount request)
   0xBEEF8142 (mount response)
  -----------------------------

   PACKET STRUCTURES

    struct { int number; short length; char device[256], fsname[256]; int flags; char argv[256]; int argc; } request;
    struct { int number; short length; int result; } response;

   FLAG VALUES

    #define MOUNT_READWRITE	0x00
    #define MOUNT_READONLY	0x01

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8141);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    request.argc   = htonl(argc);
    if (device) { strncpy(request.device, device, 256); }
    if (fsname) { strncpy(request.fsname, fsname, 256); }
    if (argv) { strncpy(request.argv, argv, 256); }

  ------------------------------
   0xBEEF8151 (umount request)
   0xBEEF8152 (umount response)
  ------------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char device[256]; } request;
    struct { int number; short length; int result; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8151);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    if (device) { strncpy(request.device, device, 256); }

  -------------------------------
   0xBEEF8F21 (devlist request)
   0xBEEF8F22 (devlist response)
  -------------------------------

   PACKET STRUCTURES

    struct { int number; short length; int flags; char pathname[256]; } request;
    struct { int number; short length; int result; int count; char devlist[256]; } response;

   REQUEST PACKET CONTENTS

    request.number = htonl(0xBEEF8F21);
    request.length = htons(sizeof(request));
    request.flags  = htonl(flags);
    if (pathname) { strncpy(request.pathname, pathname, 256); }