open method

*[<Null safety>](https://dart.dev/null-safety)*
  • @override

void open (dynamic flags, int mode, String path, InterfaceRequest request, [dynamic parentFlags])

override

Implementation

@override
void open(OpenFlags flags, int mode, String path,
    fidl.InterfaceRequest<Node> request,
    [OpenFlags? parentFlags]) {
  if (path.startsWith('/') || path == '') {
    sendErrorEvent(flags, ZX.ERR_BAD_PATH, request);
    return;
  }
  var p = path;
  // remove all ./, .//, etc
  while (p.startsWith('./')) {
    var index = 2;
    while (index < p.length && p[index] == '/') {
      index++;
    }
    p = p.substring(index);
  }

  parentFlags ??= Flags.fsRightsDefault();
  if (p == '.' || p == '') {
    connect(flags, mode, request, parentFlags);
    return;
  }
  final index = p.indexOf('/');
  final key = index == -1 ? p : p.substring(0, index);
  if (!_isLegalObjectName(key)) {
    sendErrorEvent(flags, ZX.ERR_BAD_PATH, request);
  } else if (_entries.containsKey(key)) {
    final e = _entries[key];
    // final element, open it
    if (index == -1) {
      e!.node!.connect(flags, mode, request, parentFlags);
      return;
    } else if (index == p.length - 1) {
      // '/' is at end, should be a directory, add flag
      e!.node!
          .connect(flags | OpenFlags.directory, mode, request, parentFlags);
      return;
    } else {
      // forward request to child Vnode and let it handle rest of path.
      return e!.node!
          .open(flags, mode, p.substring(index + 1), request, parentFlags);
    }
  } else {
    sendErrorEvent(flags, ZX.ERR_NOT_FOUND, request);
  }
}