Subversion Repositories HelenOS

Rev

Rev 2401 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2401 Rev 2403
Line 64... Line 64...
64
static int new_consument_map(void);
64
static int new_consument_map(void);
65
 
65
 
66
static void fs_connection(ipc_callid_t iid, ipc_call_t *icall)
66
static void fs_connection(ipc_callid_t iid, ipc_call_t *icall)
67
{
67
{
68
 
68
 
69
    int result;
69
    int result = 0;
-
 
70
    ipcarg_t arg = 0;
70
 
71
 
71
    ipc_answer_fast(iid, 0, 0, 0);
72
    ipc_answer_fast(iid, 0, 0, 0);
72
 
73
   
73
    while (1)
74
    while (1)
74
    {
75
    {
75
        prepare_message();
76
        prepare_message();
76
       
77
       
-
 
78
        switch (fs_call)
-
 
79
        {
77
        if (fs_call == IPC_M_PHONE_HUNGUP) {
80
            case IPC_M_PHONE_HUNGUP:
78
            ipc_answer_fast(callid, 0,0,0);
81
                ipc_answer_fast(callid, 0,0,0);
79
            return;
82
                return;
80
        }
-
 
81
 
83
 
82
        if (fs_call == FS_NEW_CONSUMER) {
84
            case FS_NEW_CONSUMER:
83
            if (!new_consument) {
85
                if (!new_consument) {
84
                ipc_answer_fast(callid, FS_ECONNECT, 0, 0);
-
 
85
            }
-
 
86
            else {
-
 
87
                result = new_consument_map();  
86
                    result = FS_ECONNECT;  
88
                ipc_answer_fast(callid, result, 0, 0);
-
 
89
 
-
 
90
                if (!result) {
-
 
91
                    new_consument = FALSE;     
-
 
92
                }
87
                }
93
            }
88
                else {
-
 
89
                    result = new_consument_map();  
94
            continue;  
90
                    if (!result) {
-
 
91
                        new_consument = FALSE;     
-
 
92
                    }
95
        }
93
                }
-
 
94
                break;
96
 
95
 
97
        if (fs_call == IPC_M_AS_AREA_SEND) {
96
            case IPC_M_AS_AREA_SEND:
98
            if (!new_consument)
97
                if (!new_consument)
99
                ipc_answer_fast(callid, FS_ECONNECT, 0, 0);    
98
                    result = FS_ECONNECT;      
100
            else {
99
                else {
-
 
100
                    result = 0;
101
                ipc_answer_fast(callid, 0, (uintptr_t)fp->buffer, 0);
101
                    arg = (uintptr_t)fp->buffer;
102
                fp = &fproc[new_consument];
102
                    fp = &fproc[new_consument];
103
                fp->connected = TRUE;
103
                    fp->connected = TRUE;
104
                new_consument = FALSE;
104
                    new_consument = FALSE;
105
            }
105
                }
106
            continue;
106
                break;
107
        }
-
 
108
 
107
 
109
        if (fs_call == FS_DROP_CONSUMER) {
108
            case FS_DROP_CONSUMER:
110
            fproc->connected = FALSE;
109
                fproc->connected = FALSE;
111
            fproc->buffer = NULL;
110
                fproc->buffer = NULL;
-
 
111
                result = 0;
-
 
112
                break;
-
 
113
 
-
 
114
            default:
-
 
115
                if (check_con < 0) {
-
 
116
                    result = err_code;
-
 
117
                    check_con = TRUE;
-
 
118
                    break; 
-
 
119
                }
112
            ipc_answer_fast(callid, 0, 0, 0);
120
                if (FS_IN_RANGE(fs_call)) {  
-
 
121
                    result = call_vector[fs_call-FS_BASE]();
-
 
122
                }
-
 
123
                else {
-
 
124
                    result = FS_EBADCALL;
113
       
125
                }
114
            continue;
126
                break; 
-
 
127
           
115
        }
128
        }
116
   
129
   
117
        if (check_con < 0) {
-
 
118
            ipc_answer_fast(callid, err_code, 0, 0);
130
        ipc_answer_fast(callid, result, arg, 0);
119
            check_con = TRUE;
-
 
120
            continue;  
131
        arg = 0;       
121
        }
-
 
122
 
-
 
123
        if (FS_IN_RANGE(fs_call)) {  
-
 
124
           result = call_vector[fs_call-FS_BASE]();
-
 
125
        }
-
 
126
        else {
-
 
127
           result = FS_EBADCALL;
-
 
128
        }
-
 
129
 
-
 
130
        ipc_answer_fast(callid, result, 0, 0);             
-
 
131
    }  
132
    }  
132
}
133
}
133
 
134
 
134
/* Extracts parameters from message and prepare them for later usage. */
135
/* Extracts parameters from message and prepare them for later usage. */
135
void prepare_message(void)
136
void prepare_message(void)
136
{
137
{
137
   
138
   
138
    int shift, id_task;
139
    int shift, id_task;
-
 
140
 
139
   
141
 
140
    callid = async_get_call(&m_input);
142
    callid = async_get_call(&m_input);
141
    fs_call = IPC_GET_METHOD(m_input);
143
    fs_call = IPC_GET_METHOD(m_input);
142
   
144
   
143
    if (fs_call == IPC_M_AS_AREA_SEND) {   
145
    if (fs_call == IPC_M_AS_AREA_SEND) {   
144
        if (!new_consument) {
146
        if (!new_consument) {