1*418b791dSBob Badour /*
2*418b791dSBob Badour * Copyright (c) 2019, The Linux Foundation. All rights reserved.
3*418b791dSBob Badour *
4*418b791dSBob Badour * Redistribution and use in source and binary forms, with or without
5*418b791dSBob Badour * modification, are permitted provided that the following conditions are
6*418b791dSBob Badour * met:
7*418b791dSBob Badour * * Redistributions of source code must retain the above copyright
8*418b791dSBob Badour * notice, this list of conditions and the following disclaimer.
9*418b791dSBob Badour * * Redistributions in binary form must reproduce the above
10*418b791dSBob Badour * copyright notice, this list of conditions and the following
11*418b791dSBob Badour * disclaimer in the documentation and/or other materials provided
12*418b791dSBob Badour * with the distribution.
13*418b791dSBob Badour * * Neither the name of The Linux Foundation nor the names of its
14*418b791dSBob Badour * contributors may be used to endorse or promote products derived
15*418b791dSBob Badour * from this software without specific prior written permission.
16*418b791dSBob Badour *
17*418b791dSBob Badour * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18*418b791dSBob Badour * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*418b791dSBob Badour * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20*418b791dSBob Badour * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21*418b791dSBob Badour * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*418b791dSBob Badour * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*418b791dSBob Badour * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24*418b791dSBob Badour * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25*418b791dSBob Badour * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26*418b791dSBob Badour * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*418b791dSBob Badour * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*418b791dSBob Badour */
29*418b791dSBob Badour
30*418b791dSBob Badour #ifdef _WIN32
31*418b791dSBob Badour #ifndef _CRT_SECURE_NO_WARNINGS
32*418b791dSBob Badour #define _CRT_SECURE_NO_WARNINGS
33*418b791dSBob Badour #endif// _CRT_SECURE_NO_WARNINGS
34*418b791dSBob Badour
35*418b791dSBob Badour #pragma warning( disable : 4996 )
36*418b791dSBob Badour #define strtok_r strtok_s
37*418b791dSBob Badour #define S_ISDIR(mode) (mode & S_IFDIR)
38*418b791dSBob Badour #endif //_WIN32
39*418b791dSBob Badour
40*418b791dSBob Badour #ifndef VERIFY_PRINT_ERROR
41*418b791dSBob Badour #define VERIFY_PRINT_ERROR
42*418b791dSBob Badour #endif //VERIFY_PRINT_ERROR
43*418b791dSBob Badour #define FARF_ERROR 1
44*418b791dSBob Badour
45*418b791dSBob Badour #include <stdlib.h>
46*418b791dSBob Badour #include <errno.h>
47*418b791dSBob Badour #include <string.h>
48*418b791dSBob Badour #include <pthread.h>
49*418b791dSBob Badour #include <dlfcn.h>
50*418b791dSBob Badour #include <dirent.h>
51*418b791dSBob Badour #include <sys/types.h>
52*418b791dSBob Badour #include <sys/stat.h>
53*418b791dSBob Badour #include <stdio.h>
54*418b791dSBob Badour #include "remote.h"
55*418b791dSBob Badour #include "verify.h"
56*418b791dSBob Badour #include "apps_std.h"
57*418b791dSBob Badour #include "AEEstd.h"
58*418b791dSBob Badour #include "AEEStdErr.h"
59*418b791dSBob Badour #include "AEEatomic.h"
60*418b791dSBob Badour #include "AEEQList.h"
61*418b791dSBob Badour #include "platform_libs.h"
62*418b791dSBob Badour #include "fastrpc_apps_user.h"
63*418b791dSBob Badour #include "HAP_farf.h"
64*418b791dSBob Badour #include "rpcmem.h"
65*418b791dSBob Badour
66*418b791dSBob Badour #ifndef _WIN32
67*418b791dSBob Badour #include <unistd.h>
68*418b791dSBob Badour #endif // _WiN32
69*418b791dSBob Badour
70*418b791dSBob Badour #ifndef C_ASSERT
71*418b791dSBob Badour #define C_ASSERT(test) \
72*418b791dSBob Badour switch(0) {\
73*418b791dSBob Badour case 0:\
74*418b791dSBob Badour case test:;\
75*418b791dSBob Badour }
76*418b791dSBob Badour #endif //C_ASSERT
77*418b791dSBob Badour
78*418b791dSBob Badour #define APPS_FD_BASE 100
79*418b791dSBob Badour #define ERRNO (errno == 0 ? -1 : errno)
80*418b791dSBob Badour #define APPS_STD_STREAM_FILE 1
81*418b791dSBob Badour #define APPS_STD_STREAM_BUF 2
82*418b791dSBob Badour
83*418b791dSBob Badour #define ION_HEAP_ID_QSEECOM 27
84*418b791dSBob Badour
85*418b791dSBob Badour #define FREEIF(pv) \
86*418b791dSBob Badour do {\
87*418b791dSBob Badour if(pv) { \
88*418b791dSBob Badour void* tmp = (void*)pv;\
89*418b791dSBob Badour pv = 0;\
90*418b791dSBob Badour free(tmp);\
91*418b791dSBob Badour tmp = 0;\
92*418b791dSBob Badour } \
93*418b791dSBob Badour } while(0)
94*418b791dSBob Badour
95*418b791dSBob Badour extern int get_domain_id();
96*418b791dSBob Badour
97*418b791dSBob Badour struct apps_std_buf_info {
98*418b791dSBob Badour char* fbuf;
99*418b791dSBob Badour int flen;
100*418b791dSBob Badour int pos;
101*418b791dSBob Badour };
102*418b791dSBob Badour
103*418b791dSBob Badour struct apps_std_info {
104*418b791dSBob Badour QNode qn;
105*418b791dSBob Badour int type;
106*418b791dSBob Badour union {
107*418b791dSBob Badour FILE* stream;
108*418b791dSBob Badour struct apps_std_buf_info binfo;
109*418b791dSBob Badour } u;
110*418b791dSBob Badour apps_std_FILE fd;
111*418b791dSBob Badour };
112*418b791dSBob Badour
113*418b791dSBob Badour static QList apps_std_qlst;
114*418b791dSBob Badour static pthread_mutex_t apps_std_mt;
115*418b791dSBob Badour
116*418b791dSBob Badour int setenv(const char *name, const char *value, int overwrite);
117*418b791dSBob Badour int unsetenv(const char *name);
118*418b791dSBob Badour
apps_std_init(void)119*418b791dSBob Badour int apps_std_init(void) {
120*418b791dSBob Badour QList_Ctor(&apps_std_qlst);
121*418b791dSBob Badour pthread_mutex_init(&apps_std_mt, 0);
122*418b791dSBob Badour return AEE_SUCCESS;
123*418b791dSBob Badour }
124*418b791dSBob Badour
apps_std_deinit(void)125*418b791dSBob Badour void apps_std_deinit(void) {
126*418b791dSBob Badour pthread_mutex_destroy(&apps_std_mt);
127*418b791dSBob Badour }
128*418b791dSBob Badour
129*418b791dSBob Badour PL_DEFINE(apps_std, apps_std_init, apps_std_deinit);
130*418b791dSBob Badour
apps_std_FILE_free(struct apps_std_info * sfree)131*418b791dSBob Badour static int apps_std_FILE_free(struct apps_std_info* sfree) {
132*418b791dSBob Badour int nErr = AEE_SUCCESS;
133*418b791dSBob Badour
134*418b791dSBob Badour pthread_mutex_lock(&apps_std_mt);
135*418b791dSBob Badour QNode_Dequeue(&sfree->qn);
136*418b791dSBob Badour pthread_mutex_unlock(&apps_std_mt);
137*418b791dSBob Badour
138*418b791dSBob Badour free(sfree);
139*418b791dSBob Badour sfree = NULL;
140*418b791dSBob Badour return nErr;
141*418b791dSBob Badour }
142*418b791dSBob Badour
apps_std_FILE_alloc(FILE * stream,apps_std_FILE * fd)143*418b791dSBob Badour static int apps_std_FILE_alloc(FILE *stream, apps_std_FILE *fd) {
144*418b791dSBob Badour struct apps_std_info *sinfo = 0, *info;
145*418b791dSBob Badour QNode *pn = 0;
146*418b791dSBob Badour apps_std_FILE prevfd = APPS_FD_BASE - 1;
147*418b791dSBob Badour int nErr = AEE_SUCCESS;
148*418b791dSBob Badour
149*418b791dSBob Badour VERIFYC(0 != (sinfo = calloc(1, sizeof(*sinfo))), AEE_ENOMEMORY);
150*418b791dSBob Badour QNode_CtorZ(&sinfo->qn);
151*418b791dSBob Badour sinfo->type = APPS_STD_STREAM_FILE;
152*418b791dSBob Badour pthread_mutex_lock(&apps_std_mt);
153*418b791dSBob Badour pn = QList_GetFirst(&apps_std_qlst);
154*418b791dSBob Badour if(pn) {
155*418b791dSBob Badour info = STD_RECOVER_REC(struct apps_std_info, qn, pn);
156*418b791dSBob Badour prevfd = info->fd;
157*418b791dSBob Badour QLIST_FOR_REST(&apps_std_qlst, pn) {
158*418b791dSBob Badour info = STD_RECOVER_REC(struct apps_std_info, qn, pn);
159*418b791dSBob Badour if (info->fd != prevfd + 1) {
160*418b791dSBob Badour sinfo->fd = prevfd + 1;
161*418b791dSBob Badour QNode_InsPrev(pn, &sinfo->qn);
162*418b791dSBob Badour break;
163*418b791dSBob Badour }
164*418b791dSBob Badour prevfd = info->fd;
165*418b791dSBob Badour }
166*418b791dSBob Badour }
167*418b791dSBob Badour if(!QNode_IsQueuedZ(&sinfo->qn)) {
168*418b791dSBob Badour sinfo->fd = prevfd + 1;
169*418b791dSBob Badour QList_AppendNode(&apps_std_qlst, &sinfo->qn);
170*418b791dSBob Badour }
171*418b791dSBob Badour pthread_mutex_unlock(&apps_std_mt);
172*418b791dSBob Badour
173*418b791dSBob Badour sinfo->u.stream = stream;
174*418b791dSBob Badour *fd = sinfo->fd;
175*418b791dSBob Badour
176*418b791dSBob Badour bail:
177*418b791dSBob Badour if(nErr) {
178*418b791dSBob Badour FREEIF(sinfo);
179*418b791dSBob Badour VERIFY_EPRINTF("Error %x: apps_std_FILE_alloc failed\n", nErr);
180*418b791dSBob Badour }
181*418b791dSBob Badour return nErr;
182*418b791dSBob Badour }
183*418b791dSBob Badour
apps_std_FILE_get(apps_std_FILE fd,struct apps_std_info ** info)184*418b791dSBob Badour static int apps_std_FILE_get(apps_std_FILE fd, struct apps_std_info** info) {
185*418b791dSBob Badour struct apps_std_info *sinfo = 0;
186*418b791dSBob Badour QNode *pn, *pnn;
187*418b791dSBob Badour FILE* stream = NULL;
188*418b791dSBob Badour int nErr = AEE_ENOSUCHSTREAM;
189*418b791dSBob Badour
190*418b791dSBob Badour pthread_mutex_lock(&apps_std_mt);
191*418b791dSBob Badour QLIST_NEXTSAFE_FOR_ALL(&apps_std_qlst, pn, pnn) {
192*418b791dSBob Badour sinfo = STD_RECOVER_REC(struct apps_std_info, qn, pn);
193*418b791dSBob Badour if(sinfo->fd == fd) {
194*418b791dSBob Badour *info = sinfo;
195*418b791dSBob Badour nErr = AEE_SUCCESS;
196*418b791dSBob Badour break;
197*418b791dSBob Badour }
198*418b791dSBob Badour }
199*418b791dSBob Badour pthread_mutex_unlock(&apps_std_mt);
200*418b791dSBob Badour
201*418b791dSBob Badour return nErr;
202*418b791dSBob Badour }
203*418b791dSBob Badour
apps_std_FILE_set_buffer_stream(struct apps_std_info * sinfo,char * fbuf,int flen,int pos)204*418b791dSBob Badour static void apps_std_FILE_set_buffer_stream(struct apps_std_info* sinfo, char* fbuf, int flen, int pos) {
205*418b791dSBob Badour pthread_mutex_lock(&apps_std_mt);
206*418b791dSBob Badour fclose(sinfo->u.stream);
207*418b791dSBob Badour sinfo->type = APPS_STD_STREAM_BUF;
208*418b791dSBob Badour sinfo->u.binfo.fbuf = fbuf;
209*418b791dSBob Badour sinfo->u.binfo.flen = flen;
210*418b791dSBob Badour sinfo->u.binfo.pos = pos;
211*418b791dSBob Badour pthread_mutex_unlock(&apps_std_mt);
212*418b791dSBob Badour }
213*418b791dSBob Badour
__QAIC_IMPL(apps_std_fopen)214*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fopen)(const char* name, const char* mode, apps_std_FILE* psout) __QAIC_IMPL_ATTRIBUTE {
215*418b791dSBob Badour int nErr = AEE_SUCCESS;
216*418b791dSBob Badour FILE* stream = fopen(name, mode);
217*418b791dSBob Badour if(stream) {
218*418b791dSBob Badour return apps_std_FILE_alloc(stream, psout);
219*418b791dSBob Badour } else {
220*418b791dSBob Badour nErr = AEE_ENOSUCHFILE;
221*418b791dSBob Badour }
222*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
223*418b791dSBob Badour // Ignoring this error, as fopen happens on all ADSP_LIBRARY_PATHs
224*418b791dSBob Badour VERIFY_IPRINTF("Error %x: fopen for %s failed. errno: %s\n", nErr, name, strerror(ERRNO));
225*418b791dSBob Badour }
226*418b791dSBob Badour return nErr;
227*418b791dSBob Badour }
228*418b791dSBob Badour
__QAIC_IMPL(apps_std_freopen)229*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_freopen)(apps_std_FILE sin, const char* name, const char* mode, apps_std_FILE* psout) __QAIC_IMPL_ATTRIBUTE {
230*418b791dSBob Badour int nErr = AEE_SUCCESS;
231*418b791dSBob Badour struct apps_std_info* sinfo = 0;
232*418b791dSBob Badour FILE* stream;
233*418b791dSBob Badour
234*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
235*418b791dSBob Badour VERIFY(sinfo->type == APPS_STD_STREAM_FILE);
236*418b791dSBob Badour stream = freopen(name, mode, sinfo->u.stream);
237*418b791dSBob Badour if(stream) {
238*418b791dSBob Badour FARF(HIGH, "freopen success: %s %x\n", name, stream);
239*418b791dSBob Badour return apps_std_FILE_alloc(stream, psout);
240*418b791dSBob Badour } else {
241*418b791dSBob Badour nErr = AEE_EFOPEN;
242*418b791dSBob Badour }
243*418b791dSBob Badour bail:
244*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
245*418b791dSBob Badour VERIFY_EPRINTF("Error %x: freopen for %s failed. errno: %s\n", nErr, name, strerror(ERRNO));
246*418b791dSBob Badour }
247*418b791dSBob Badour return nErr;
248*418b791dSBob Badour }
249*418b791dSBob Badour
__QAIC_IMPL(apps_std_fflush)250*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fflush)(apps_std_FILE sin) __QAIC_IMPL_ATTRIBUTE {
251*418b791dSBob Badour int nErr = AEE_SUCCESS;
252*418b791dSBob Badour struct apps_std_info* sinfo = 0;
253*418b791dSBob Badour
254*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
255*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
256*418b791dSBob Badour VERIFYC(0 == fflush(sinfo->u.stream), AEE_EFFLUSH);
257*418b791dSBob Badour }
258*418b791dSBob Badour bail:
259*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
260*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fflush for %x failed. errno: %s\n", nErr, sin, strerror(ERRNO));
261*418b791dSBob Badour }
262*418b791dSBob Badour return nErr;
263*418b791dSBob Badour }
264*418b791dSBob Badour
__QAIC_IMPL(apps_std_fclose)265*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fclose)(apps_std_FILE sin) __QAIC_IMPL_ATTRIBUTE {
266*418b791dSBob Badour int nErr = AEE_SUCCESS;
267*418b791dSBob Badour struct apps_std_info* sinfo = 0;
268*418b791dSBob Badour
269*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
270*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
271*418b791dSBob Badour VERIFYC(0 == fclose(sinfo->u.stream), AEE_EFCLOSE);
272*418b791dSBob Badour } else {
273*418b791dSBob Badour if(sinfo->u.binfo.fbuf) {
274*418b791dSBob Badour rpcmem_free_internal(sinfo->u.binfo.fbuf);
275*418b791dSBob Badour sinfo->u.binfo.fbuf = NULL;
276*418b791dSBob Badour }
277*418b791dSBob Badour }
278*418b791dSBob Badour apps_std_FILE_free(sinfo);
279*418b791dSBob Badour bail:
280*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
281*418b791dSBob Badour VERIFY_EPRINTF("Error %x: freopen for %x failed. errno: %s\n", nErr, sin, strerror(ERRNO));
282*418b791dSBob Badour }
283*418b791dSBob Badour return nErr;
284*418b791dSBob Badour }
285*418b791dSBob Badour
__QAIC_IMPL(apps_std_fread)286*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fread)(apps_std_FILE sin, byte* buf, int bufLen, int* bytesRead, int* bEOF) __QAIC_IMPL_ATTRIBUTE {
287*418b791dSBob Badour int out = 0, nErr = AEE_SUCCESS;
288*418b791dSBob Badour struct apps_std_info* sinfo = 0;
289*418b791dSBob Badour
290*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
291*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
292*418b791dSBob Badour out = fread(buf, 1, bufLen, sinfo->u.stream);
293*418b791dSBob Badour *bEOF = FALSE;
294*418b791dSBob Badour if(out <= bufLen) {
295*418b791dSBob Badour int err;
296*418b791dSBob Badour if(0 == out && (0 != (err = ferror(sinfo->u.stream)))) {
297*418b791dSBob Badour nErr = AEE_EFREAD;
298*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fread returning %d bytes, requested was %d bytes, errno is %x\n", nErr, out, bufLen, err);
299*418b791dSBob Badour return nErr;
300*418b791dSBob Badour }
301*418b791dSBob Badour *bEOF = feof(sinfo->u.stream);
302*418b791dSBob Badour }
303*418b791dSBob Badour *bytesRead = out;
304*418b791dSBob Badour } else {
305*418b791dSBob Badour *bytesRead = std_memscpy(buf, bufLen, sinfo->u.binfo.fbuf + sinfo->u.binfo.pos,
306*418b791dSBob Badour sinfo->u.binfo.flen - sinfo->u.binfo.pos);
307*418b791dSBob Badour sinfo->u.binfo.pos += *bytesRead;
308*418b791dSBob Badour *bEOF = sinfo->u.binfo.pos == sinfo->u.binfo.flen ? TRUE : FALSE;
309*418b791dSBob Badour }
310*418b791dSBob Badour FARF(HIGH, "fread returning %d %d 0", out, bufLen);
311*418b791dSBob Badour bail:
312*418b791dSBob Badour return nErr;
313*418b791dSBob Badour }
314*418b791dSBob Badour
__QAIC_IMPL(apps_std_fwrite)315*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fwrite)(apps_std_FILE sin, const byte* buf, int bufLen, int* bytesRead, int* bEOF) __QAIC_IMPL_ATTRIBUTE {
316*418b791dSBob Badour int nErr = AEE_SUCCESS;
317*418b791dSBob Badour struct apps_std_info* sinfo = 0;
318*418b791dSBob Badour
319*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
320*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
321*418b791dSBob Badour int out = fwrite(buf, 1, bufLen, sinfo->u.stream);
322*418b791dSBob Badour *bEOF = FALSE;
323*418b791dSBob Badour if(out <= bufLen) {
324*418b791dSBob Badour int err;
325*418b791dSBob Badour if(0 == out && (0 != (err = ferror(sinfo->u.stream)))) {
326*418b791dSBob Badour nErr = AEE_EFWRITE;
327*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fwrite returning %d bytes, requested was %d bytes, errno is %x\n", nErr, out, bufLen, err);
328*418b791dSBob Badour return nErr;
329*418b791dSBob Badour }
330*418b791dSBob Badour *bEOF = feof(sinfo->u.stream);
331*418b791dSBob Badour }
332*418b791dSBob Badour *bytesRead = out;
333*418b791dSBob Badour } else {
334*418b791dSBob Badour nErr = AEE_EFWRITE;
335*418b791dSBob Badour }
336*418b791dSBob Badour bail:
337*418b791dSBob Badour return nErr;
338*418b791dSBob Badour }
339*418b791dSBob Badour
__QAIC_IMPL(apps_std_fgetpos)340*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fgetpos)(apps_std_FILE sin, byte* pos, int posLen, int* posLenReq) __QAIC_IMPL_ATTRIBUTE {
341*418b791dSBob Badour int nErr = AEE_SUCCESS;
342*418b791dSBob Badour fpos_t fpos;
343*418b791dSBob Badour struct apps_std_info* sinfo = 0;
344*418b791dSBob Badour
345*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
346*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
347*418b791dSBob Badour if(0 == fgetpos(sinfo->u.stream, &fpos)) {
348*418b791dSBob Badour std_memmove(pos, &fpos, STD_MIN((int)sizeof(fpos), posLen));
349*418b791dSBob Badour *posLenReq = sizeof(fpos);
350*418b791dSBob Badour return AEE_SUCCESS;
351*418b791dSBob Badour } else {
352*418b791dSBob Badour nErr = AEE_EFGETPOS;
353*418b791dSBob Badour }
354*418b791dSBob Badour } else {
355*418b791dSBob Badour nErr = AEE_EFGETPOS;
356*418b791dSBob Badour }
357*418b791dSBob Badour bail:
358*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fgetpos failed for %x, errno is %s\n", nErr, sin, strerror(ERRNO));
359*418b791dSBob Badour return nErr;
360*418b791dSBob Badour }
361*418b791dSBob Badour
__QAIC_IMPL(apps_std_fsetpos)362*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fsetpos)(apps_std_FILE sin, const byte* pos, int posLen) __QAIC_IMPL_ATTRIBUTE {
363*418b791dSBob Badour int nErr = AEE_SUCCESS;
364*418b791dSBob Badour fpos_t fpos;
365*418b791dSBob Badour struct apps_std_info* sinfo = 0;
366*418b791dSBob Badour
367*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
368*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
369*418b791dSBob Badour if(sizeof(fpos) != posLen) {
370*418b791dSBob Badour return AEE_EBADSIZE;
371*418b791dSBob Badour }
372*418b791dSBob Badour std_memmove(&fpos, pos, sizeof(fpos));
373*418b791dSBob Badour if(0 == fsetpos(sinfo->u.stream, &fpos)) {
374*418b791dSBob Badour return AEE_SUCCESS;
375*418b791dSBob Badour } else {
376*418b791dSBob Badour nErr = AEE_EFSETPOS;
377*418b791dSBob Badour }
378*418b791dSBob Badour } else {
379*418b791dSBob Badour nErr = AEE_EFSETPOS;
380*418b791dSBob Badour }
381*418b791dSBob Badour bail:
382*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fsetpos failed for %x, errno is %s\n", nErr, sin, strerror(ERRNO));
383*418b791dSBob Badour return nErr;
384*418b791dSBob Badour }
385*418b791dSBob Badour
__QAIC_IMPL(apps_std_ftell)386*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_ftell)(apps_std_FILE sin, int* pos) __QAIC_IMPL_ATTRIBUTE {
387*418b791dSBob Badour int nErr = AEE_SUCCESS;
388*418b791dSBob Badour struct apps_std_info* sinfo = 0;
389*418b791dSBob Badour
390*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
391*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
392*418b791dSBob Badour if((*pos = ftell(sinfo->u.stream)) >= 0) {
393*418b791dSBob Badour return AEE_SUCCESS;
394*418b791dSBob Badour } else {
395*418b791dSBob Badour nErr = AEE_EFTELL;
396*418b791dSBob Badour }
397*418b791dSBob Badour } else {
398*418b791dSBob Badour *pos = sinfo->u.binfo.pos;
399*418b791dSBob Badour return AEE_SUCCESS;
400*418b791dSBob Badour }
401*418b791dSBob Badour bail:
402*418b791dSBob Badour VERIFY_EPRINTF("Error %x: ftell failed for %x, errno is %s\n", nErr, sin, strerror(ERRNO));
403*418b791dSBob Badour return nErr;
404*418b791dSBob Badour }
405*418b791dSBob Badour
__QAIC_IMPL(apps_std_fseek)406*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fseek)(apps_std_FILE sin, int offset, apps_std_SEEK whence) __QAIC_IMPL_ATTRIBUTE {
407*418b791dSBob Badour int nErr = AEE_SUCCESS;
408*418b791dSBob Badour int op = (int)whence;
409*418b791dSBob Badour struct apps_std_info* sinfo = 0;
410*418b791dSBob Badour
411*418b791dSBob Badour C_ASSERT(APPS_STD_SEEK_SET == SEEK_SET);
412*418b791dSBob Badour C_ASSERT(APPS_STD_SEEK_CUR == SEEK_CUR);
413*418b791dSBob Badour C_ASSERT(APPS_STD_SEEK_END == SEEK_END);
414*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
415*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
416*418b791dSBob Badour if(0 == fseek(sinfo->u.stream, offset, whence)) {
417*418b791dSBob Badour return AEE_SUCCESS;
418*418b791dSBob Badour } else {
419*418b791dSBob Badour nErr = AEE_EFSEEK;
420*418b791dSBob Badour }
421*418b791dSBob Badour } else {
422*418b791dSBob Badour switch(op) {
423*418b791dSBob Badour case APPS_STD_SEEK_SET:
424*418b791dSBob Badour VERIFYC(offset <= sinfo->u.binfo.flen, AEE_EFSEEK);
425*418b791dSBob Badour sinfo->u.binfo.pos = offset;
426*418b791dSBob Badour break;
427*418b791dSBob Badour case APPS_STD_SEEK_CUR:
428*418b791dSBob Badour VERIFYC(offset + sinfo->u.binfo.pos <= sinfo->u.binfo.flen, AEE_EFSEEK);
429*418b791dSBob Badour sinfo->u.binfo.pos += offset;
430*418b791dSBob Badour break;
431*418b791dSBob Badour case APPS_STD_SEEK_END:
432*418b791dSBob Badour VERIFYC(offset + sinfo->u.binfo.flen <= sinfo->u.binfo.flen, AEE_EFSEEK);
433*418b791dSBob Badour sinfo->u.binfo.pos += offset + sinfo->u.binfo.flen;
434*418b791dSBob Badour break;
435*418b791dSBob Badour }
436*418b791dSBob Badour }
437*418b791dSBob Badour bail:
438*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
439*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fseek failed for %x, errno is %s\n", nErr, sin, strerror(ERRNO));
440*418b791dSBob Badour }
441*418b791dSBob Badour return nErr;
442*418b791dSBob Badour }
443*418b791dSBob Badour
__QAIC_IMPL(apps_std_rewind)444*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_rewind)(apps_std_FILE sin) __QAIC_IMPL_ATTRIBUTE {
445*418b791dSBob Badour int nErr = AEE_SUCCESS;
446*418b791dSBob Badour struct apps_std_info* sinfo = 0;
447*418b791dSBob Badour
448*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
449*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
450*418b791dSBob Badour rewind(sinfo->u.stream);
451*418b791dSBob Badour } else {
452*418b791dSBob Badour sinfo->u.binfo.pos = 0;
453*418b791dSBob Badour }
454*418b791dSBob Badour bail:
455*418b791dSBob Badour return nErr;
456*418b791dSBob Badour }
457*418b791dSBob Badour
__QAIC_IMPL(apps_std_feof)458*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_feof)(apps_std_FILE sin, int* bEOF) __QAIC_IMPL_ATTRIBUTE {
459*418b791dSBob Badour int nErr = AEE_SUCCESS;
460*418b791dSBob Badour struct apps_std_info* sinfo = 0;
461*418b791dSBob Badour
462*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
463*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
464*418b791dSBob Badour *bEOF = feof(sinfo->u.stream);
465*418b791dSBob Badour } else {
466*418b791dSBob Badour nErr = AEE_EUNSUPPORTED;
467*418b791dSBob Badour }
468*418b791dSBob Badour bail:
469*418b791dSBob Badour return nErr;
470*418b791dSBob Badour }
471*418b791dSBob Badour
__QAIC_IMPL(apps_std_ferror)472*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_ferror)(apps_std_FILE sin, int* err) __QAIC_IMPL_ATTRIBUTE {
473*418b791dSBob Badour int nErr = AEE_SUCCESS;
474*418b791dSBob Badour struct apps_std_info* sinfo = 0;
475*418b791dSBob Badour
476*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
477*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
478*418b791dSBob Badour *err = ferror(sinfo->u.stream);
479*418b791dSBob Badour } else {
480*418b791dSBob Badour nErr = AEE_EUNSUPPORTED;
481*418b791dSBob Badour }
482*418b791dSBob Badour bail:
483*418b791dSBob Badour return nErr;
484*418b791dSBob Badour }
485*418b791dSBob Badour
__QAIC_IMPL(apps_std_clearerr)486*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_clearerr)(apps_std_FILE sin) __QAIC_IMPL_ATTRIBUTE {
487*418b791dSBob Badour int nErr = AEE_SUCCESS;
488*418b791dSBob Badour struct apps_std_info* sinfo = 0;
489*418b791dSBob Badour
490*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
491*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
492*418b791dSBob Badour clearerr(sinfo->u.stream);
493*418b791dSBob Badour } else {
494*418b791dSBob Badour nErr = AEE_EUNSUPPORTED;
495*418b791dSBob Badour }
496*418b791dSBob Badour bail:
497*418b791dSBob Badour return nErr;
498*418b791dSBob Badour }
499*418b791dSBob Badour
__QAIC_IMPL(apps_std_flen)500*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_flen)(apps_std_FILE sin, uint64* len) __QAIC_IMPL_ATTRIBUTE {
501*418b791dSBob Badour int nErr = AEE_SUCCESS;
502*418b791dSBob Badour struct apps_std_info* sinfo = 0;
503*418b791dSBob Badour
504*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
505*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
506*418b791dSBob Badour struct stat st_buf;
507*418b791dSBob Badour int fd = fileno(sinfo->u.stream);
508*418b791dSBob Badour C_ASSERT(sizeof(st_buf.st_size) <= sizeof(*len));
509*418b791dSBob Badour if(fd == -1) {
510*418b791dSBob Badour nErr = AEE_EFLEN;
511*418b791dSBob Badour VERIFY_EPRINTF("Error %x: flen failed for %x, errno is %s\n", nErr, sin, strerror(ERRNO));
512*418b791dSBob Badour return nErr;
513*418b791dSBob Badour }
514*418b791dSBob Badour if(0 != fstat(fd, &st_buf)) {
515*418b791dSBob Badour nErr = AEE_EFLEN;
516*418b791dSBob Badour VERIFY_EPRINTF("Error %x: flen failed for %x, errno is %s\n", nErr, sin, strerror(ERRNO));
517*418b791dSBob Badour return nErr;
518*418b791dSBob Badour }
519*418b791dSBob Badour *len = st_buf.st_size;
520*418b791dSBob Badour } else {
521*418b791dSBob Badour *len = sinfo->u.binfo.flen;
522*418b791dSBob Badour }
523*418b791dSBob Badour bail:
524*418b791dSBob Badour return nErr;
525*418b791dSBob Badour }
526*418b791dSBob Badour
__QAIC_IMPL(apps_std_print_string)527*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_print_string)(const char* str) __QAIC_IMPL_ATTRIBUTE {
528*418b791dSBob Badour printf("%s", str);
529*418b791dSBob Badour return AEE_SUCCESS;
530*418b791dSBob Badour }
531*418b791dSBob Badour
__QAIC_IMPL(apps_std_getenv)532*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_getenv)(const char* name, char* val, int valLen, int* valLenReq) __QAIC_IMPL_ATTRIBUTE {
533*418b791dSBob Badour int nErr = AEE_SUCCESS;
534*418b791dSBob Badour char* vv = getenv(name);
535*418b791dSBob Badour if(vv) {
536*418b791dSBob Badour *valLenReq = std_strlen(vv) + 1;
537*418b791dSBob Badour std_strlcpy(val, vv, valLen);
538*418b791dSBob Badour return AEE_SUCCESS;
539*418b791dSBob Badour }
540*418b791dSBob Badour nErr = AEE_EGETENV;
541*418b791dSBob Badour VERIFY_IPRINTF("Error %x: apps_std getenv failed: %s %s\n", nErr, name, strerror(ERRNO));
542*418b791dSBob Badour return nErr;
543*418b791dSBob Badour }
544*418b791dSBob Badour
__QAIC_IMPL(apps_std_setenv)545*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_setenv)(const char* name, const char* val, int override) __QAIC_IMPL_ATTRIBUTE {
546*418b791dSBob Badour int nErr = AEE_SUCCESS;
547*418b791dSBob Badour #ifdef _WIN32
548*418b791dSBob Badour return AEE_EUNSUPPORTED;
549*418b791dSBob Badour #else //_WIN32
550*418b791dSBob Badour if(0 != setenv(name, val, override)) {
551*418b791dSBob Badour nErr = AEE_ESETENV;
552*418b791dSBob Badour VERIFY_EPRINTF("Error %x: setenv failed for %s, errno is %s\n", nErr, name, strerror(ERRNO));
553*418b791dSBob Badour return nErr;
554*418b791dSBob Badour }
555*418b791dSBob Badour return AEE_SUCCESS;
556*418b791dSBob Badour #endif //_WIN32
557*418b791dSBob Badour }
558*418b791dSBob Badour
__QAIC_IMPL(apps_std_unsetenv)559*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_unsetenv)(const char* name) __QAIC_IMPL_ATTRIBUTE {
560*418b791dSBob Badour int nErr = AEE_SUCCESS;
561*418b791dSBob Badour #ifdef _WIN32
562*418b791dSBob Badour return AEE_EUNSUPPORTED;
563*418b791dSBob Badour #else //_WIN32
564*418b791dSBob Badour if(0 != unsetenv(name)) {
565*418b791dSBob Badour nErr = AEE_ESETENV;
566*418b791dSBob Badour VERIFY_EPRINTF("Error %x: unsetenv failed for %s, errno is %s\n", nErr, name, strerror(ERRNO));
567*418b791dSBob Badour return nErr;
568*418b791dSBob Badour }
569*418b791dSBob Badour return AEE_SUCCESS;
570*418b791dSBob Badour #endif //_WIN32
571*418b791dSBob Badour }
572*418b791dSBob Badour
573*418b791dSBob Badour
574*418b791dSBob Badour #if (defined LE_ENABLE)
575*418b791dSBob Badour static char* ADSP_LIBRARY_PATH=";/usr/lib/rfsa/adsp;/usr/lib;/dsp;/usr/share/fastrpc";
576*418b791dSBob Badour static char* ADSP_AVS_CFG_PATH=";/etc/acdbdata/";
577*418b791dSBob Badour #elif (defined __BRILLO__)
578*418b791dSBob Badour static char* ADSP_LIBRARY_PATH=";/system/etc/lib/rfsa/adsp;/system/vendor/etc/lib/rfsa/adsp;/dsp";
579*418b791dSBob Badour static char* ADSP_AVS_CFG_PATH=";/etc/acdbdata/";
580*418b791dSBob Badour #elif (defined _ANDROID) || (defined ANDROID)
581*418b791dSBob Badour #if (defined ANDROID_P) && (defined FULL_TREBLE)
582*418b791dSBob Badour #ifdef SYSTEM_RPC_LIBRARY
583*418b791dSBob Badour static char* ADSP_LIBRARY_PATH=";/system/lib/rfsa/adsp";
584*418b791dSBob Badour static char* ADSP_AVS_CFG_PATH=";/etc/acdbdata/";
585*418b791dSBob Badour #else
586*418b791dSBob Badour static char* ADSP_LIBRARY_PATH=";/vendor/lib/rfsa/adsp;/vendor/dsp";
587*418b791dSBob Badour static char* ADSP_AVS_CFG_PATH=";/vendor/etc/acdbdata/";
588*418b791dSBob Badour #endif
589*418b791dSBob Badour #else
590*418b791dSBob Badour static char* ADSP_LIBRARY_PATH=";/system/lib/rfsa/adsp;/system/vendor/lib/rfsa/adsp;/dsp;/vendor/dsp";
591*418b791dSBob Badour static char* ADSP_AVS_CFG_PATH=";/etc/acdbdata/;/vendor/etc/acdbdata/";
592*418b791dSBob Badour #endif
593*418b791dSBob Badour #elif (defined __QNX__)
594*418b791dSBob Badour static char* ADSP_LIBRARY_PATH="/radio/lib/firmware";
595*418b791dSBob Badour #else
596*418b791dSBob Badour static char* ADSP_LIBRARY_PATH="";
597*418b791dSBob Badour #endif
598*418b791dSBob Badour
599*418b791dSBob Badour #define EMTPY_STR ""
600*418b791dSBob Badour #define ENV_LEN_GUESS 256
601*418b791dSBob Badour
get_dirlist_from_env(const char * envvarname,char ** ppDirList)602*418b791dSBob Badour static int get_dirlist_from_env(const char* envvarname, char** ppDirList){
603*418b791dSBob Badour char *envList = NULL;
604*418b791dSBob Badour char *envListBuf = NULL;
605*418b791dSBob Badour char *dirList = NULL;
606*418b791dSBob Badour char *dirListBuf = NULL;
607*418b791dSBob Badour char *srcStr = NULL;
608*418b791dSBob Badour int nErr = AEE_SUCCESS;
609*418b791dSBob Badour int envListLen = 0;
610*418b791dSBob Badour int listLen = 0;
611*418b791dSBob Badour int envLenGuess = STD_MAX(ENV_LEN_GUESS, 1 + std_strlen(ADSP_LIBRARY_PATH));
612*418b791dSBob Badour
613*418b791dSBob Badour VERIFYC(NULL != ppDirList, AEE_EMEMPTR);
614*418b791dSBob Badour
615*418b791dSBob Badour VERIFYC(envListBuf = (char*)malloc(sizeof(char) * envLenGuess), AEE_ENOMEMORY);
616*418b791dSBob Badour envList = envListBuf;
617*418b791dSBob Badour *envList = '\0';
618*418b791dSBob Badour if (0 == apps_std_getenv(envvarname, envList, envLenGuess, &envListLen)) {
619*418b791dSBob Badour if (envLenGuess < envListLen) {
620*418b791dSBob Badour FREEIF(envListBuf);
621*418b791dSBob Badour VERIFYC(envListBuf = realloc(envListBuf, sizeof(char) * envListLen), AEE_ENOMEMORY);
622*418b791dSBob Badour envList = envListBuf;
623*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_getenv(envvarname, envList, envListLen, &listLen)));
624*418b791dSBob Badour }
625*418b791dSBob Badour } else if(std_strncmp(envvarname, "ADSP_LIBRARY_PATH", 17) == 0) {
626*418b791dSBob Badour envListLen = listLen = 1 + std_strlcpy(envListBuf, ADSP_LIBRARY_PATH, envLenGuess);
627*418b791dSBob Badour } else if(std_strncmp(envvarname, "ADSP_AVS_CFG_PATH", 17) == 0) {
628*418b791dSBob Badour envListLen = listLen = 1 + std_strlcpy(envListBuf, ADSP_AVS_CFG_PATH, envLenGuess);
629*418b791dSBob Badour }
630*418b791dSBob Badour
631*418b791dSBob Badour /*
632*418b791dSBob Badour * Allocate mem. to copy envvarname.
633*418b791dSBob Badour * If envvarname not set, allocate mem to create an empty string
634*418b791dSBob Badour */
635*418b791dSBob Badour if('\0' != *envList) {
636*418b791dSBob Badour srcStr = envList;
637*418b791dSBob Badour } else {
638*418b791dSBob Badour srcStr = EMTPY_STR;
639*418b791dSBob Badour envListLen = std_strlen(EMTPY_STR) + 1;
640*418b791dSBob Badour }
641*418b791dSBob Badour VERIFYC(dirListBuf = (char*)malloc(sizeof(char) * envListLen), AEE_ENOMEMORY);
642*418b791dSBob Badour dirList = dirListBuf;
643*418b791dSBob Badour std_strlcpy(dirList, srcStr, envListLen);
644*418b791dSBob Badour *ppDirList = dirListBuf;
645*418b791dSBob Badour bail:
646*418b791dSBob Badour FREEIF(envListBuf);
647*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
648*418b791dSBob Badour VERIFY_EPRINTF("Error %x: get dirlist from env failed for %s\n", nErr, envvarname);
649*418b791dSBob Badour }
650*418b791dSBob Badour return nErr;
651*418b791dSBob Badour }
652*418b791dSBob Badour
__QAIC_IMPL(apps_std_fopen_with_env)653*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fopen_with_env)(const char* envvarname,
654*418b791dSBob Badour const char* delim, const char* name, const char* mode,
655*418b791dSBob Badour apps_std_FILE* psout) __QAIC_IMPL_ATTRIBUTE {
656*418b791dSBob Badour
657*418b791dSBob Badour int nErr = AEE_SUCCESS;
658*418b791dSBob Badour char *dirName = NULL;
659*418b791dSBob Badour char *pos = NULL;
660*418b791dSBob Badour char *dirListBuf = NULL;
661*418b791dSBob Badour char *dirList = NULL;
662*418b791dSBob Badour char *absName = NULL;
663*418b791dSBob Badour uint16 absNameLen = 0;
664*418b791dSBob Badour int domain;
665*418b791dSBob Badour
666*418b791dSBob Badour VERIFYC(NULL != mode, AEE_EINVALIDMODE);
667*418b791dSBob Badour VERIFYC(NULL != delim, AEE_EINVALIDFORMAT);
668*418b791dSBob Badour VERIFYC(NULL != name, AEE_EMEMPTR);
669*418b791dSBob Badour
670*418b791dSBob Badour VERIFY(0 == (nErr = get_dirlist_from_env(envvarname, &dirListBuf )));
671*418b791dSBob Badour VERIFYC(NULL != (dirList = dirListBuf), AEE_EMEMPTR);
672*418b791dSBob Badour
673*418b791dSBob Badour while(dirList)
674*418b791dSBob Badour {
675*418b791dSBob Badour pos = strstr(dirList, delim);
676*418b791dSBob Badour dirName = dirList;
677*418b791dSBob Badour if (pos) {
678*418b791dSBob Badour *pos = '\0';
679*418b791dSBob Badour dirList = pos + std_strlen(delim);
680*418b791dSBob Badour } else {
681*418b791dSBob Badour dirList = 0;
682*418b791dSBob Badour }
683*418b791dSBob Badour
684*418b791dSBob Badour // Account for slash char
685*418b791dSBob Badour absNameLen = std_strlen(dirName) + std_strlen(name) + 2;
686*418b791dSBob Badour VERIFYC(NULL != (absName = (char*)malloc(sizeof(char) * absNameLen)), AEE_ENOMEMORY);
687*418b791dSBob Badour if ('\0' != *dirName) {
688*418b791dSBob Badour std_strlcpy(absName, dirName, absNameLen);
689*418b791dSBob Badour std_strlcat(absName, "/", absNameLen);
690*418b791dSBob Badour std_strlcat(absName, name, absNameLen);
691*418b791dSBob Badour } else {
692*418b791dSBob Badour std_strlcpy(absName, name, absNameLen);
693*418b791dSBob Badour }
694*418b791dSBob Badour
695*418b791dSBob Badour nErr = apps_std_fopen(absName, mode, psout);
696*418b791dSBob Badour FREEIF(absName);
697*418b791dSBob Badour if (AEE_SUCCESS == nErr) {
698*418b791dSBob Badour // Success
699*418b791dSBob Badour goto bail;
700*418b791dSBob Badour }
701*418b791dSBob Badour }
702*418b791dSBob Badour domain = get_domain_id() & DOMAIN_ID_MASK;
703*418b791dSBob Badour
704*418b791dSBob Badour #ifdef ANDROID_P
705*418b791dSBob Badour absNameLen = std_strlen("/vendor/dsp/adsp/") + std_strlen(name) + 1;
706*418b791dSBob Badour VERIFYC(NULL != (absName = (char*)malloc(sizeof(char) * absNameLen)), AEE_ENOMEMORY);
707*418b791dSBob Badour
708*418b791dSBob Badour if (domain == ADSP_DOMAIN_ID){
709*418b791dSBob Badour std_strlcpy(absName, "/vendor/dsp/adsp/", absNameLen);
710*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
711*418b791dSBob Badour } else if (domain == MDSP_DOMAIN_ID){
712*418b791dSBob Badour std_strlcpy(absName, "/vendor/dsp/mdsp/", absNameLen);
713*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
714*418b791dSBob Badour } else if (domain == SDSP_DOMAIN_ID){
715*418b791dSBob Badour std_strlcpy(absName, "/vendor/dsp/sdsp/", absNameLen);
716*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
717*418b791dSBob Badour } else if (domain == CDSP_DOMAIN_ID) {
718*418b791dSBob Badour std_strlcpy(absName, "/vendor/dsp/cdsp/", absNameLen);
719*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
720*418b791dSBob Badour } else {
721*418b791dSBob Badour absName[0] = '\0';
722*418b791dSBob Badour }
723*418b791dSBob Badour nErr = apps_std_fopen(absName, mode, psout);
724*418b791dSBob Badour #else
725*418b791dSBob Badour absNameLen = std_strlen("/dsp/adsp/") + std_strlen(name) + 1;
726*418b791dSBob Badour VERIFYC(NULL != (absName = (char*)malloc(sizeof(char) * absNameLen)), AEE_ENOMEMORY);
727*418b791dSBob Badour
728*418b791dSBob Badour if (domain == ADSP_DOMAIN_ID){
729*418b791dSBob Badour std_strlcpy(absName, "/dsp/adsp/", absNameLen);
730*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
731*418b791dSBob Badour } else if (domain == MDSP_DOMAIN_ID){
732*418b791dSBob Badour std_strlcpy(absName, "/dsp/mdsp/", absNameLen);
733*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
734*418b791dSBob Badour } else if (domain == SDSP_DOMAIN_ID){
735*418b791dSBob Badour std_strlcpy(absName, "/dsp/sdsp/", absNameLen);
736*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
737*418b791dSBob Badour } else if (domain == CDSP_DOMAIN_ID) {
738*418b791dSBob Badour std_strlcpy(absName, "/dsp/cdsp/", absNameLen);
739*418b791dSBob Badour std_strlcat(absName, name,absNameLen);
740*418b791dSBob Badour } else {
741*418b791dSBob Badour absName[0] = '\0';
742*418b791dSBob Badour }
743*418b791dSBob Badour nErr = apps_std_fopen(absName, mode, psout);
744*418b791dSBob Badour #endif
745*418b791dSBob Badour bail:
746*418b791dSBob Badour FREEIF(absName);
747*418b791dSBob Badour FREEIF(dirListBuf);
748*418b791dSBob Badour if (nErr != AEE_SUCCESS) {
749*418b791dSBob Badour VERIFY_IPRINTF("Error %x: fopen failed for %s. (%s)", nErr, name, strerror(ERRNO));
750*418b791dSBob Badour }
751*418b791dSBob Badour return nErr;
752*418b791dSBob Badour }
753*418b791dSBob Badour
__QAIC_IMPL(apps_std_get_search_paths_with_env)754*418b791dSBob Badour __QAIC_HEADER_EXPORT int __QAIC_IMPL(apps_std_get_search_paths_with_env)(
755*418b791dSBob Badour const char* envvarname, const char* delim, _cstring1_t* paths,
756*418b791dSBob Badour int pathsLen, uint32* numPaths, uint16* maxPathLen) __QAIC_IMPL_ATTRIBUTE{
757*418b791dSBob Badour
758*418b791dSBob Badour char *path = NULL;
759*418b791dSBob Badour int nErr = AEE_SUCCESS;
760*418b791dSBob Badour char *dirListBuf = NULL;
761*418b791dSBob Badour int i = 0;
762*418b791dSBob Badour char *saveptr = NULL;
763*418b791dSBob Badour struct stat st;
764*418b791dSBob Badour
765*418b791dSBob Badour VERIFYC(NULL != numPaths, AEE_EBADSIZE);
766*418b791dSBob Badour VERIFYC(NULL != delim, AEE_EINVALIDFORMAT);
767*418b791dSBob Badour VERIFYC(NULL != maxPathLen, AEE_EBADSIZE);
768*418b791dSBob Badour
769*418b791dSBob Badour VERIFY(AEE_SUCCESS == (nErr = get_dirlist_from_env(envvarname, &dirListBuf )));
770*418b791dSBob Badour
771*418b791dSBob Badour *numPaths = 0;
772*418b791dSBob Badour *maxPathLen = 0;
773*418b791dSBob Badour
774*418b791dSBob Badour // Get the number of folders
775*418b791dSBob Badour path = strtok_r (dirListBuf, delim, &saveptr);
776*418b791dSBob Badour while (path != NULL){
777*418b791dSBob Badour // If the path exists, add it to the return
778*418b791dSBob Badour if ((stat(path, &st) == 0) && (S_ISDIR(st.st_mode))) {
779*418b791dSBob Badour *maxPathLen = STD_MAX(*maxPathLen, std_strlen(path)+1);
780*418b791dSBob Badour if (paths && i < pathsLen && paths[i].data && paths[i].dataLen >= std_strlen(path)) {
781*418b791dSBob Badour std_strlcpy(paths[i].data, path, paths[i].dataLen);
782*418b791dSBob Badour }
783*418b791dSBob Badour i++;
784*418b791dSBob Badour }
785*418b791dSBob Badour path = strtok_r (NULL, delim, &saveptr);
786*418b791dSBob Badour }
787*418b791dSBob Badour *numPaths = i;
788*418b791dSBob Badour
789*418b791dSBob Badour bail:
790*418b791dSBob Badour FREEIF(dirListBuf);
791*418b791dSBob Badour if (nErr != AEE_SUCCESS) {
792*418b791dSBob Badour VERIFY_EPRINTF("Error %x: apps_std_get_search_paths_with_env failed\n", nErr);
793*418b791dSBob Badour }
794*418b791dSBob Badour return nErr;
795*418b791dSBob Badour }
796*418b791dSBob Badour
797*418b791dSBob Badour
__QAIC_IMPL(apps_std_fgets)798*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fgets)(apps_std_FILE sin, byte* buf, int bufLen, int* bEOF) __QAIC_IMPL_ATTRIBUTE {
799*418b791dSBob Badour int nErr = AEE_SUCCESS;
800*418b791dSBob Badour struct apps_std_info* sinfo = 0;
801*418b791dSBob Badour
802*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
803*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
804*418b791dSBob Badour char* out = fgets((char*)buf, bufLen, sinfo->u.stream);
805*418b791dSBob Badour *bEOF = FALSE;
806*418b791dSBob Badour if(!out) {
807*418b791dSBob Badour int err;
808*418b791dSBob Badour if(0 != (err = ferror(sinfo->u.stream))) {
809*418b791dSBob Badour nErr = AEE_EFGETS;
810*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fgets failed for %x, errno is %s\n", nErr, sin, strerror(ERRNO));
811*418b791dSBob Badour return nErr;
812*418b791dSBob Badour }
813*418b791dSBob Badour *bEOF = feof(sinfo->u.stream);
814*418b791dSBob Badour }
815*418b791dSBob Badour } else {
816*418b791dSBob Badour nErr = AEE_EUNSUPPORTED;
817*418b791dSBob Badour }
818*418b791dSBob Badour bail:
819*418b791dSBob Badour return nErr;
820*418b791dSBob Badour }
821*418b791dSBob Badour
__QAIC_HEADER(apps_std_fileExists)822*418b791dSBob Badour __QAIC_HEADER_EXPORT int __QAIC_HEADER(apps_std_fileExists)(const char* path, boolean* exists) __QAIC_HEADER_ATTRIBUTE{
823*418b791dSBob Badour int nErr = AEE_SUCCESS;
824*418b791dSBob Badour struct stat buffer;
825*418b791dSBob Badour
826*418b791dSBob Badour VERIFYC(path != NULL, AEE_EMEMPTR);
827*418b791dSBob Badour VERIFYC(exists != NULL, AEE_EMEMPTR);
828*418b791dSBob Badour
829*418b791dSBob Badour *exists = (stat (path, &buffer) == 0);
830*418b791dSBob Badour
831*418b791dSBob Badour bail:
832*418b791dSBob Badour if (nErr != AEE_SUCCESS) {
833*418b791dSBob Badour VERIFY_EPRINTF("Error %x: fileExists failed for path %s\n", nErr, path);
834*418b791dSBob Badour }
835*418b791dSBob Badour return nErr;
836*418b791dSBob Badour }
837*418b791dSBob Badour
__QAIC_IMPL(apps_std_fsync)838*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fsync)(apps_std_FILE sin) __QAIC_IMPL_ATTRIBUTE {
839*418b791dSBob Badour int nErr = AEE_SUCCESS;
840*418b791dSBob Badour struct apps_std_info* sinfo = 0;
841*418b791dSBob Badour
842*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
843*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
844*418b791dSBob Badour // This flushes the given sin file stream to user-space buffer.
845*418b791dSBob Badour // NOTE: this does NOT ensure data is physically sotred on disk
846*418b791dSBob Badour nErr = fflush(sinfo->u.stream);
847*418b791dSBob Badour if(nErr != AEE_SUCCESS){
848*418b791dSBob Badour VERIFY_EPRINTF("Error %x: apps_std fsync failed,errno is %s\n", nErr, strerror(ERRNO));
849*418b791dSBob Badour }
850*418b791dSBob Badour } else {
851*418b791dSBob Badour nErr = AEE_EUNSUPPORTED;
852*418b791dSBob Badour }
853*418b791dSBob Badour
854*418b791dSBob Badour bail:
855*418b791dSBob Badour return nErr;
856*418b791dSBob Badour }
857*418b791dSBob Badour
__QAIC_IMPL(apps_std_fremove)858*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fremove)(const char* name) __QAIC_IMPL_ATTRIBUTE {
859*418b791dSBob Badour int nErr = AEE_SUCCESS;
860*418b791dSBob Badour
861*418b791dSBob Badour if(NULL == name){
862*418b791dSBob Badour return nErr;
863*418b791dSBob Badour }
864*418b791dSBob Badour nErr = remove(name);
865*418b791dSBob Badour if(nErr != AEE_SUCCESS){
866*418b791dSBob Badour VERIFY_EPRINTF("Error %x: failed to remove file %s,errno is %s\n", nErr, name, strerror(ERRNO));
867*418b791dSBob Badour }
868*418b791dSBob Badour
869*418b791dSBob Badour return nErr;
870*418b791dSBob Badour }
871*418b791dSBob Badour
decrypt_int(char * fbuf,int size)872*418b791dSBob Badour static int decrypt_int(char* fbuf, int size) {
873*418b791dSBob Badour int nErr = 0, fd;
874*418b791dSBob Badour void* handle = 0;
875*418b791dSBob Badour int32_t (*l_init)(void);
876*418b791dSBob Badour int32_t (*l_deinit)(void);
877*418b791dSBob Badour int32_t (*l_decrypt)(int32_t, int32_t);
878*418b791dSBob Badour
879*418b791dSBob Badour VERIFYC(NULL != (handle = dlopen("liblmclient.so", RTLD_NOW)), AEE_EBADHANDLE);
880*418b791dSBob Badour VERIFYC(NULL != (l_init = dlsym(handle, "license_manager_init")), AEE_ENOSUCHSYMBOL);
881*418b791dSBob Badour VERIFYC(NULL != (l_deinit = dlsym(handle, "license_manager_deinit")), AEE_ENOSUCHSYMBOL);
882*418b791dSBob Badour VERIFYC(NULL != (l_decrypt = dlsym(handle, "license_manager_decrypt")), AEE_ENOSUCHSYMBOL);
883*418b791dSBob Badour VERIFY(0 == (nErr = l_init()));
884*418b791dSBob Badour VERIFY(-1 != (fd = rpcmem_to_fd_internal(fbuf)));
885*418b791dSBob Badour VERIFY(0 == (nErr = l_decrypt(fd, size)));
886*418b791dSBob Badour VERIFY(0 == (nErr = l_deinit()));
887*418b791dSBob Badour bail:
888*418b791dSBob Badour if(nErr) {
889*418b791dSBob Badour VERIFY_EPRINTF("Error %x: dlopen for licmgr failed. errno: %s\n", nErr, dlerror());
890*418b791dSBob Badour }
891*418b791dSBob Badour if(handle) {
892*418b791dSBob Badour dlclose(handle);
893*418b791dSBob Badour }
894*418b791dSBob Badour return nErr;
895*418b791dSBob Badour }
896*418b791dSBob Badour
__QAIC_IMPL(apps_std_fdopen_decrypt)897*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_fdopen_decrypt)(apps_std_FILE sin, apps_std_FILE *psout) __QAIC_IMPL_ATTRIBUTE {
898*418b791dSBob Badour int fd, nErr = AEE_SUCCESS;
899*418b791dSBob Badour struct stat st_buf;
900*418b791dSBob Badour struct apps_std_info* sinfo = 0;
901*418b791dSBob Badour int sz, pos;
902*418b791dSBob Badour char* fbuf = 0;
903*418b791dSBob Badour
904*418b791dSBob Badour VERIFY(0 == (nErr = apps_std_FILE_get(sin, &sinfo)));
905*418b791dSBob Badour if(sinfo->type == APPS_STD_STREAM_FILE) {
906*418b791dSBob Badour pos = ftell(sinfo->u.stream);
907*418b791dSBob Badour VERIFYC(-1 != (fd = fileno(sinfo->u.stream)), AEE_EFLEN);
908*418b791dSBob Badour VERIFYC(0 == fstat(fd, &st_buf), AEE_EFLEN);
909*418b791dSBob Badour sz = (int)st_buf.st_size;
910*418b791dSBob Badour VERIFYC(0 != (fbuf = rpcmem_alloc_internal(ION_HEAP_ID_QSEECOM, 1, sz)), AEE_EMEMPTR);
911*418b791dSBob Badour VERIFYC(0 == fseek(sinfo->u.stream, 0, SEEK_SET), AEE_EFSEEK);
912*418b791dSBob Badour VERIFYC(sz == (int)fread(fbuf, 1, sz, sinfo->u.stream), AEE_EFREAD);
913*418b791dSBob Badour VERIFY(0 == (nErr = decrypt_int(fbuf, sz)));
914*418b791dSBob Badour apps_std_FILE_set_buffer_stream(sinfo, fbuf, sz, pos);
915*418b791dSBob Badour *psout = sin;
916*418b791dSBob Badour } else {
917*418b791dSBob Badour nErr = AEE_EUNSUPPORTED;
918*418b791dSBob Badour }
919*418b791dSBob Badour bail:
920*418b791dSBob Badour if(nErr) {
921*418b791dSBob Badour if(fbuf) {
922*418b791dSBob Badour rpcmem_free_internal(fbuf);
923*418b791dSBob Badour fbuf = NULL;
924*418b791dSBob Badour }
925*418b791dSBob Badour }
926*418b791dSBob Badour return nErr;
927*418b791dSBob Badour }
928*418b791dSBob Badour
929*418b791dSBob Badour
__QAIC_HEADER(apps_std_opendir)930*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_HEADER(apps_std_opendir)(const char* name, apps_std_DIR* dir) __QAIC_IMPL_ATTRIBUTE {
931*418b791dSBob Badour int nErr = 0;
932*418b791dSBob Badour DIR *odir;
933*418b791dSBob Badour
934*418b791dSBob Badour if(NULL == dir) {
935*418b791dSBob Badour return AEE_EBADPARM;
936*418b791dSBob Badour }
937*418b791dSBob Badour odir = opendir(name);
938*418b791dSBob Badour if(odir != NULL) {
939*418b791dSBob Badour dir->handle = (uint64)odir;
940*418b791dSBob Badour } else {
941*418b791dSBob Badour nErr = -1;
942*418b791dSBob Badour VERIFY_EPRINTF("Error %x: failed to opendir %s,errno is %s\n", nErr, name, strerror(ERRNO));
943*418b791dSBob Badour }
944*418b791dSBob Badour return nErr;
945*418b791dSBob Badour }
946*418b791dSBob Badour
__QAIC_HEADER(apps_std_closedir)947*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_HEADER(apps_std_closedir)(const apps_std_DIR* dir) __QAIC_IMPL_ATTRIBUTE {
948*418b791dSBob Badour int nErr = AEE_SUCCESS;
949*418b791dSBob Badour
950*418b791dSBob Badour if((NULL == dir) || (0 == dir->handle)){
951*418b791dSBob Badour return AEE_EBADPARM;
952*418b791dSBob Badour }
953*418b791dSBob Badour nErr = closedir((DIR *)dir->handle);
954*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
955*418b791dSBob Badour VERIFY_EPRINTF("Error %x: failed to closedir, errno is %s\n", nErr, strerror(ERRNO));
956*418b791dSBob Badour }
957*418b791dSBob Badour
958*418b791dSBob Badour return nErr;
959*418b791dSBob Badour }
960*418b791dSBob Badour
__QAIC_HEADER(apps_std_readdir)961*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_HEADER(apps_std_readdir)(const apps_std_DIR* dir, apps_std_DIRENT* dirent, int *bEOF) __QAIC_IMPL_ATTRIBUTE {
962*418b791dSBob Badour int nErr = AEE_SUCCESS;
963*418b791dSBob Badour struct dirent *odirent;
964*418b791dSBob Badour
965*418b791dSBob Badour if((NULL == dir) || (0 == dir->handle)){
966*418b791dSBob Badour return AEE_EBADPARM;
967*418b791dSBob Badour }
968*418b791dSBob Badour *bEOF = 0;
969*418b791dSBob Badour errno = 0;
970*418b791dSBob Badour odirent = readdir((DIR *)dir->handle);
971*418b791dSBob Badour if(odirent != NULL) {
972*418b791dSBob Badour dirent->ino = (int)odirent->d_ino;
973*418b791dSBob Badour std_strlcpy(dirent->name, odirent->d_name, sizeof(dirent->name));
974*418b791dSBob Badour } else {
975*418b791dSBob Badour if(errno == 0) {
976*418b791dSBob Badour *bEOF = 1;
977*418b791dSBob Badour } else {
978*418b791dSBob Badour nErr = -1;
979*418b791dSBob Badour }
980*418b791dSBob Badour }
981*418b791dSBob Badour
982*418b791dSBob Badour return nErr;
983*418b791dSBob Badour }
984*418b791dSBob Badour
__QAIC_HEADER(apps_std_mkdir)985*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_HEADER(apps_std_mkdir)(const char* name, int mode) __QAIC_IMPL_ATTRIBUTE {
986*418b791dSBob Badour int nErr = AEE_SUCCESS;
987*418b791dSBob Badour
988*418b791dSBob Badour if(NULL == name){
989*418b791dSBob Badour return nErr;
990*418b791dSBob Badour }
991*418b791dSBob Badour nErr = mkdir(name, mode);
992*418b791dSBob Badour if(nErr != AEE_SUCCESS){
993*418b791dSBob Badour VERIFY_EPRINTF("Error %x: failed to mkdir %s,errno is %s\n", nErr, name, strerror(ERRNO));
994*418b791dSBob Badour }
995*418b791dSBob Badour
996*418b791dSBob Badour return nErr;
997*418b791dSBob Badour }
998*418b791dSBob Badour
__QAIC_HEADER(apps_std_rmdir)999*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_HEADER(apps_std_rmdir)(const char* name) __QAIC_IMPL_ATTRIBUTE {
1000*418b791dSBob Badour int nErr = AEE_SUCCESS;
1001*418b791dSBob Badour
1002*418b791dSBob Badour if(NULL == name){
1003*418b791dSBob Badour return nErr;
1004*418b791dSBob Badour }
1005*418b791dSBob Badour nErr = rmdir(name);
1006*418b791dSBob Badour if(nErr != AEE_SUCCESS){
1007*418b791dSBob Badour VERIFY_EPRINTF("Error %x: failed to rmdir %s,errno is %s\n", nErr, name, strerror(ERRNO));
1008*418b791dSBob Badour }
1009*418b791dSBob Badour
1010*418b791dSBob Badour return nErr;
1011*418b791dSBob Badour }
1012*418b791dSBob Badour
__QAIC_HEADER(apps_std_stat)1013*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_HEADER(apps_std_stat)(const char* name, apps_std_STAT* ist) __QAIC_IMPL_ATTRIBUTE {
1014*418b791dSBob Badour int nErr = AEE_SUCCESS, nOpenErr = AEE_SUCCESS, fd = -1;
1015*418b791dSBob Badour apps_std_FILE ps;
1016*418b791dSBob Badour struct apps_std_info* sinfo = 0;
1017*418b791dSBob Badour struct stat st;
1018*418b791dSBob Badour
1019*418b791dSBob Badour if((NULL == name) || (NULL == ist)) {
1020*418b791dSBob Badour return AEE_EBADPARM;
1021*418b791dSBob Badour }
1022*418b791dSBob Badour VERIFYC(0 == (nOpenErr = apps_std_fopen_with_env("ADSP_LIBRARY_PATH", ";", name, "r", &ps)), AEE_EFOPEN);
1023*418b791dSBob Badour VERIFYC(0 == (nErr = apps_std_FILE_get(ps, &sinfo)), AEE_EBADFD);
1024*418b791dSBob Badour VERIFYC(-1 != (fd = fileno(sinfo->u.stream)), AEE_EBADFD);
1025*418b791dSBob Badour VERIFYC(0 == fstat(fd, &st), AEE_EBADFD);
1026*418b791dSBob Badour ist->dev = st.st_dev;
1027*418b791dSBob Badour ist->ino = st.st_ino;
1028*418b791dSBob Badour ist->mode = st.st_mode;
1029*418b791dSBob Badour ist->nlink = st.st_nlink;
1030*418b791dSBob Badour ist->rdev = st.st_rdev;
1031*418b791dSBob Badour ist->size = st.st_size;
1032*418b791dSBob Badour ist->atime = (int64)st.st_atim.tv_sec;
1033*418b791dSBob Badour ist->atimensec = (int64)st.st_atim.tv_nsec;
1034*418b791dSBob Badour ist->mtime = (int64)st.st_mtim.tv_sec;
1035*418b791dSBob Badour ist->mtimensec =(int64)st.st_mtim.tv_nsec;
1036*418b791dSBob Badour ist->ctime = (int64)st.st_ctim.tv_nsec;
1037*418b791dSBob Badour ist->ctimensec = (int64)st.st_ctim.tv_nsec;
1038*418b791dSBob Badour bail:
1039*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
1040*418b791dSBob Badour VERIFY_EPRINTF("Error %x: failed to stat %s, file open returned %x, errno is %s\n", nErr, name, nOpenErr, strerror(ERRNO));
1041*418b791dSBob Badour }
1042*418b791dSBob Badour if (nOpenErr == AEE_SUCCESS) {
1043*418b791dSBob Badour apps_std_fclose(ps);
1044*418b791dSBob Badour sinfo = 0;
1045*418b791dSBob Badour }
1046*418b791dSBob Badour if(sinfo) {
1047*418b791dSBob Badour apps_std_FILE_free(sinfo);
1048*418b791dSBob Badour }
1049*418b791dSBob Badour return nErr;
1050*418b791dSBob Badour }
1051*418b791dSBob Badour
__QAIC_HEADER(apps_std_ftrunc)1052*418b791dSBob Badour __QAIC_HEADER_EXPORT int __QAIC_HEADER(apps_std_ftrunc)(apps_std_FILE sin, int offset) __QAIC_HEADER_ATTRIBUTE {
1053*418b791dSBob Badour int nErr = 0, fd = -1;
1054*418b791dSBob Badour struct apps_std_info* sinfo = 0;
1055*418b791dSBob Badour
1056*418b791dSBob Badour VERIFYC(0 == (nErr = apps_std_FILE_get(sin, &sinfo)), AEE_EBADFD);
1057*418b791dSBob Badour VERIFYC(-1 != (fd = fileno(sinfo->u.stream)), AEE_EBADFD);
1058*418b791dSBob Badour
1059*418b791dSBob Badour if(0 != ftruncate(fd, offset)) {
1060*418b791dSBob Badour return ERRNO;
1061*418b791dSBob Badour }
1062*418b791dSBob Badour bail:
1063*418b791dSBob Badour return nErr;
1064*418b791dSBob Badour }
1065*418b791dSBob Badour
__QAIC_IMPL(apps_std_frename)1066*418b791dSBob Badour __QAIC_IMPL_EXPORT int __QAIC_IMPL(apps_std_frename)(const char* oldname, const char* newname) __QAIC_IMPL_ATTRIBUTE {
1067*418b791dSBob Badour int nErr = AEE_SUCCESS;
1068*418b791dSBob Badour
1069*418b791dSBob Badour VERIFYC(NULL != oldname && NULL != newname, AEE_EBADPARM);
1070*418b791dSBob Badour nErr = rename(oldname, newname);
1071*418b791dSBob Badour bail:
1072*418b791dSBob Badour if(nErr != AEE_SUCCESS) {
1073*418b791dSBob Badour VERIFY_EPRINTF("Error %x: failed to rename file, errno is %s\n", nErr, strerror(ERRNO));
1074*418b791dSBob Badour }
1075*418b791dSBob Badour return nErr;
1076*418b791dSBob Badour }
1077