Просмотр исходного кода

!141 rt-smart增加rename系统调用,解决创建socket系统崩溃
Merge pull request !141 from eason1q87/rt-smart

bernard 5 лет назад
Родитель
Сommit
cb326b38a8
2 измененных файлов с 26 добавлено и 3 удалено
  1. 6 0
      components/lwp/lwp_syscall.c
  2. 20 3
      components/net/sal_socket/socket/net_sockets.c

+ 6 - 0
components/lwp/lwp_syscall.c

@@ -2514,6 +2514,11 @@ int sys_pmutex(void *umutex, int op, void *arg);
 int sys_dup(int oldfd);
 int sys_dup2(int oldfd, int new);
 
+int sys_rename(const char *oldpath,const char *newpath)
+{
+    return rename(oldpath,newpath);
+}
+
 const static void* func_table[] =
 {
     (void*)sys_exit,            /* 01 */
@@ -2666,6 +2671,7 @@ const static void* func_table[] =
     (void *)sys_pmutex,
     (void *)sys_dup,
     (void *)sys_dup2,
+    (void *)sys_rename,			/* 135 */
 };
 
 const void *lwp_get_sys_api(rt_uint32_t number)

+ 20 - 3
components/net/sal_socket/socket/net_sockets.c

@@ -205,15 +205,26 @@ int socket(int domain, int type, int protocol)
         return -1;
     }
     d = fd_get(fd);
+    d->fnode = (struct dfs_fnode *)rt_malloc(sizeof(struct dfs_fnode));
+    if (!d->fnode)
+    {
+        /* release fd */
+        fd_release(fd);
+        rt_set_errno(-ENOMEM);
+        return -1;
+    }
 
     /* create socket  and then put it to the dfs_fd */
     socket = sal_socket(domain, type, protocol);
     if (socket >= 0)
     {
+        rt_memset(d->fnode, 0, sizeof(struct dfs_fnode));
+        rt_list_init(&d->fnode->list);
         /* this is a socket fd */
         d->fnode->type = FT_SOCKET;
         d->fnode->path = NULL;
-
+        d->fnode->fullpath = NULL;
+        d->fnode->ref_count = 1;
         d->fnode->fops = dfs_net_get_fops();
 
         d->fnode->flags = O_RDWR; /* set flags as read and write */
@@ -227,9 +238,8 @@ int socket(int domain, int type, int protocol)
     {
         /* release fd */
         fd_release(fd);
-
         rt_set_errno(-ENOMEM);
-
+        rt_free(d->fnode);
         return -1;
     }
 
@@ -257,6 +267,12 @@ int closesocket(int s)
         return -1;
     }
 
+    if (!d->fnode)
+    {
+        rt_set_errno(-EBADF);
+        return -1;
+    }
+
     if (sal_closesocket(socket) == 0)
     {
         error = 0;
@@ -269,6 +285,7 @@ int closesocket(int s)
 
     /* socket has been closed, delete it from file system fd */
     fd_release(s);
+    rt_free(d->fnode);
 
     return error;
 }