/*
 * Copyright (C) 2006, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <errno.h>
#include <netinet/in.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>

#include "osi/include/socket_utils/socket_local.h"
#include "osi/include/socket_utils/sockets.h"

#define LISTEN_BACKLOG 4

/* Only the bottom bits are really the socket type; there are flags too. */
#define SOCK_TYPE_MASK 0xf

/**
 * Binds a pre-created socket(AF_LOCAL) 's' to 'name'
 * returns 's' on success, -1 on fail
 *
 * Does not call listen()
 */
int osi_socket_local_server_bind(int s, const char* name, int namespaceId) {
  struct sockaddr_un addr;
  socklen_t alen;
  int n;
  int err;

  err = osi_socket_make_sockaddr_un(name, namespaceId, &addr, &alen);

  if (err < 0) {
    return -1;
  }

/* basically: if this is a filesystem path, unlink first */
#if !defined(__linux__)
  if (1) {
#else
  if (namespaceId == ANDROID_SOCKET_NAMESPACE_RESERVED ||
      namespaceId == ANDROID_SOCKET_NAMESPACE_FILESYSTEM) {
#endif
    /*ignore ENOENT*/
    unlink(addr.sun_path);
  }

  n = 1;
  setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));

  if (bind(s, (struct sockaddr*)&addr, alen) < 0) {
    return -1;
  }

  return s;
}

/** Open a server-side UNIX domain datagram socket in the Linux non-filesystem
 *  namespace
 *
 *  Returns fd on success, -1 on fail
 */
int osi_socket_local_server(const char* name, int namespaceId, int type) {
  int err;
  int s;

  s = socket(AF_LOCAL, type, 0);
  if (s < 0) return -1;

  err = osi_socket_local_server_bind(s, name, namespaceId);

  if (err < 0) {
    close(s);
    return -1;
  }

  if ((type & SOCK_TYPE_MASK) == SOCK_STREAM) {
    int ret;

    ret = listen(s, LISTEN_BACKLOG);

    if (ret < 0) {
      close(s);
      return -1;
    }
  }

  return s;
}
