Various sysfs related fixes
[mirror/scst/.git] / iscsi-scst / usr / conn.c
1 /*
2  *  Copyright (C) 2002 - 2003 Ardis Technolgies <roman@ardistech.com>
3  *  Copyright (C) 2007 - 2009 Vladislav Bolkhovitin
4  *  Copyright (C) 2007 - 2009 ID7 Ltd.
5  *
6  *  This program is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU General Public License
8  *  as published by the Free Software Foundation, version 2
9  *  of the License.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  *  GNU General Public License for more details.
15  */
16
17 #include <ctype.h>
18 #include <dirent.h>
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <errno.h>
23 #include <sys/stat.h>
24
25 #include "iscsid.h"
26
27 #define ISCSI_CONN_NEW          1
28 #define ISCSI_CONN_EXIT         5
29
30 struct connection *conn_alloc(void)
31 {
32         struct connection *conn;
33
34         conn = malloc(sizeof(*conn));
35         if (conn == NULL)
36                 goto out;
37
38         memset(conn, 0, sizeof(*conn));
39         conn->state = STATE_FREE;
40         param_set_defaults(conn->session_param, session_keys);
41         INIT_LIST_HEAD(&conn->rsp_buf_list);
42
43 out:
44         return conn;
45 }
46
47 void conn_free(struct connection *conn)
48 {
49         remque(&conn->clist);
50         free(conn->initiator);
51         free(conn->user);
52         free(conn);
53         return;
54 }
55
56 void conn_pass_to_kern(struct connection *conn, int fd)
57 {
58         int err;
59
60         log_debug(1, "fd %d, cid %u, stat_sn %u, exp_stat_sn %u sid %" PRIx64,
61                 fd, conn->cid, conn->stat_sn, conn->exp_stat_sn, conn->sid.id64);
62
63         err = kernel_conn_create(conn->tid, conn->sess->sid.id64, conn->cid,
64                               conn->stat_sn, conn->exp_stat_sn, fd);
65
66         /* We don't need to return err, because we are going to close conn anyway */
67         return;
68 }
69
70 void conn_read_pdu(struct connection *conn)
71 {
72         conn->iostate = IOSTATE_READ_BHS;
73         conn->buffer = (void *)&conn->req.bhs;
74         conn->rwsize = BHS_SIZE;
75         return;
76 }
77
78 void conn_write_pdu(struct connection *conn)
79 {
80         conn->iostate = IOSTATE_WRITE_BHS;
81         memset(&conn->rsp, 0, sizeof(conn->rsp));
82         conn->buffer = (void *)&conn->rsp.bhs;
83         conn->rwsize = BHS_SIZE;
84         return;
85 }
86
87 void conn_free_rsp_buf_list(struct connection *conn)
88 {
89         struct buf_segment *seg, *tmp;
90
91         list_for_each_entry_safe(seg, tmp, &conn->rsp_buf_list, entry) {
92                 list_del(&seg->entry);
93                 free(seg);
94         }
95
96         conn->rsp.datasize = 0;
97         conn->rsp.data = NULL;
98         return;
99 }
100
101 void conn_free_pdu(struct connection *conn)
102 {
103         conn->iostate = IOSTATE_FREE;
104         if (conn->req.ahs) {
105                 free(conn->req.ahs);
106                 conn->req.ahs = NULL;
107         }
108         if (conn->rsp.ahs) {
109                 free(conn->rsp.ahs);
110                 conn->rsp.ahs = NULL;
111         }
112         conn_free_rsp_buf_list(conn);
113         return;
114 }