• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <dirent.h>
17 #include <fcntl.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <unistd.h>
21 #include "test.h"
22 
23 /**
24  * @tc.name      : symlinkat_0100
25  * @tc.desc      : Create a symbolic link to the specified file
26  * @tc.level     : Level 0
27  */
symlinkat_0100(void)28 void symlinkat_0100(void)
29 {
30     char buffer[BUFSIZ];
31     char *path_name = "/data";
32     char *file_name = "/data/symlinkat.txt";
33     char *symlink_name = "mysymlinkat";
34     ssize_t sz;
35     DIR *dp;
36     int fdd, fdf;
37 
38     fdf = creat(file_name, O_RDWR | O_CREAT);
39     if (fdf == -1) {
40         t_error("%s creat failed", __func__);
41     }
42 
43     dp = opendir(path_name);
44     if (dp == NULL) {
45         t_error("%s opendir failed", __func__);
46         return;
47     }
48 
49     fdd = dirfd(dp);
50     if (fdd < 0) {
51         t_error("%s dirfd failed", __func__);
52         return;
53     }
54 
55     if (symlinkat(file_name, fdd, symlink_name) < 0) {
56         t_error("%s symlinkat failed", __func__);
57         return;
58     }
59 
60     memset(buffer, 0, sizeof(buffer));
61     sz = readlinkat(fdd, symlink_name, buffer, sizeof(buffer));
62     if (sz < 0) {
63         t_error("%s readlinkat failed", __func__);
64         return;
65     }
66 
67     if (strcmp(buffer, file_name)) {
68         t_error("%s buffer is %s, not %s", __func__, buffer, file_name);
69     }
70 
71     unlinkat(fdd, symlink_name, 0);
72     unlink(file_name);
73 }
74 
75 /**
76  * @tc.name      : symlinkat_0200
77  * @tc.desc      : The file pointed to by the parameter existing does not exist
78  * @tc.level     : Level 1
79  */
symlinkat_0200(void)80 void symlinkat_0200(void)
81 {
82     char buffer[BUFSIZ];
83     char *path_name = "/data";
84     char *file_name = "/data/symlinkat.txt";
85     char *symlink_name = "mysymlinkat";
86     ssize_t sz;
87     DIR *dp;
88     int fd;
89 
90     dp = opendir(path_name);
91     if (dp == NULL) {
92         t_error("%s opendir failed", __func__);
93         return;
94     }
95 
96     fd = dirfd(dp);
97     if (fd < 0) {
98         t_error("%s dirfd failed", __func__);
99         return;
100     }
101 
102     if (symlinkat(file_name, fd, symlink_name) < 0) {
103         t_error("%s symlinkat failed", __func__);
104         return;
105     }
106 
107     unlinkat(fd, symlink_name, 0);
108 }
109 
main(int argc,char * argv[])110 int main(int argc, char *argv[])
111 {
112     symlinkat_0100();
113     symlinkat_0200();
114     return t_status;
115 }