-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathprivsock.c
116 lines (107 loc) · 2.58 KB
/
privsock.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "privsock.h"
void priv_sock_init(session_t *sess){
int sockfds[2];
if(socketpair(PF_UNIX, SOCK_STREAM, 0, sockfds) < 0) ERR_EXIT("socketpair");
sess->parent_fd = sockfds[0];
sess->child_fd = sockfds[1];
}
void priv_sock_close(session_t *sess){
if(sess->child_fd){
close(sess->child_fd);
sess->child_fd = -1;
}
if(sess->parent_fd != -1){
close(sess->parent_fd);
sess->parent_fd = -1;
}
}
void priv_sock_set_parent_context(session_t *sess){
if(sess->child_fd){
close(sess->child_fd);
sess->child_fd = -1;
}
}
void priv_sock_set_child_context(session_t *sess){
if(sess->parent_fd != -1){
close(sess->parent_fd);
sess->parent_fd = -1;
}
}
void priv_sock_send_cmd(int fd, char cmd){
int ret= writen(fd, &cmd, sizeof(cmd));
if(ret != sizeof(cmd)){
fprintf(stderr, "priv_sock_send_cmd error\n");
exit(EXIT_FAILURE);
}
}
char priv_sock_get_cmd(int fd){
char res;
int ret = readn(fd, &res, sizeof res);
if(ret == 0){
printf("Ftp process exit\n");
exit(EXIT_SUCCESS);
}
if(ret != sizeof(res)){
fprintf(stderr, "priv_sock_get_cmd error\n");
exit(EXIT_FAILURE);
}
return res;
}
void priv_sock_send_result(int fd,char res){
int ret = writen(fd, &res, sizeof res);
if(ret != sizeof(res)){
fprintf(stderr, "priv_sock_send_result error\n");
exit(EXIT_FAILURE);
}
}
char priv_sock_get_result(int fd){
char res;
int ret = readn(fd, &res, sizeof(res));
if(ret != sizeof(res)){
fprintf(stderr, "priv_sock_get_result error\n");
exit(EXIT_FAILURE);
}
return res;
}
void priv_sock_send_int(int fd,int the_int){
int ret = writen(fd, &the_int, sizeof the_int);
if(ret != sizeof(the_int)){
fprintf(stderr, "priv_sock_send_int error\n");
exit(EXIT_FAILURE);
}
}
int priv_sock_get_int(int fd){
int res;
int ret = readn(fd, &res, sizeof res);
if(ret != sizeof(res)){
fprintf(stderr, "priv_sock_get_int error\n");
exit(EXIT_FAILURE);
}
return res;
}
void priv_sock_send_buf(int fd,const char *buf,unsigned int len){
priv_sock_send_int(fd,(int)len);
int ret = writen(fd, buf,len);
if(ret != (int)len){
fprintf(stderr, "priv_sock_send_buf error\n");
exit(EXIT_FAILURE);
}
}
void priv_sock_recv_buf(int fd, char *buf,unsigned int len){
unsigned int recv_len = (unsigned)priv_sock_get_int(fd);
if(recv_len > len){
fprintf(stderr, "priv_sock_recv_buf error\n");
exit(EXIT_FAILURE);
}
int ret = readn(fd, buf, recv_len);
if(ret != (int)recv_len){
fprintf(stderr, "priv_sock_recv_buf error\n");
exit(EXIT_FAILURE);
}
}
void priv_sock_send_fd(int sock_fd,int fd){
send_fd(sock_fd,fd);
}
int priv_sock_recv_fd(int sock_fd){
return recv_fd(sock_fd);
}