1c6d43980SLemover /***************************************************************************************
2c6d43980SLemover * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*f320e0f0SYinan Xu * Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover *
5c6d43980SLemover * XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover * You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover * You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover * http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover *
10c6d43980SLemover * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover *
14c6d43980SLemover * See the Mulan PSL v2 for more details.
15c6d43980SLemover ***************************************************************************************/
16c6d43980SLemover
17ba6bb9d6SLinJiawei #include<unistd.h>
18ba6bb9d6SLinJiawei #include<stdio.h>
19ba6bb9d6SLinJiawei #include<stdlib.h>
20ba6bb9d6SLinJiawei #include<sys/stat.h>
21ba6bb9d6SLinJiawei #include<fcntl.h>
225bcf051aSLinJiawei #include<string.h>
235bcf051aSLinJiawei
245bcf051aSLinJiawei #define BUF_SIZE 32
25ba6bb9d6SLinJiawei
tryLock(char * file)26ba6bb9d6SLinJiawei int tryLock(char * file){
275bcf051aSLinJiawei return open(file, O_CREAT | O_EXCL | O_WRONLY, 0666);
28ba6bb9d6SLinJiawei }
29ba6bb9d6SLinJiawei
main(int argc,char * argv[])30ba6bb9d6SLinJiawei int main(int argc, char* argv[]){
31ba6bb9d6SLinJiawei int fd;
325bcf051aSLinJiawei char user[BUF_SIZE];
33ba6bb9d6SLinJiawei if(argc < 2){
34ba6bb9d6SLinJiawei printf("arguments are not right!\n");
35ba6bb9d6SLinJiawei exit(-1);
36ba6bb9d6SLinJiawei }
37ba6bb9d6SLinJiawei
38ba6bb9d6SLinJiawei do{
39ba6bb9d6SLinJiawei fd = tryLock(argv[1]);
405bcf051aSLinJiawei if(fd > 0){
415bcf051aSLinJiawei getlogin_r(user, BUF_SIZE);
42392c1d91SZhangZifei int len = strlen(user);
43392c1d91SZhangZifei user[len] = '\0';
44392c1d91SZhangZifei write(fd, user, len+1);
455bcf051aSLinJiawei break;
465bcf051aSLinJiawei } else {
475bcf051aSLinJiawei // someone is holding the lock...
485bcf051aSLinJiawei fd = open(argv[1], O_RDONLY);
495bcf051aSLinJiawei if(fd > 0){
505bcf051aSLinJiawei read(fd, user, BUF_SIZE);
515bcf051aSLinJiawei printf("%s is holding the lock, waiting ...\n", user);
525bcf051aSLinJiawei }
535bcf051aSLinJiawei }
54ba6bb9d6SLinJiawei sleep(10);
55ba6bb9d6SLinJiawei } while(1);
56ba6bb9d6SLinJiawei
57ba6bb9d6SLinJiawei return 0;
58ba6bb9d6SLinJiawei }
59ba6bb9d6SLinJiawei
60