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 }