1 /************************************************************************** 2 * 3 * Copyright 2015 Advanced Micro Devices, Inc. 4 * Copyright 2008 VMware, Inc. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * on the rights to use, copy, modify, merge, publish, distribute, sub 11 * license, and/or sell copies of the Software, and to permit persons to whom 12 * the Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the next 15 * paragraph) shall be included in all copies or substantial portions of the 16 * Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 21 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 24 * USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #ifndef DD_UTIL_H 29 #define DD_UTIL_H 30 31 #include <stdio.h> 32 #include <errno.h> 33 #include <unistd.h> 34 #include <sys/stat.h> 35 36 #include "c99_alloca.h" 37 #include "os/os_process.h" 38 #include "util/u_debug.h" 39 40 /* name of the directory in home */ 41 #define DD_DIR "ddebug_dumps" 42 43 static inline FILE * 44 dd_get_debug_file(bool verbose) 45 { 46 static unsigned index; 47 char proc_name[128], dir[256], name[512]; 48 FILE *f; 49 50 if (!os_get_process_name(proc_name, sizeof(proc_name))) { 51 fprintf(stderr, "dd: can't get the process name\n"); 52 return NULL; 53 } 54 55 snprintf(dir, sizeof(dir), "%s/"DD_DIR, debug_get_option("HOME", ".")); 56 57 if (mkdir(dir, 0774) && errno != EEXIST) { 58 fprintf(stderr, "dd: can't create a directory (%i)\n", errno); 59 return NULL; 60 } 61 62 snprintf(name, sizeof(name), "%s/%s_%u_%08u", dir, proc_name, getpid(), index++); 63 f = fopen(name, "w"); 64 if (!f) { 65 fprintf(stderr, "dd: can't open file %s\n", name); 66 return NULL; 67 } 68 69 if (verbose) 70 fprintf(stderr, "dd: dumping to file %s\n", name); 71 72 return f; 73 } 74 75 static inline void 76 dd_parse_apitrace_marker(const char *string, int len, unsigned *call_number) 77 { 78 unsigned num; 79 char *s; 80 81 if (len <= 0) 82 return; 83 84 /* Make it zero-terminated. */ 85 s = alloca(len + 1); 86 memcpy(s, string, len); 87 s[len] = 0; 88 89 /* Parse the number. */ 90 errno = 0; 91 num = strtol(s, NULL, 10); 92 if (errno) 93 return; 94 95 *call_number = num; 96 } 97 98 #endif /* DD_UTIL_H */ 99