d:\linux\linuxkernel\WORKING_DIRECTORY\android-omap-20111108-gingerbread\system\core\init\util.c
/*
* create_socket - creates a Unix domain socket in ANDROID_SOCKET_DIR
* ("/dev/socket") as dictated in init.rc. This socket is inherited by the
* daemon. We communicate the file descriptor's value via the environment
* variable ANDROID_SOCKET_ENV_PREFIX<name> ("ANDROID_SOCKET_foo").
* http://blog.csdn.net/sanbrother/article/details/4031353
* https://www.allegro.cc/forums/thread/370013/370226#target
* D:\linux\linuxkernel\WORKING_DIRECTORY\ango\init\socket\MinGW Socket.c
*/
#define D_HOST "localhost"
#define D_PORT 4344
int create_socket(const char *name, int type, mode_t perm, uid_t uid, gid_t gid)
{
// struct sockaddr_un addr;
struct sockaddr_in addr;
struct hostent *host;
// int fd, ret;
int result;
unsigned int descriptor;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData)){
printf("Failed to WSAStartup '%s': %s\n", name, strerror(errno));
ERROR("Failed to WSAStartup '%s': %s\n", name, strerror(errno));
return -1;
}
/* create a socket */
descriptor = socket(PF_INET, SOCK_STREAM, 0);
if (descriptor == -1) {
printf("Failed to open socket '%s': %s\n", name, strerror(errno));
ERROR("Failed to open socket '%s': %s\n", name, strerror(errno));
// perror("socket");
return (1);
}
// fd = socket(PF_UNIX, type, 0);
// if (fd < 0) {
// printf("Failed to open socket '%s': %s\n", name, strerror(errno));
// ERROR("Failed to open socket '%s': %s\n", name, strerror(errno));
// return -1;
// }
// memset(&addr, 0 , sizeof(addr));
// addr.sun_family = AF_UNIX;
// snprintf(addr.sun_path, sizeof(addr.sun_path), ANDROID_SOCKET_DIR"/%s",
// name);
//
// ret = unlink(addr.sun_path);
// if (ret != 0 && errno != ENOENT) {
// ERROR("Failed to unlink old socket '%s': %s\n", name, strerror(errno));
// goto out_close;
// }
/* get information about the host */
memset(&addr, 0, sizeof(addr));
host = gethostbyname(D_HOST);
if (host == NULL) {
printf("Failed to gethostbyname '%s': %s\n", name, strerror(errno));
perror("gethostbyname");
closesocket(descriptor);
WSACleanup();
return (1);
}
/* bind the socket to an address and port */
memcpy(&addr.sin_addr, host->h_addr_list[0], sizeof(host->h_addr_list[0]));
addr.sin_family = AF_INET;
addr.sin_port = htons(D_PORT);
result = bind(descriptor, (struct sockaddr *)&addr, sizeof(addr));
if (result == -1) {
printf("Failed to bind '%s': %s\n", name, strerror(errno));
perror("bind");
closesocket(descriptor);
WSACleanup();
return (1);
}
// ret = bind(fd, (struct sockaddr *) &addr, sizeof (addr));
// if (ret) {
// ERROR("Failed to bind socket '%s': %s\n", name, strerror(errno));
// goto out_unlink;
// }
// chown(addr.sun_path, uid, gid);
// chmod(addr.sun_path, perm);
// INFO("Created socket '%s' with mode '%o', user '%d', group '%d'\n",
// addr.sun_path, perm, uid, gid);
// return fd;
return descriptor;
//out_unlink:
// unlink(addr.sun_path);
//out_close:
// close(fd);
// return -1;
}
/*
* create_socket - creates a Unix domain socket in ANDROID_SOCKET_DIR
* ("/dev/socket") as dictated in init.rc. This socket is inherited by the
* daemon. We communicate the file descriptor's value via the environment
* variable ANDROID_SOCKET_ENV_PREFIX<name> ("ANDROID_SOCKET_foo").
* http://blog.csdn.net/sanbrother/article/details/4031353
* https://www.allegro.cc/forums/thread/370013/370226#target
* D:\linux\linuxkernel\WORKING_DIRECTORY\ango\init\socket\MinGW Socket.c
*/
#define D_HOST "localhost"
#define D_PORT 4344
int create_socket(const char *name, int type, mode_t perm, uid_t uid, gid_t gid)
{
// struct sockaddr_un addr;
struct sockaddr_in addr;
struct hostent *host;
// int fd, ret;
int result;
unsigned int descriptor;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData)){
printf("Failed to WSAStartup '%s': %s\n", name, strerror(errno));
ERROR("Failed to WSAStartup '%s': %s\n", name, strerror(errno));
return -1;
}
/* create a socket */
descriptor = socket(PF_INET, SOCK_STREAM, 0);
if (descriptor == -1) {
printf("Failed to open socket '%s': %s\n", name, strerror(errno));
ERROR("Failed to open socket '%s': %s\n", name, strerror(errno));
// perror("socket");
return (1);
}
// fd = socket(PF_UNIX, type, 0);
// if (fd < 0) {
// printf("Failed to open socket '%s': %s\n", name, strerror(errno));
// ERROR("Failed to open socket '%s': %s\n", name, strerror(errno));
// return -1;
// }
// memset(&addr, 0 , sizeof(addr));
// addr.sun_family = AF_UNIX;
// snprintf(addr.sun_path, sizeof(addr.sun_path), ANDROID_SOCKET_DIR"/%s",
// name);
//
// ret = unlink(addr.sun_path);
// if (ret != 0 && errno != ENOENT) {
// ERROR("Failed to unlink old socket '%s': %s\n", name, strerror(errno));
// goto out_close;
// }
/* get information about the host */
memset(&addr, 0, sizeof(addr));
host = gethostbyname(D_HOST);
if (host == NULL) {
printf("Failed to gethostbyname '%s': %s\n", name, strerror(errno));
perror("gethostbyname");
closesocket(descriptor);
WSACleanup();
return (1);
}
/* bind the socket to an address and port */
memcpy(&addr.sin_addr, host->h_addr_list[0], sizeof(host->h_addr_list[0]));
addr.sin_family = AF_INET;
addr.sin_port = htons(D_PORT);
result = bind(descriptor, (struct sockaddr *)&addr, sizeof(addr));
if (result == -1) {
printf("Failed to bind '%s': %s\n", name, strerror(errno));
perror("bind");
closesocket(descriptor);
WSACleanup();
return (1);
}
// ret = bind(fd, (struct sockaddr *) &addr, sizeof (addr));
// if (ret) {
// ERROR("Failed to bind socket '%s': %s\n", name, strerror(errno));
// goto out_unlink;
// }
// chown(addr.sun_path, uid, gid);
// chmod(addr.sun_path, perm);
// INFO("Created socket '%s' with mode '%o', user '%d', group '%d'\n",
// addr.sun_path, perm, uid, gid);
// return fd;
return descriptor;
//out_unlink:
// unlink(addr.sun_path);
//out_close:
// close(fd);
// return -1;
}