- add llist_free_one() and llist_free() to libbb; Add a bit of documentation. - change llist_add_to_end as proposed by vodz in http://busybox.net/lists/busybox/2005-September/016411.html - remove unneeded includes, add short boilerplate and copyright to llist.c - move COMM_LEN from find_pid_by_name
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -131,6 +131,7 @@ extern int get_console_fd(void); | |
| extern struct mntent *find_mount_point(const char *name, const char *table); | |
| extern void erase_mtab(const char * name); | |
| extern long *find_pid_by_name( const char* pidName); | |
| + | extern long *pidlist_reverse(long *pidList); |
| extern char *find_block_device(char *path); | |
| extern char *bb_get_line_from_file(FILE *file); | |
| extern char *bb_get_chomped_line_from_file(FILE *file); | |
| @@ -431,6 +432,15 @@ extern ssize_t bb_xread(int fd, void *buf, size_t count); | |
| extern void bb_xread_all(int fd, void *buf, size_t count); | |
| extern unsigned char bb_xread_char(int fd); | |
| + | #ifndef COMM_LEN |
| + | /*#include <sched.h> *//* Task command name length */ |
| + | #ifdef TASK_COMM_LEN |
| + | #define COMM_LEN TASK_COMM_LEN |
| + | #else |
| + | #define COMM_LEN 16 /* synchronize with size of comm in struct task_struct |
| + | in /usr/include/linux/sched.h */ |
| + | #endif |
| + | #endif |
| typedef struct { | |
| int pid; | |
| char user[9]; | |
| @@ -446,7 +456,7 @@ typedef struct { | |
| /* basename of executable file in call to exec(2), | |
| size from kernel headers */ | |
| - | char short_cmd[16]; |
| + | char short_cmd[COMM_LEN]; |
| } procps_status_t; | |
| extern procps_status_t * procps_scan(int save_user_arg0); | |
| @@ -460,6 +470,8 @@ typedef struct llist_s { | |
| } llist_t; | |
| extern llist_t *llist_add_to(llist_t *old_head, char *new_item); | |
| extern llist_t *llist_add_to_end(llist_t *list_head, char *data); | |
| + | extern llist_t *llist_free_one(llist_t *elm); |
| + | extern void llist_free(llist_t *elm); |
| extern void print_login_issue(const char *issue_file, const char *tty); | |
| extern void print_login_prompt(void); | |
| @@ -4,19 +4,7 @@ | |
| * | |
| * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> | |
| * | |
| - | * This program is free software; you can redistribute it and/or modify |
| - | * it under the terms of the GNU General Public License as published by |
| - | * the Free Software Foundation; either version 2 of the License, or |
| - | * (at your option) any later version. |
| - | * |
| - | * This program is distributed in the hope that it will be useful, |
| - | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| - | * General Public License for more details. |
| - | * |
| - | * You should have received a copy of the GNU General Public License |
| - | * along with this program; if not, write to the Free Software |
| - | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| + | * Licensed under the GPL v2, see the file LICENSE in this tarball. |
| */ | |
| #include <stdio.h> | |
| @@ -25,10 +13,6 @@ | |
| #include <stdlib.h> | |
| #include "libbb.h" | |
| - | #define COMM_LEN 16 /* synchronize with size of comm in struct task_struct |
| - | in /usr/include/linux/sched.h */ |
| - | |
| - | |
| /* find_pid_by_name() | |
| * | |
| * Modified by Vladimir Oleynik for use with libbb/procps.c | |
| @@ -37,6 +21,7 @@ | |
| * the proc filesystem. | |
| * | |
| * Returns a list of all matching PIDs | |
| + | * It is the caller's duty to free the returned pidlist. |
| */ | |
| extern long* find_pid_by_name( const char* pidName) | |
| { | |
| @@ -45,7 +30,7 @@ extern long* find_pid_by_name( const char* pidName) | |
| procps_status_t * p; | |
| pidList = xmalloc(sizeof(long)); | |
| - | while ((p = procps_scan(0)) != 0) |
| + | while ((p = procps_scan(0)) != 0) |
| { | |
| if (strncmp(p->short_cmd, pidName, COMM_LEN-1) == 0) { | |
| pidList=xrealloc( pidList, sizeof(long) * (i+2)); | |
| @@ -57,6 +42,22 @@ extern long* find_pid_by_name( const char* pidName) | |
| return pidList; | |
| } | |
| + | extern long *pidlist_reverse(long *pidList) |
| + | { |
| + | int i=0; |
| + | while (pidList[i] > 0 && i++); |
| + | if ( i-- > 0) { |
| + | long k; |
| + | int j; |
| + | for (j = 0; i > j; i--, j++) { |
| + | k = pidList[i]; |
| + | pidList[i] = pidList[j]; |
| + | pidList[j] = k; |
| + | } |
| + | } |
| + | return pidList; |
| + | } |
| + | |
| /* END CODE */ | |
| /* | |
| Local Variables: | |
| @@ -1,9 +1,18 @@ | |
| + | /* vi: set sw=4 ts=4: */ |
| + | /* |
| + | * linked list helper functions. |
| + | * |
| + | * Copyright (C) 2003 Glenn McGrath |
| + | * Copyright (C) 2005 Vladimir Oleynik |
| + | * Copyright (C) 2005 Bernhard Fischer |
| + | * |
| + | * Licensed under the GPL v2, see the file LICENSE in this tarball. |
| + | */ |
| #include <stdlib.h> | |
| - | #include <string.h> |
| - | #include "unarchive.h" |
| #include "libbb.h" | |
| #ifdef L_llist_add_to | |
| + | /* Add data to the start of the linked list. */ |
| extern llist_t *llist_add_to(llist_t *old_head, char *new_item) | |
| { | |
| llist_t *new_head; | |
| @@ -17,27 +26,46 @@ extern llist_t *llist_add_to(llist_t *old_head, char *new_item) | |
| #endif | |
| #ifdef L_llist_add_to_end | |
| + | /* Add data to the end of the linked list. */ |
| extern llist_t *llist_add_to_end(llist_t *list_head, char *data) | |
| { | |
| - | llist_t *new_item, *tmp, *prev; |
| + | llist_t *new_item; |
| new_item = xmalloc(sizeof(llist_t)); | |
| new_item->data = data; | |
| new_item->link = NULL; | |
| - | prev = NULL; |
| - | tmp = list_head; |
| - | while (tmp) { |
| - | prev = tmp; |
| - | tmp = tmp->link; |
| - | } |
| - | if (prev) { |
| - | prev->link = new_item; |
| - | } else { |
| + | if (list_head == NULL) { |
| list_head = new_item; | |
| + | } else { |
| + | llist_t *tail = list_head; |
| + | while (tail->link) |
| + | tail = tail->link; |
| + | tail->link = new_item; |
| } | |
| + | return list_head; |
| + | } |
| + | #endif |
| - | return (list_head); |
| + | #ifdef L_llist_free_one |
| + | /* Free the current list element and advance to the next entry in the list. |
| + | * Returns a pointer to the next element. */ |
| + | extern llist_t *llist_free_one(llist_t *elm) |
| + | { |
| + | llist_t *next = elm ? elm->link : NULL; |
| + | #if ENABLE_DMALLOC /* avoid warnings from dmalloc's error-free-null option */ |
| + | if (elm) |
| + | #endif |
| + | free(elm); |
| + | elm = next; |
| + | return elm; |
| } | |
| #endif | |
| + | #ifdef L_llist_free |
| + | /* Recursively free all elements in the linked list. */ |
| + | extern void llist_free(llist_t *elm) |
| + | { |
| + | while ((elm = llist_free_one(elm))); |
| + | } |
| + | #endif |